2010-09-10 9 views
16

Me gustaría crear un sitio web donde las personas puedan cargar sus scripts de Python. Por supuesto, me gustaría ejecutar esos guiones. Esos guiones deberían hacer un trabajo interesante. El problema es que las personas pueden subir scripts que podrían dañar mi servidor y me gustaría evitar eso. ¿Cuál es la opción de ejecutar scripts arbitrarios sin dañar mi sistema, en realidad sin ver mi sistema en absoluto? GraciasPython, safe, sandbox

+0

Hay una manera de configurar Python para desactivar funciones no seguras - se utiliza con éxito en Paint Shop Pro. Desafortunadamente no tengo los detalles técnicos. Además, existe la posibilidad de explotar errores y una antigua denegación de servicio mediante la carga de un bucle infinito. –

+0

Eso probablemente sería genial para aplicaciones independientes que se ejecutan en su propia computadora, no en un servidor público ... – maliperica

+0

http://codepad.org/ Le permitirá pegar un script y ejecutarlo en muchos idiomas, incluido Python. –

Respuesta

6

"No se puede hacer."

Ejecutar scripts arbitrarios (no de confianza) y mantenerse a salvo es una contradicción. Deberías llegar a usar núcleos, cárceles, vms, etc. personalizados.

Puede ver cómo lo hace http://codepad.org/about, es un lote del trabajo.

+0

Guau, eso fue útil. Después de su publicación, estoy pensando en escribir mi propio seudo-lenguaje similar a Python para lograr mi objetivo ... – maliperica

+0

Podría jugar con las últimas adiciones de PyPy, pero asumí que quería ofrecer acceso a cpython. – ikanobori

+0

No, realmente, me gustaría que la gente envíe su código y evalúe si después ... (ejecútelo y vea lo que hace) De todos modos, me gustaría que sea posible cargar un código y probarlo - sin hacer ningún daño, cualquier cosa con la que mucha gente esté familiarizada – maliperica

1

"No se puede hacer" es demasiado duro. Los motores de JavaScript viven en su navegador web y aceptan y ejecutan scripts que no son de confianza. Siempre existe la posibilidad de explotar, pero en el funcionamiento correcto del motor son inocuos. Incluso hay comprobaciones de "secuencias de comandos lentas" que evitan que los bucles infinitos de la denegación de servicio ataquen a su navegador, creando esos pequeños diálogos de alerta.

Google App Engine ejecuta una versión de espacio aislado de la máquina virtual de Python que elimina de forma efectiva todos los bits nativos traviesos que le permiten obtener en el sistema subyacente. Hacer esto usted mismo de una manera segura tomaría algo de experiencia en Python VM.

Para la cordura, se podría empezar por la eliminación de todas las órdenes internas y listas blancas las que desee permitir a los usuarios una vez que se certifica que no toquen el sistema subyacente.

Parece algo que alguien ya debe haber hecho, pero no conozco ningún proyecto existente que lo haga. : -/

+2

Se ha intentado y no se puede hacer correctamente sin utilizar VM/PyPy/codepad. Necesitarás rechazar cosas tontas como '__builtins__ .__ import__ ('sys'). Exit()' y las muchas otras formas de llegar a ella (locales() y similares). Además, sin paralizar al intérprete en sí. – ikanobori

+0

¿Entonces está diciendo que no puede hacerlo correctamente sin hacerlo correctamente? Eso me imaginé. ;-) – cdleary

+0

2 problemas: 1) los motores de JavaScript están diseñados como una secuencia de comandos del lado del cliente, python no lo es; 2) javascript vive en su navegador web, y él está pidiendo que ejecute el servidor de python que no es de confianza. Estoy de acuerdo en que es factible, aunque requeriría mucho trabajo y limitaría muchas cosas. –

1

Brett Cannon tiene un diseño tentativo para hacer esto, lo último que supe, pero no ha sido desarrollado. Entonces, a menos que esté tratando de hacer MUCHO esfuerzo para que esto suceda, actualmente no hay una solución públicamente disponible.

