[Python-es] exec seguro

Hernan M Foffani hfoffani en gmail.com
Vie Mayo 7 20:03:07 CEST 2010


2010/5/7 Oswaldo Hernández <listas en soft-com.es>:
> Hola *.*,
>
> Aprovecho que hay thread sobre eval para comentar también mis dudas.
>
> Estoy trabajando en un sistema que me permita ejecutar de forma segura un
> código python que ha creado el usuario de la aplicación.
>
> La idea es hacer un proceso intermedio entre la lectura de datos desde un
> archivo o base de datos, y el procesado de los mismos.
>
> Mediante este proceso el usuario podría definir un código que evaluara los
> datos leídos y los manipulara antes de su procesado definitivo.
>
> Este código solo debería tener acceso a las funcionas matemáticas y de
> string básicas para manipular los objetos que ha definido previamente la
> aplicación.
>
> Para crear el entorno seguro estoy utilizando una receta que un listero
> envió hace bastante tiempo, sorry no recuerdo quien :(
>
>    env={"__builtins__":__builtins__}
>    exec "from cmath import *" in env
>    env["__builtins__"]={}
>
>    # agregar diccionario con datos a evaluar/manipular
>    env["datos"]=dic
>
>    # ejecutar
>    exec codigo in env
>
> En las pruebas realizadas funciona bien, pero me quedan las siguientes
> dudas:
>
> 1. Los datos que se permite manipular serán diccionarios y clases sencillas.
> Soy consciente que si algún método de las clases que incluya en el entorno
> hace 'cosas raras', podrá ejecutarlo, eso ya es responsabilidad mia.
>
> Pero, ¿Es suficiente seguro esto?

Todo depende de qué entiendes por seguridad.

Si lo que buscas es un "sandbox" (¿se usa arenero?) ya te puedes ir
olvidando. Y menos que menos si pretendes que esté certificado. De
hecho el restricted-python hace tiempo que se marcó como obsoleto por
la cantidad de agujeros que tenía.

Creo que hay algunos colaboradores que hay vuelto sobre el asunto y
están rehaciendo el entorno desde cero. Si mal no recuerdo la idea era
basarlo todo en capabilities. Pero no tengo idea en qué estado está
ahora.

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")



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