En realidad, el código de usuario puede hacer cualquier cosa. sería difícil abordar casos especiales. En mi opinión, la mejor manera de hacerlo es:
a) create sandbox appdomain con permiso de ejecución solamente. Esto garantiza muchas cosas como la incapacidad de meterse con el sistema de archivos o realizar llamadas a bibliotecas nativas.
b) cree un nuevo proceso e inicie su dominio de aplicación en él.
Luego monitoree el proceso de manera ajustada para la memoria y el consumo de la CPU. Si algo sale mal, mátalo. Tenga en cuenta que es el proceso que puede matar, no appdomain. Con appdomain puedes intentar descargarlo, pero si el código malicioso se ejecuta en la cláusula finally, entonces no funcionaría.
todavía hay algunos (que yo conozca) problemas con esto:
- tener cuidado de donde se coloca ensamblados compilados por el usuario. En realidad, incluso en el código de usuario del dominio de aplicación menos privilegiado podrá cargar ensamblajes que están en el mismo directorio y ejecutarlos.
- He mencionado que debe controlar el proceso estrechamente. Código (ejecutándose en la cláusula finally) que engendra hilos en bucle infinito, donde cada hilo hace la misma captura de memoria extremadamente rápido (en mis observaciones). si un atacante decide hacer dos ataques con dicho código, quién sabe qué sucede :) Tal vez una forma de aprovechar esto es iniciar el proceso del usuario con baja prioridad para que los hilos de supervisión tengan la posibilidad de una supervisión adecuada en un sistema cargado.
Así que, en general, hay un riesgo de todos modos. Yo estaba jugando con esta idea también y aquí está el resultado actual: rundotnet
que conocer la naturaleza de la cuestión probablemente no es muy StackExchange-ish, por lo que figura Voy a aceptar la respuesta más completa. –
¿No tiene esencialmente el mismo mecanismo de seguridad que Java? –
¿Terminaste tu intérprete? – Shimmy