Caja de arena Python, segura,
sandbox (9)
Esta pregunta ya tiene una respuesta aquí:
- ¿Cómo puedo sandbox Python en Python puro? 8 respuestas
Me gustaría crear un sitio web donde las personas puedan cargar sus scripts de Python. Por supuesto que me gustaría ejecutar esos scripts. Esos guiones deberían hacer algún trabajo interesante. El problema es que las personas pueden cargar 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? Gracias
"No se puede hacer", es demasiado duro. Los motores de JavaScript viven en su navegador web y aceptan y ejecutan scripts no confiables de forma segura. Siempre existe la posibilidad de explotaciones, pero en el correcto funcionamiento del motor son inocuas. Incluso hay comprobaciones de "secuencia de comandos lenta" que impiden que los bucles infinitos ataquen la denegación de servicio a su navegador, creando esos pequeños cuadros de diálogo de alerta.
Google App Engine ejecuta una versión de caja de arena de Python VM que elimina efectivamente todos los bits nativos traviesos que te permiten acceder al sistema subyacente. Para hacer esto de forma segura, se necesitaría cierta experiencia en Python VM.
Para mayor seguridad, puede comenzar eliminando todos los elementos incorporados y colocando en la lista blanca los que desea permitir a los usuarios una vez que certifique que no tocan el sistema subyacente.
Se siente como algo que alguien ya debe haber hecho, pero no conozco ningún proyecto existente que lo haga. : - /
"No se puede hacer".
Ejecutar scripts arbitrarios (que no son de confianza) y mantenerse a salvo es una contradicción. Usted debe ir tan lejos como el uso de núcleos personalizados, cárceles, vms, similares.
Puedes ver cómo lo hace http://codepad.org/about , es mucho trabajo.
Brett Cannon tiene un diseño provisional para hacer esto, lo último que supe, pero no se ha desarrollado. Entonces, a menos que esté buscando poner MUCHO esfuerzo para hacer que esto suceda, actualmente no hay una solución disponible públicamente.
El blog de Brett está en: http://sayspy.blogspot.com/ Si desea 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 eso, 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 ahora. Es algo que a la gente le gustaría, pero no es realmente una alta prioridad de lo que he visto.
Creo que la forma 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" es actualmente jugar con máquinas virtuales (¡las universidades son geniales!).
Una nueva instancia de VM se puede crear y comenzar en segundos. Si mantiene algunos alrededor 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 de hoy son máquinas virtuales y no admiten otra máquina virtual en su interior. Necesitas un servidor real, físico para hacer esto.
En la actualidad, hay muchos servidores web que ejecutan códigos de Python que no son de confianza:
- codepad.org (probablemente el pastebin más famoso de los códigos python)
- http://codingbat.com/ (anteriormente Javabat, cambio de nombre para reflejar la adición de Python)
- http://appengine.google.com/ (código Python del host en la infraestructura de Google)
- http://www.spoj.pl/ el infame desafío de codificación de Esfera en línea Juez
Es posible que desee ver cómo abordaron sus problemas.
o puede que desee ver un enfoque diferente:
- http://pyjs.org/ - pyjamas - compilador de python a javascript (ejecutando del lado del cliente, cambiando el problema de seguridad a su lado)
No sé en versiones anteriores, en Python 3 puede crear funciones con acceso a un ámbito personalizado a través de tipos.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 suministrado en el diccionario de alcance. Me pregunto si todavía hay hacks alrededor de esto.
Puedes probar la API de Ideone, ya que permite Python 2 y Python 3
Si usa Linux, tal vez seccomp sea la solución, incluso el modo 2 es mejor. Con ellos, puede crear un nuevo proceso que fallará en cualquier syscall y solo podrá leer los descriptores de archivos existentes.
Tal vez usar también los espacios de nombres y cgroup ayude, esto se puede hacer con ctypes.
trypython.org ( fuente de licencia BSD aquí ) hace una versión segura orientada a un navegador de tal sanbox en IronPython (a través de Silverlight / Moonlight). Es posible que pueda combinar una versión sin cabeza de esta para usarla en un servidor, pero definitivamente podría permitir que los usuarios distribuyan scripts entre sí, o podría distribuir estos scripts para que se ejecuten dentro del entorno del complemento.