Organizing Programming Contest – Cómo comstackr y ejecutar

Estoy construyendo una interfaz basada en web donde la gente puede escribir en código C simple para resolver preguntas de progtwigción algorítmica. Estoy usando el editor Ace donde las personas pueden escribir el código y cuando presionas el botón de ejecución, el código C se envía al servidor, se comstack y se devuelve la salida.

¿Cómo se logra la segunda parte de una manera segura? Me refiero a dado un archivo de código C, comstackrlo y ejecutarlo. No puedo confiar en el código, así que ¿cómo puedo asegurarme de que no sea malicioso y no dañe mi sistema? También cómo imponer la memoria y los límites de tiempo.

¿Existe algún sistema de código abierto ya existente que pueda modificar para adaptarlo a mis necesidades? No encontré nada en mi búsqueda. ¿O algunos consejos sobre cómo debo proceder ahora?

editar: encontré http://cs.sru.edu/~contest/rocktest/ y tratando de entender su código pero aún buscando mejores opciones, preferiblemente en php

Recomiendo la API de Ideaone: http://ideone.com/api

Permítanme conectar AppArmor , un mecanismo de control de acceso obligatorio simple que puede hacer que la creación de este tipo de entornos sea simple. Aquí hay un perfil que tengo para confinar mi visor de PDF xpdf :

 #include  /usr/bin/xpdf { #include  #include  #include  #include  /dev/tty rw, owner /dev/pts/* rw, /etc/papersize r, /etc/xpdf/* r, /bin/bash ix, /usr/bin/xpdf r, /usr/bin/xpdf.bin rmix, /usr/share/xpdf/** r, /usr/share/icons/** r, owner /**.pdf r, owner /tmp/* rw, } 

Puede aprender los conceptos básicos de limitar las aplicaciones de su elección en medio día más o menos, y tener perfiles escritos para su servidor en otro medio día. (Ese perfil xpdf tardó unos cuatro minutos en escribir, pero sé lo que estoy haciendo. Hemos desplegado AppArmor en los principales servidores públicos de un minorista en línea en el transcurso de una tarde, con resultados similares con otras implementaciones).

AppArmor también ofrece una interfaz sencilla para configurar límites de tiempo de ejecución , como la cantidad de memoria que un proceso puede asignar:

 rlimit as <= 100M, # limit address space to 100 megabytes 

AppArmor sería más fácil de usar en las distribuciones de Ubuntu, openSUSE, SLES, PLD, Mandriva, Pardis o Annvix, ya que las herramientas vienen preinstaladas. Pero la funcionalidad básica de AppArmor está disponible en los kernels de Linux 2.6.36 y posteriores, y es posible instalar AppArmor en cualquier distribución de Linux .

Otras herramientas similares incluyen SElinux , TOMOYO o SMACK . Creo que SMACK sería el siguiente más fácil de implementar, pero cualquiera de ellos podría evitar que el código malicioso dañe su sistema.

Tendrá que ejecutar el código en un entorno de espacio aislado . Hay una pregunta similar sobre SO que podría ayudar.

También podría ejecutar algunas máquinas virtuales para ejecutar el código, pero eso es básicamente un ejemplo de sandboxing, solo un poco pesado.

Ejecute el código en un sandbox, una máquina virtual.

Además de eso, eliminaría el acceso a cualquier llamada al sistema y solo permitiría las llamadas a las bibliotecas C estándar. Además, reemplace todas las llamadas de la biblioteca inseguras con sus propias llamadas que verifican la entrada y delegan entradas seguras a las funciones reales (en particular para malloc, usted querría poner un límite superior sobre cuánto puede asignar cada progtwig).

Si haces lo anterior, solo una máquina virtual debería ser suficiente para el código de todos.

Voy a usar uevalrun :

“El principal caso de uso para uevalrun es la evaluación de los progtwigs de solución presentados por los concursantes de los concursos de progtwigción: uevalrun comstack la solución, la ejecuta con la entrada de prueba, compara su salida con el resultado esperado y escribe un informe de estado”.