2009-02-10 8 views
5

Comenzó con this question, siguió con this question y ahora condujo a la actual. :)¿Cómo ejecutar un programa en Windows con memoria/tiempo de CPU limitados?

La tarea es la siguiente: crear un programa de Windows que ejecutará otro programa en un entorno limitado. No se puede confiar en el otro programa, por lo que debe estar listo para el código de hackeo. Más específicamente:

  • límite de la memoria disponible para algunos X MB (dada como parámetro);
  • Limite el tiempo de ejecución disponible a algunos X milisegundos (dado como parámetro). Tenga en cuenta que este es el tiempo del núcleo + tiempo del usuario, pero no el tiempo de inactividad. Por otro lado, el tiempo de inactividad también debe ser limitado para que el programa no pueda Sleep() infinitamente.
  • Al finalizar el programa, informe el tiempo de CPU realmente gastado, de la forma más precisa posible. Milisegundos sería bueno, centésimos de segundo aceptable, menos de lo que no sería bueno. Los ciclos de CPU serían ideales.
  • Si el programa se cuelga, informe cierta información sobre el bloqueo (cuanto más mejor, pero no vaya por la borda con los rastreos de la pila y similares).
  • Captura preferentemente todos los resultados del programa y repórtalo también;
  • Se supone que el programa está utilizando solo el directorio actual, además quizás algunos .DLL obligatorios de SYSTEM32 (como kernel.dll, user32.dll, etc.). Limite el acceso a cualquier otra cosa tanto como sea posible. El acceso a cosas como el registro y la red no debería ser necesario (a menos que los .DLL obligatorios lo requieran). Mientras menos acceso, mejor.

Esto será necesario para un software de soporte olímpico informático. Este programa ejecutará las presentaciones de los participantes en el servidor central, por lo que puede esperar casi cualquier cosa allí. Los bloqueos serán rutinarios y también se pueden esperar algunos intentos de pirateo.

Entonces, ¿cómo harías para crear un programa así? ¿Qué usarías? En los temas anteriores (ver arriba) ha quedado claro que adjuntar como depurador es una mala idea, aunque quizás soy demasiado torpe.

Respuesta

0

Las soluciones de virtualización resuelven este problema. Tal vez pueda basar su solución en VMWare (o su equivalente) y lanzar máquinas virtuales separadas (una por proceso). Obtendrá un buen aislamiento, controlará el uso de memoria/CPU e informes. Está la sobrecarga del sistema operativo de envoltura por proceso, pero dependiendo de los requisitos de su proyecto podría ser aceptable.

+0

virtualización sería bueno, pero no estoy seguro de cómo usarlo en este escenario. En primer lugar, habrá muchas presentaciones , por lo que las pruebas deben ser lo más cortas posible. La mayoría de las ejecuciones de prueba se limitarán a ~ 1 segundo por caso de prueba, y habrá alrededor de 10 casos de prueba. –

+0

Además, si inicio toda una máquina virtual (o incluso la saco de dormir), todavía debo colocar las restricciones/medidas solo en el proceso, no en la máquina virtual. Esencialmente volvemos al paso uno. –

+0

También tenga en cuenta que las medidas deben ser bastante precisas. Sería preferible un milisegundo , centisegundos serían aceptables. Deciseconds sería horrible. Ahora que lo pienso, CPU _cycles_ sería lo mejor.: P –

5

Estás construyendo el mismo modelo de proceso que IIS: ¡diversión! Usaría las mismas herramientas que usa IIS, es relativamente robusto frente a la piratería y está diseñado para dividir su sistema en muchos trabajos concurrentes.

Puede utilizar Win32 Jobs para fijar las cuotas de memoria, CPU, hilos y se puede establecer un contexto de seguridad para los diferentes procesos que se ejecuten en, lo que limita el acceso al sistema de archivos.

Para la supervisión, me gustaría ver WMI.

Para el seguimiento de la pila al colgar o colgar, he usado ADPlus nuevamente de Microsoft.

Para capturar salida de la consola, echa un vistazo a Creación de un Child Process with Redirected Input Output.

En cuanto a las restricciones de seguridad, cree una cuenta con pocos privilegios de usuario y ejecutar el trabajo/proceso como ese usuario.

+0

Sí, que yo sepa. Excepto por el tiempo de inactividad, pero supongo que podría controlar eso también. ¿Tienes alguna idea sobre el resto? –

+0

Jobs resuelve parte del problema. Pero el código malicioso aún podría enloquecer en un trabajo. –

+0

Limitar el contexto de seguridad también es bueno, eso es lo que he tratado de usar también. Aunque tengo que admitirlo, con poco éxito. De alguna manera, no puedo encontrar la ACL correcta para usar. ¿Sería mucho pedir una muestra? –

0
  • Limite la memoria disponible a algunos X MB (como parámetro); Usar VMWare o entornos virtuales similares
  • Limite el tiempo de ejecución disponible a algunos X milisegundos (como parámetro). Tenga en cuenta que este es el tiempo del núcleo + tiempo del usuario, pero no el tiempo de inactividad. Por otro lado, el tiempo de inactividad también debe ser limitado para que el programa no pueda dormir() infinitamente.
  • Al finalizar el programa, informe el tiempo de CPU que en realidad pasó; Incluya el código del programa. (Gancho de energía de la CPU
  • Si el programa se bloquea, reportar alguna información sobre el accidente (cuanto más mejor, pero no ir por la borda con trazas de la pila y similares). Construir en el código del programa. (El manejo de excepciones)
  • capturar Preferiblemente toda la salida del programa y el informe que también;. Construir en el código del programa (archivo de registro)
  • el programa se supone que está utilizando sólo el directorio actual, además de tal vez algunos .DLLs obligatorios desde SYSTEM32 (como kernel.dll, user32.dll, etc.). Limite el acceso a cualquier otra cosa tanto como sea posible. Acceda a cosas como regist red no debería ser necesaria (a menos que los .DLL obligatorios lo requieran). Mientras menos acceso, mejor. Incluya el código del programa. (Si su programa no utilizar el registro no va a usarlo.
+0

No quiero modificar las presentaciones de los usuarios. Aquí se les dice a las personas qué compilador con qué opciones se usarán, y dependen de eso. Inyectar mi propio código puede (y probablemente lo hará) crear efectos secundarios inesperados. –

Cuestiones relacionadas