[Python-es] exec seguro

Oswaldo Hernández listas en soft-com.es
Lun Mayo 10 19:20:56 CEST 2010


Hernan Foffani escribió:
> El 07/05/2010, a las 21:27, Oswaldo Hernández escribió:
> 
>> Reynaldo Baquerizo escribió:
>>>    En definitiva, ¿Qué es lo que quieres evitar? Hay cosas muy dañinas
>>>    que un usuario tontorrón puede hacer y que son muy difíciles de
>>>    detener ("while 1: pass")
>>> algunas ideas puedes sacar de esta receta
>>> http://code.activestate.com/recipes/496746-restricted-safe-eval/
>> La he estado viendo y creo que puedo sacar cosas muy interesantes, el exec lo realiza en un thread para controlar el timeout, y me llama la atencion especialmente el uso que hace de los módulos 'inspect' y 'compiler' para analizar el codigo a ejecutar.
>>
>> Python no deja de sorprenderme :)
> 
> Lee los comentarios; verás que hay varias situaciones que no están contempladas. 
> 
> Mientras el entorno restringido no sea oficial, es decir, que está bien integrado al intérprete y bendecido por GvR y amigos tendrás unos cuantos agujeros y lo que es peor, una falsa sensación de seguridad.
> 
> Dicho de otro modo, conmigo o van todos desarmados o portando armas de fuego. En este último caso, yo me quedo a kilómetros de distancia. El arco y flecha da muchos dolores de cabeza: pierdes un montón de tiempo enseñando a los usuarios a usarlo, se quejan de que no les sirve para cazar rinocerontes y hagas lo hagas terminas recibiendo una flecha en el culo.
> 
> 

Hola,

Despues de trabajar un poco en esto, he sacado las siguientes conclusiones:

- El problema de los bucles infinitos se soluciona con la ejecución en 
un thread con un timeout. En las pruebas realizadas ha funcionado.

- Los problemas de las operaciones matemáticas complejas, como indican 
en los comentarios, y un crash por consumo excesivo de memoria, tienen 
mala solución. Pueden colgar, o aparentar que se cuelga la aplicación. 
Con este tendré que convivir y generar logs para detectar el problema a 
posteriori.

- Sobre el entorno seguro, la verdad es que de seguro no tiene mucho, 
puedes modificar atributos de clase, etc. Pero por lo que he estado 
investigando y probando todo se hace accediendo a las propiedades 
__class__, __file__, etc. de los objetos que se le pasan al entorno. 
Segun esto se puede analizar fácilmente el código antes de ejecutar e 
impedir la ejecución si contiene '__'.


En cuanto a los minilenguajes fué mi primera intención, pero no 
encontré, o no supe buscar, nada que me satisfaciera.

Aunque siempre hablo de "usuario" realmente son personas confiables, es 
una aplicación de escritorio por lo que tampoco hay un acceso 
generalizado, pero siempre puede aparecer in listillo.

Creo que con lo mencionado obtengo un entorno fácil de implementar  y 
razonablemente seguro.

Saludos,

-- 
Oswaldo Hernández



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