Probando el algoritmo de C ++ en un servidor

5

Estoy haciendo un servidor de prueba de C ++ y quiero hacer que los programas compilados:

  • no tiene acceso para leer o escribir archivos.
  • no tiene acceso para abrir o conectarse a través de sockets.
  • no podrá trabajar con CUALQUIER biblioteca no estándar de C ++ (por ejemplo, el sistema)
  • tiene acceso completo a la CPU (no se pierde ninguna o muy poco rendimiento).
  • tienen memoria RAM limitada.
  • tienen un tiempo de ejecución limitado.

Espero no haber olvidado nada, pero lo que quiero hacer es hacer un sistema de prueba normal sin posibilidad de ser hackeado a través del programa compilado.

¿Algún consejo, enlaces, lo que sea? ¿Alguna opción de compilador?

Aquí está lo que será el sistema actual:

SO: Ubuntu

Compilador: GCC

Editado :

¿Sabe si es posible deshabilitar TODAS las bibliotecas del sistema en el compilador? Eso ayudaría mucho :)

Editado (de nuevo):

Esto es lo que se me ocurrió: hago un programa que se forja a sí mismo y el proceso principal realiza un seguimiento de la prueba de los límites de tiempo (aunque todavía puedes usar algún comando del sistema para eso) y el proceso secundario se limita a sí mismo (recursos, seccomp) y ejecuta el software que no es de confianza.

    
pregunta Pijusn 08.01.2012 - 13:56
fuente

5 respuestas

3

Puede que te interese seccomp . Esta es una característica con la que Linux ejecuta un proceso con solo un conjunto muy limitado de llamadas al sistema disponibles; El núcleo destruye el proceso en cualquier intento de ejecutar cualquier otra llamada. Conceptualmente, esta es la manera correcta de hacer este tipo de aislamiento: use una lista blanca (pequeña) de llamadas permitidas al sistema, en lugar de una lista negra de llamadas no permitidas. Seccomp puede ser utilizado por cromo (la parte de código abierto de Google Chrome), por lo que es muy probable que siga siendo compatible por el momento.

La página de Wikipedia tiene algunos enlaces, incluido seccomp-nurse , que podría ser el software que está buscando. para.

Para el tiempo de CPU y el consumo de memoria, el kernel de Linux puede imponer límites estrictos por proceso; Consulte setrlimit .

    
respondido por el Thomas Pornin 08.01.2012 - 16:24
fuente
2

Lo que estás describiendo se parece mucho a NaCl de Google. Google diseñó esto como una forma segura de ejecutar código x86 nativo en el navegador web, pero tienen una muestra que se ejecuta de forma independiente sin navegador. Incluyen un compilador GCC que genera NaCl-x86 en lugar de x86 estándar.

    
respondido por el Robert David Graham 08.01.2012 - 22:06
fuente
1

Probablemente debería ejecutar el programa dentro de una máquina virtual, probablemente creado con Xen si no desea pagar por VMWare.

    
respondido por el Jeff Burdges 08.01.2012 - 15:11
fuente
1

Aquí hay otra opción que encontré. El comando del terminal gksu tiene una opción para ejecutar el comando como otro usuario:

  

--user < usuario & gt ;, -u < usuario >

     

Llamar como el usuario especificado.

Creo que esto podría crear algún tipo de caja de arena.

P.S. Hizo esto como una nueva respuesta, ya que es una de las posibles soluciones y vale la pena comentarla por separado.

    
respondido por el Pijusn 08.01.2012 - 17:37
fuente
1

¿Has pensado en utilizar chroot? enlace

Es más libre, pero funcionará. Seccomp se encarga de las llamadas al sistema, solo eliminar las bibliotecas del sistema no funcionará, ya que las personas solo pueden agregar sus llamadas al sistema. Pero chroot es otro nivel para asegurarse de que no se rompan y otro nivel de seguridad. Puede crear dinámicamente una cárcel chroot'd y luego compilar con bastante facilidad y hacer que cada proceso se ejecute dentro de ella sin preocuparse de que dos personas interactúen,

    
respondido por el user1392 11.01.2012 - 21:22
fuente

Lea otras preguntas en las etiquetas