2010-06-12 12 views
11

Cómo crear un entorno limitado en C# para un proceso externo? Como sandbox entiendo un entorno para el proceso, empiezo desde C#, que impide que el proceso interfiera con cualquier otra cosa: kernel, variables del sistema, configuración del sistema, memoria, registro, disco, hardware, ubicación que no sea de inicio, etc.Cómo crear un entorno limitado en C# para un proceso externo?

Quiero lugar ejecutable en un solo lugar y asegúrese de que este lugar es el único lugar que puede ser cambiado por este proceso. Además, el ejecutable se puede escribir en C, C++, C# y etc.

Respuesta

2

Utilizando Sandboxie como un ejemplo de lo que creo que quiere lograr hasta cierto punto. En mi humilde opinión, no podrá hacer esto en puro código administrado.

Si desea poder limitar qué acciones y el efecto de una aplicación independientemente de si se trata de una aplicación administrada o nativa o incluso de Java. La implicación es que tendrá que supervisar cada acción tomada por la aplicación y tomar las medidas apropiadas para asegurarse de que no afecte su sistema. La acción adecuada podría significar que redirija la escritura de la aplicación a una ubicación alternativa en el disco, escriba un registro virtualizado para que el registro real no se vea afectado, etc. etc. Todo esto requerirá mucho trabajo de bajo nivel que el código administrado no proporcionar hoy

Nota Dije que el código administrado puro, por supuesto, puede utilizar Interop Services etc. para aprovechar la implementación no administrada de ciertas áreas de código, o puede usar C++ administrado. Sin embargo, dependiendo de los detalles exactos de lo que quiere que su sandbox haga, probablemente necesite implementar un controlador de modo kernel para asegurarse de que pueda virtualizar suficientemente el entorno para las aplicaciones de modo de usuario de espacio aislado.

+0

Dijiste sobre la redirección a otro registro o ubicación de disco. ¿Qué tal el uso de bloque completo del registro, y no te molestes con la redirección? ¿Será más simple? Porque esas aplicaciones no necesitan ninguna de esas funcionalidades. Solo quiero bloquearlos. – SuitUp

+1

@SuitUp, aunque esto quizás sea más fácil, se sigue necesitando un mecanismo igual o similar para interceptar las llamadas y fallarlas. La simplificación que es significativa es que no necesita virtualizar el registro, etc., pero la complejidad de la interceptación aún está presente. Puede usar una biblioteca como Detours para la intercepción, pero para ser sincero, dudo que esto le proporcione una solución de recinto de seguridad robusta y confiable, por supuesto, supongo que necesita una solución confiable y segura completa, que requeriría más que una simple interceptación de llamadas. . –

+0

Su suposición es correcta. ¿Me puede dar algunos detalles técnicos? – SuitUp

3

Si sólo desea ejecutar código administrado, es relativamente fácil crear un entorno de recinto de seguridad utilizando un dominio de aplicación w/un conjunto de permisos restringidos:

 PermissionSet ps = new PermissionSet(PermissionState.None); 
     // ps.AddPermission(new System.Security.Permissions.*); // Add Whatever Permissions you want to grant here 

     AppDomainSetup setup = new AppDomainSetup(); 
     Evidence ev = new Evidence(); 

     AppDomain sandbox = AppDomain.CreateDomain("Sandbox", 
      ev, 
      setup, 
      ps); 

     sandbox.ExecuteAssembly("ManagedAssembly.exe"); 

Pero tan pronto como se abre la puerta a no gestionado/insegura El código de todas las apuestas está desactivado y es muy difícil obtener un código de terceros. Como se ha mencionado, básicamente tiene que crear una brecha entre el código de ejecución y el sistema operativo para limitar lo que puede hacer, a menos que sea suficiente para ejecutarlo como un usuario restringido y depender solo de las ACL/UAC para protegerlo.

NOTA: ese ejemplo de código no es una muestra de trabajo, solo una idea de cómo se vería el código. Es probable que sea necesario recurrir a algunas trampas con Evidence y AppDomainSetup, y ciertamente debería investigar/probar de manera sorprendente teniendo en cuenta las implicaciones de seguridad. Aquí hay un buen artículo sobre el tema: http://msdn.microsoft.com/en-us/magazine/cc163701.aspx

+1

¿Qué hay de código no administrado/inseguro y algunos fragmentos de código? – SuitUp

+1

Para ser honesto, realmente no sabría por dónde empezar con un código no administrado/inseguro, y descubrirlo sería un proyecto de varios meses que requeriría una comprensión profunda del SO Windows, Kernel/System calls, Memory Allocation y access. Las personas que trabajan en Microsoft ni siquiera pueden hacer estas cosas bien. –

+1

Mi consejo: modifique sus requisitos, solo acepte el código administrado o deje en claro a los usuarios que solo deben usar ejecutables de terceros en los que confíen. A menos que solo signifique ejecutar un proceso como un usuario diferente, en cuyo caso revise las propiedades de dominio/nombre de usuario/contraseña de la clase ProcessStartInfo. –

Cuestiones relacionadas