[pyar] Peligrosidad de un lambda

Alejandro Santos listas en alejolp.com
Sab Oct 2 14:12:31 ART 2010


2010/10/2 Esteban Kuber <ekuber en gmail.com>:
>
> Conocen el juego Wac-a-Mole? A eso es a lo que me refería con
> _relativamente_. Podés hacerlo seguro, siempre y cuando seas lo
> suficientemente previsor (eval(string, {'__import__': None,
> '__builtins__': None, etc.}, {})).
>
>> Seria muy interesante tener alguna version con "Sandbox" de Python,
>> parecida a la que hace andar las apps de Google App Engine.
>
> Es una idea interesante, y habría que ver si mirando al SDK no ayuda.
> Yo por lo pronto, si alguien intenta iniciar un proyecto relevante,
> por más que me encantaría no puedo ayudar.
>
> Pienso que sería espectacular una página en la wiki con una reseta de
> eval seguro, ya que serviría para el 85% de los casos.
>

Ahora que lo pienso mejor, no estoy tan de acuerdo con que eval()
pueda ser seguro. La mejor opcion que se me ocurre es hacerlo a nivel
system-call del SO, o usar Jython como dice en la pagina de la Wiki.

Hay más formas de pasar por arriba las limitaciones de los espacios de
nombre de eval.

En general, los argumentos de eval() solamente modifican el espacio de
nombres global/local, pero consiguir una referencia a una funcion
insegura no es imposible, solo hace falta conseguir una referencia a
otro objeto que referencie a la funcion no segura:

>>> eval("""[x for x in (1).__class__.__bases__[0].__subclasses__() if x.__name__=='file'][0]("/proc/version").read()""", {'__import__': None, '__builtins__': None, }, {})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1, in <module>
IOError: file() constructor not accessible in restricted mode

Ese error es un if dentro del constructor[0] de file() que verifica
que __builtins__ no sea None. Pero en Python 3 ese if ya no está más
[1]. Otras cosa que se puede conseguir es:

>>> eval("""[x for x in (1).__class__.__bases__[0].__subclasses__() if x.__name__=='zipimporter']""", {'__import__': None, '__builtins__': None, }, {})
[<type 'zipimport.zipimporter'>]

indicando una ruta a algun egg que exponga una referencia a os o
__import__ (por ejemplo alguna variacion de demandimport del modulo
email o mercurial) alcanza para importar modulos no seguros.

Saludos,

[0] http://svn.python.org/view/python/trunk/Objects/fileobject.c?revision=81275&view=markup
[1] http://docs.python.org/py3k/whatsnew/3.0.html#build-and-c-api-changes

-- 
Alejandro Santos
http://alejolp.com.ar



More information about the pyar mailing list