
oggy
Quiero crear una aplicación web que permita al usuario cargar código C y ver los resultados de su ejecución (el código se compilaría en el servidor). Los usuarios no son de confianza, lo que obviamente tiene importantes implicaciones de seguridad.
Así que necesito crear algún tipo de sandbox para las aplicaciones. En el nivel más básico, me gustaría restringir el acceso al sistema de archivos a algunos directorios específicos. No puedo usar chroot jails directamente, ya que la aplicación web no se ejecuta como un usuario privilegiado. Supongo que un ejecutable suid que configura la cárcel sería una opción.
Los programas cargados serían bastante pequeños, por lo que deberían ejecutarse rápidamente (un par de segundos como máximo). Por lo tanto, puedo eliminar el proceso después de un tiempo de espera preestablecido, pero ¿cómo me aseguro de que no genere nuevos procesos? O si no puedo, ¿matar todo el pgid es un método confiable?
¿Cuál sería la mejor manera de hacerlo, además de “no hacerlo en absoluto”? 🙂 ¿Qué otros problemas de seguridad evidentes me he perdido?
FWIW, la aplicación web se escribirá en Python.

Sweeney
Junto con las otras sugerencias, puede encontrar esto útil.
http://www.eelis.net/geordi/
Esto es de http://codepad.org/about, codepad.org‘s acerca de la página.
Los pocos detalles que proporciona implican que tiene control administrativo sobre el servidor en sí, por lo que mi sugerencia hace esta suposición.
Abordaría esto como un sistema por lotes. El servidor web acepta una carga del archivo fuente, un proceso sondea el directorio de envío, procesa el archivo y luego envía el resultado a otro directorio que la aplicación web sondea hasta que encuentra el resultado y lo muestra.
La parte divertida es cómo manejar con seguridad la ejecución.
Mi sistema operativo de elección es FreeBSD, por lo que configuré una cárcel preconfigurada (que no debe confundirse con una cárcel chroot vainilla) que compilaría, ejecutaría y guardaría la salida. Luego, para cada envío de archivo fuente, inicie una copia prístina de la cárcel para cada ejecución, con una copia del archivo fuente dentro.
Siempre que el /dev de la cárcel se reduzca a casi nada, los límites de recursos del sistema se establezcan de forma segura y que el tráfico no pueda enrutarse fuera de la cárcel (vinculado a una dirección no enrutable o simplemente protegido por un cortafuegos), personalmente me sentiría cómodo ejecutando esto en un servidor bajo mi cuidado.
Ya que usa Linux, investigaría User Mode Linux o Linux-VServer, que son muy similares en concepto a las cárceles de FreeBSD (nunca las he usado, pero he leído sobre ellas). Hay varios otros sistemas similares enumerados aquí.
Este método es mucho más seguro que una cárcel chroot vainilla y es mucho más liviano que usar una virtualización completa como qemu/kvm o VMware.
No soy programador, así que no sé qué tipo de cosa AJAX-y podría usar para sondear los resultados, pero estoy seguro de que podría hacerse. Como administrador, me parecería divertido participar en este proyecto. Diviértete. 🙂

armador
Yo diría que esto es extremadamente peligroso en muchos niveles. Básicamente, se está abriendo a cualquier vulnerabilidad que se pueda encontrar en su sistema (mientras que normalmente está limitado a las que las personas pueden explotar de forma remota). Yo diría que no lo hagas si puedes evitarlo.
Si desea hacerlo, es posible que desee utilizar algún tipo de máquina virtual para ejecutar el código del usuario. Usando algo como KVM es posible configurar una cantidad de máquinas virtuales usando la misma imagen base (incluso puede almacenar una instantánea en un estado ya iniciado, aunque no estoy seguro de cómo manejará la clonación). Luego puede crear las máquinas virtuales a pedido, ejecutar el código del usuario, devolver los resultados y luego eliminar la máquina virtual. Si mantiene las máquinas virtuales aisladas entre sí y de la red, los usuarios pueden causar los estragos que quieran y no dañarán su servidor físico. El único peligro al que se está exponiendo en estas condiciones sería algún tipo de explotación que les permita escapar de la VM… son extremadamente raros y serán más raros a medida que mejore la virtualización del hardware.
En Fedora 11ahí está el Caja de arena de SELinux que parece hacer exactamente lo que desea (excepto quizás limitar la generación de nuevos procesos; la publicación del blog vinculada no menciona eso).
Por supuesto, siempre existe el riesgo de errores en el kernel; incluso con SELinux, partes del kernel aún están expuestas a todos los procesos.
Ver esta página sobre los métodos de sandboxing de Google Chrome para Linux. Como puede ver, hay muchos métodos, pero ninguno de ellos es excelente para una aplicación distribuible como Chrome porque es posible que algunas distribuciones no los incluyan. Sin embargo, esto no es realmente un problema para una aplicación web, porque puede controlar lo que está instalado en su servidor.
Personalmente, mi favorito es Seccompporque tiene un muy gastos generales bajos en comparación con otras herramientas como ptrace (cambie los espacios de direcciones en cada syscall!) o KVM (máquina virtual con gran cantidad de memoria), y es increíblemente simple en comparación con herramientas como SELinux (y, por lo tanto, es más probable que sea seguro).

Aghoree
supongo caja de arena libre sirve a tu propósito. Su biblioteca principal está escrita para C/C++, pero también tiene un contenedor para programas de Python. Brinda opciones para personalizar qué llamadas al sistema se pueden permitir, cuánta memoria se puede usar, cuánto tiempo se puede ejecutar el programa invitado, etc. Ya se está usando en un par de jueces en línea como HOJ.

mike hordecki
Hay una herramienta llamada rastro – monitorea las llamadas al sistema realizadas por un proceso dado. Solo debe estar atento a llamadas específicas que sugieran acceso a funciones ‘ilegales’. AFAIK, es el método utilizado en los concursos de programación para aislar los programas de los concursantes.
Bienvenido al mundo del software antivirus. ¿Se puede confiar en “el usuario”? Si es así, simplemente compila y ejecuta y no te preocupes por eso. Si no se puede confiar en el usuario, ¿qué impide que esto se convierta en el centro de los piratas informáticos cuando todos intentan que su servidor forme parte de una red de bots?
– S. Lott
19 de junio de 2009 a las 20:05
Preguntas similares sobre procesos de sandboxing/jailing en Linux o Unix: * unix.stackexchange.com/q/6433/4319 * stackoverflow.com/q/3859710/94687 * stackoverflow.com/q/4410447/94687 * stackoverflow.com/q/4249063/94687
– imz — Iván Zakharyaschev
13 de marzo de 2011 a las 13:38
posible duplicado de la forma segura de ejecutar el código de otras personas (sandbox) en mi servidor?
– Ciro Santilli Путлер Капут 六四事
21 de agosto de 2014 a las 7:02