[Python-es] insecure string pickle

Jose Caballero jcaballero.hep en gmail.com
Jue Abr 3 01:39:15 CEST 2008


Hola Pepe,
muchas gracias por perder tu tiempo con este asuntillo.
[comentarios en el texto]


El día 2/04/08, Pepe Aracil <pepe en diselpro.com> escribió:
>
> Hola.
>
> Has mirado la cadena que devuelve sys.argv[1] para ver donde se
> ha "corrompido" el mega-argumento? me parece que tendrás que
> "escapar" algún que otro caracter.



Tiene toda la pinta. La cuestión ahora es averiguar cual, pues no tengo
claro que el módulo pickle entienda los "caracteres escape-ados" igual que
hace la shell. Requiere un poco de estudio por mi parte.


En vez de pasar todo ese tocho como argumento en la linea de comandos,
> es preferible que lo pases por la entrada estandar del segundo programa.


Lo puedo probar. ¿Te refieres a usar algo tipo popen2 o similar?






Saludos.
>
>
>
> Jose Caballero escribió:
>
> > Hola a todos,
> > esta es la primera vez que hago una pregunta en esta lista. Agradezco
> por
> > adelantado vuestra atención y paciencia, y muchas gracias por la ayuda
> que
> > podáis ofrecerme.
> >
> >
> > Estoy intentando serializar un objeto mediante pickle.dumps() y pasar el
> > resultado como argumento a otro programa que ejecuto con
> > commands.getstatusoutput(  )
> > Paso el objeto serializado como argumento porque estoy intentado evitar,
> en
> > la medida de lo posible, hacerlo a través de un fichero intermedio.
> > La secuencia viene a ser como sigue:
> >
> > line = pickle.dumps( object )
> > line = ' '.join(line.split('\n'))
> > line = '"%s"' % line
> > st, out = commands.getstatusoutput('./prog2.py %s' % line )
> >
> >
> > Las líneas segunda y tercera del ejemplo son para convertir el resultado
> de
> > dumps() en una única cadena, y que esté contenida entre dobles comillas
> para
> > evitar problemas con la shell.
> > El segundo programa deshace estos cambios, de la siguiente manera:
> >
> >
> > line=sys.argv[1]
> > line='\n'.join(line.split())
> > o=pickle.loads(line)
> >
> >
> > Lo he intentado con un objeto de una clase bastante simple, y funciona
> > perfectamente. Esto significa que la secuencia de pasos en ambos
> programas
> > es correcta.
> > Pero cuando lo intento con un objeto de una clase un poco más compleja
> > obtengo el siguiente mensaje de error:
> >
> > Traceback (most recent call last):
> >   File "./prog2b.py", line 10, in ?
> >     o=pickle.loads(line)
> >   File "/usr/lib/python2.2/pickle.py", line 986, in loads
> >     return Unpickler(file).load()
> >   File "/usr/lib/python2.2/pickle.py", line 597, in load
> >     dispatch[key](self)
> >   File "/usr/lib/python2.2/pickle.py", line 667, in load_string
> >     raise ValueError, "insecure string pickle"
> > ValueError: insecure string pickle
> >
> >
> > Creo que puede ser porque el resultado del método dumps no es todo lo
> bueno
> > que debería. Este es, por cierto, dicho valor (antes de procesarlo):
> >
> > ccopy_reg
> > _reconstructor
> > p0
> > (cmyproxyUtils
> > MyProxyInterface
> > p1
> > c__builtin__
> > object
> > p2
> > Ntp3
> > R(dp4
> > S'_MyProxyInterface__userDN'
> > p5
> > S'/DC=org/DC=doegrids/OU=People/CN=Jose\
> > Caballero\
> > 832651'
> > p6
> > sS'_MyProxyInterface__vomsattributes'
> > p7
> > S''
> > p8
> > sS'_MyProxyInterface__servername'
> > p9
> > S'myproxy.fnal.gov'
> > p10
> > sS'_MyProxyInterface__pilotownerDN'
> > p11
> > g8
> > sS'_MyProxyInterface__myproxylogon_refdate'
> > p12
> > I1181620800
> > sS'_MyProxyInterface__proxypath'
> > p13
> > S'/tmp/ESTO_ES_UNA_PRUEBA'
> > p14
> > sS'_MyProxyInterface__pilotproxypath'
> > p15
> > S'/tmp/x509up_u10139'
> > p16
> > sS'_MyProxyInterface__command'
> > p17
> > g8
> > sS'_MyProxyInterface__myproxyinit_refdate'
> > p18
> > I1181620800
> > sbp19
> > .
> >
> >
> >
> > Y éste es el resutado tras el procesamiento, y que paso como argumento
> al
> > segundo programa:
> >
> > "ccopy_reg _reconstructor p0 (cmyproxyUtils MyProxyInterface p1
> c__builtin__
> > object p2 Ntp3 R(dp4 S'_MyProxyInterface__userDN' p5
> > S'/DC=org/DC=doegrids/OU=People/CN=Jose\\ Caballero\\ 832651' p6
> > sS'_MyProxyInterface__vomsattributes' p7 S'' p8
> > sS'_MyProxyInterface__servername' p9 S'myproxy.fnal.gov' p10
> > sS'_MyProxyInterface__pilotownerDN' p11 g8
> > sS'_MyProxyInterface__myproxylogon_refdate' p12 I1181620800
> > sS'_MyProxyInterface__proxypath' p13 S'/tmp/ESTO_ES_UNA_PRUEBA' p14
> > sS'_MyProxyInterface__pilotproxypath' p15 S'/tmp/x509up_u10139' p16
> > sS'_MyProxyInterface__command' p17 g8
> > sS'_MyProxyInterface__myproxyinit_refdate' p18 I1181620800 sbp19 ."
> >
> >
> > ¿Ven alguna cadena que pueda estar corrompida y que no sea válida para
> el
> > método loads()?
> > Nota, si lo hago usando un fichero intermedio, mediante los métodos
> dump() y
> > load(), todo funciona perfectamente.
> >
> > Muchas gracias.
> > Toda ayuda que puedan ofrecerme será más que bien venida.
> >
> >
> > Saludos
> > Jose
>
> > _______________________________________________
> > Lista de correo Python-es
> > http://listas.aditel.org/listinfo/python-es
> > FAQ: http://listas.aditel.org/faqpyes
> >
>
> _______________________________________________
> Lista de correo Python-es
> http://listas.aditel.org/listinfo/python-es
> FAQ: http://listas.aditel.org/faqpyes
>


Más información sobre la lista de distribución Python-es