El blog de Brett está en: http://sayspy.blogspot.com/ si quiere intentar leerlo, no pude encontrar un enlace directo a sus discusiones sobre el nuevo diseño de seguridad. No puedo recordar si leí su blog hablando de ello, o si fue en persona donde lo mencionó, lo siento.

Solía ​​haber algunas habilidades de ejecución restringidas, pero se eliminaron porque simplemente no funcionaban.

No es imposible de hacer, pero no es algo que Python pueda hacer en este momento. Es algo que a la gente le gustaría, pero en realidad no es una gran prioridad por lo que he visto.

+0

AFAICR, el plan se abandonó porque no hay forma de garantizar dicha seguridad por parte de Python, y un entorno limitado impuesto externamente debería ser el camino a seguir para cualquier seguridad real. –

+0

Sí, eso es lo que quise decir con "simplemente no funcionaron". Lo siento, no estaba más claro allí. No estoy de acuerdo con que no haya forma de garantizar tal seguridad a Python, creo que Brett tiene un plan que lo permitiría, pero tendría que ceder ante él por los detalles de una manera u otra. –

0

trypython.org (BSD licensed source here) hace una versión segura de navegador de tal sanbox en IronPython (a través de Silverlight/Moonlight). Puede combinar una versión sin cabeza de esto para utilizarla en un servidor, pero definitivamente podría permitir que los usuarios distribuyan scripts entre ellos, o podría distribuir estos scripts para que se ejecuten dentro del entorno del complemento.

2

hay un buen montón de tela-servidor que ejecuta los códigos de pitón que no se confía hoy en día:

es posible que desee ver cómo abordaron sus problemas.

o es posible que desee mirar un enfoque diferente:

  • http://pyjs.org/ - pijamas - compilador JavaScript pitón-a (que se ejecuta en el cliente, cambiar el problema de seguridad a su lado)
3

Creo que la manera de hacerlo es ejecutar esos scripts en el shell de Python normal, pero en una máquina virtual. Podría ser parcial, porque mi "trabajo" actualmente es jugar con máquinas virtuales (¡las universidades son geniales!).

Se puede crear una nueva instancia de VM e iniciarla en segundos. Si mantiene unos pocos y reemplaza solo aquellos que se rompen, tiene un buen servicio, seguridad absoluta y casi ningún esfuerzo.

Pero hay una cosa: prácticamente todos los servidores web en la actualidad son máquinas virtuales y no admiten otra máquina virtual en su interior. Necesitas un servidor real y físico para hacer esto.

4

No sé en versiones anteriores, en Python 3 puede crear funciones con acceso a un ámbito personalizado a través de types.FunctionType.

def f(): 
    return __builtins__ 

f() # this will work because it has access to __builtins__ 
scope = {} 
sandboxed = FunctionType(f.__code__,scope) 
sandboxed() # will throw NameError, builtins is not defined 

la función devuelta solo tiene acceso a lo que haya proporcionado en el diccionario de alcance. Me pregunto si todavía hay hacks alrededor de esto.

+0

Probado en Python 2.7.3 y funciona exactamente igual. –

+0

Puedes salir fácilmente de este. No logré obtener '__import__' (todavía), pero' archivo' es accesible y arbitrario de lectura/escritura se considera romper el sandbox, IMO. – Blender

+0

No lo he probado yo mismo, pero la regla de oro es que puede explotar siempre y cuando tenga acceso a los atributos del guión bajo doble. Por lo menos, necesitas incluir en la lista blanca el AST. – Antimony

1

Si utiliza Linux tal vez seccomp es la solución, incluso el mode 2 es más agradable. Con ellos puede crear un nuevo proceso que fallará cualquier llamada de sistema y solo podrá leer los descriptores de archivos ya existentes.

Quizás usar también namespaces y cgroup ayude, esto se puede hacer con ctypes.

1

Usted podría intentar API Ideone - permite Python 2 y Python 3

+0

Ideone API evolucionó en Esfera Engine (http://sphere-engine.com). Ahora ofrece mucho más que la antigua API Ideone :) – Robson