python - Sandboxing en Linux
c security (12)
Aunque todavía está en desarrollo y aún no se considera seguro, puede revisar la tecnología detrás de Google Native Client . Está diseñado para permitir la ejecución de código nativo no confiable en un navegador web, pero probablemente podría adaptarse para su uso en un servidor web. Puede usar algo como esto además de otras técnicas, como una máquina virtual, para mayor seguridad.
Quiero crear una aplicación web que permita al usuario cargar algo de código C y ver los resultados de su ejecución (el código se compilará en el servidor). Los usuarios no son de confianza, lo que obviamente tiene enormes implicaciones de seguridad.
Así que necesito crear algún tipo de caja de arena 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 está ejecutando 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 detener el proceso después de un tiempo de espera predeterminado, pero ¿cómo me aseguro de que no genere nuevos procesos? O si no puedo, ¿matar a todo el pgid es un método confiable?
¿Cuál sería la mejor manera de hacer esto, aparte de "no hacerlo en absoluto"? :) ¿Qué otros problemas de seguridad evidentes me he perdido?
FWIW, la aplicación web se escribirá en Python.
Casi la única posibilidad que tiene es ejecutar un VirtualMachine y esos pueden tener vulnerabilidades. Si desea que su máquina sea pirateada a corto plazo, solo use los permisos y haga un usuario especial con acceso a tal vez un directorio. Si desea posponer la piratería en algún momento en el futuro, ejecute un servidor web dentro de una máquina virtual y envíelo a ese puerto. Querrá mantener una copia de seguridad de eso porque probablemente lo pirateará en menos de una hora y querrá reiniciar una copia nueva cada pocas horas. También querrás mantener una imagen de toda la máquina para simplemente recrear todo el asunto una vez a la semana o así para superar las piraterías semanales. No permita que esa máquina hable con ninguna otra máquina de su red. Lista negra por todas partes. Estoy hablando de la máquina virtual y las direcciones IP de la máquina física. Realice auditorías de seguridad periódicas en cualquier otra máquina en sus otras máquinas en la red. Cambie el nombre de las máquinas IHaveBeenHacked1 e IHaveBeenHacked2 y evite el acceso a las que se encuentran en sus listas de hosts y firewalls.
De esta manera usted podría evitar su nivel de hackage por un tiempo.
Creo que sus soluciones deben concentrarse en analizar el código fuente. No conozco ninguna herramienta, y creo que esto sería bastante difícil con C
, pero, por ejemplo, un programa de Pascal
que no incluye ningún módulo sería bastante inofensivo en mi opinión.
El confinamiento basado en ptrace para programas no confiables se puede usar como el que se describe en http://www.cs.vu.nl/~rutger/publications/jailer.pdf , http://www.cs.vu.nl/~guido/mansion/publications/ps/secrypt07.pdf .
Tienen una regla de política de cambio de raíz, CHRDIR, cuyo efecto es similar a chroot. (Sección "La política de encarcelamiento")
Sin embargo, es posible que no hayan publicado su código fuente (basado parcialmente en una cadena modificada http://www.liacs.nl/~wichert/strace/ - Sección "Implementación") ...
Vea también otros enfoques disponibles basados en ptrace para chroot-in-userpace: https://unix.stackexchange.com/a/72697/4319
En Fedora 11 , está el arenero de SELinux que parece hacer exactamente lo que usted quiere (excepto quizás limitar los procesos de generación nuevos; la publicación del blog vinculado no menciona eso).
Por supuesto, siempre existe el riesgo de errores del núcleo; Incluso con SELinux, partes del kernel todavía están expuestas a todos los procesos.
Existe una herramienta llamada strace : monitorea las llamadas al sistema realizadas por un proceso determinado. Solo tiene que estar atento a las llamadas específicas que sugieran el acceso a funciones "ilegales". AFAIK, es el método utilizado en las competencias de programación para los programas de los participantes de la zona de pruebas.
Generar una nueva máquina virtual bajo KVM o qemu para compilar y ejecutar el código parece ser el camino a seguir. La ejecución del código bajo jail / LXC puede comprometer la máquina si explota las partes no seguras del sistema operativo como el código de red. La ventaja de correr bajo una VM es obvia. Solo se puede hackear la máquina virtual pero no la máquina en sí. Pero el efecto secundario es que necesita muchos recursos (CPU y memoria) para generar una máquina virtual para cada solicitud.
Junto con las otras sugerencias, puede resultarle útil.
Esto es de http://codepad.org/about , codepad.org ''s acerca de la página.
Los pocos detalles que proporciona implican que usted tiene control administrativo sobre el propio servidor, por lo que mi sugerencia hace esta suposición.
Me gustaría abordar esto como un sistema por lotes. El servidor web acepta una carga del archivo de origen, 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 preferido es FreeBSD, así que configuré una cárcel preconfigurada (que no debe confundirse con una jaula chroot de vainilla) que compile, ejecute y guarde la salida. Luego, para cada envío de archivo de origen, inicie una copia prístina de la cárcel para cada ejecución, con una copia del archivo de origen en su interior.
Siempre y cuando el / dev de la cárcel se reduzca a casi nada, los límites de los recursos del sistema se establezcan de manera segura y el tráfico no pueda salir de la cárcel (vinculado a una dirección que no se pueda enrutar o simplemente con cortafuegos), personalmente me sentiría cómodo ejecutando esto en un servidor bajo mi cuidado
Desde que usas Linux, investigaría el Modo de Usuario 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 here .
Este método es mucho más seguro que una jaula chroot de vainilla, y es mucho más liviano que el uso de la virtualización completa, como qemu / kvm o VMware.
No soy un programador, así que no sé qué tipo de AJAX-y podría usar para sondear los resultados, pero estoy seguro de que podría hacerse. Como administrador, me parece un proyecto divertido para participar. Diviértete. :)
Supongo que libsandbox sirve a tu propósito. Su biblioteca central está escrita para C / C ++, pero también tiene un contenedor para los programas Python. Ofrece opciones para personalizar qué llamadas del sistema se pueden permitir, cuánta memoria se puede usar, por cuánto tiempo se puede ejecutar el programa invitado, etc. Ya se está utilizando en un par de jueces en línea como HOJ .
Vea esta página en los métodos de sandboxing de Google Chrome para Linux . Como puede ver, hay muchos métodos, pero ninguno de ellos es ideal para una aplicación distribuible como Chrome porque algunas distribuciones pueden no incluirlos. Sin embargo, esto no es realmente un problema para una aplicación web, ya que puede controlar lo que está instalado en su servidor.
Personalmente, mi favorito es Seccomp , porque tiene una sobrecarga muy baja en comparación con otras herramientas como ptrace (¡cambia los espacios de direcciones en cada syscall!) O KVM (máquina virtual con gran necesidad 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).
Yo diría que esto es extremadamente peligroso en muchos niveles. Básicamente, te estás abriendo a cualquier vulnerabilidad que se pueda encontrar en tu sistema (mientras que normalmente estás limitado a las personas que 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 serie de máquinas virtuales utilizando 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 unas de otras y la red, los usuarios pueden causar el caos que quieran y no dañará 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 máquina virtual ... son extremadamente raros y serán más raros a medida que mejore la virtualización del hardware.