如何在C#中为外部进程创建沙箱? 作为沙箱,我理解一个从C#开始的进程环境,它阻止该进程干扰其他任何事情 - 内核,系统变量,系统配置,内存,注册表,磁盘,硬件,起始位置以外的位置等等。
我想在一个地方放置可执行文件,并确保这个地方只是可以通过此过程更改的地方。另外,可执行文件可以用C,C ++,C#等编写。
答案 0 :(得分:5)
如果您只想运行托管代码,使用具有受限权限集的AppDomain创建Sandbox环境相对容易:
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");
但是一旦你打开通往非托管/不安全代码的大门,所有的赌注都会被取消,并且保证第三方代码变得非常困难。如前所述,您基本上必须在执行代码和操作系统之间创建一个垫片以限制它可以执行的操作,除非它足以作为受限用户运行并且仅依靠ACL / UAC来保护您。
注意:该代码示例不是工作示例,只是了解代码的外观。有些人可能需要使用Evidence和AppDomainSetup,并且考虑到安全隐患,你当然应该研究/测试它。这是一篇关于这个主题的好文章:http://msdn.microsoft.com/en-us/magazine/cc163701.aspx
答案 1 :(得分:2)
使用Sandboxie作为我认为您希望在某种程度上实现的示例。恕我直言,您将无法在纯托管代码中执行此操作。
如果您希望能够限制应用程序的操作和效果,无论它是托管应用程序还是本机应用程序,甚至是Java应用程序。这意味着您需要监视应用程序采取的每个操作,并采取适当的操作以确保它不会影响您的系统。相应的操作可能意味着您将应用程序写入重定向到磁盘上的备用位置,编写虚拟化注册表以便真正的注册表不受影响等等。所有这些都需要大量低级别的工作,托管代码不会今天提供。
注意我说的是纯托管代码,您当然可以使用Interop Services等来利用某些代码区域的非托管实现,或者您可以使用托管C ++。但是,根据您希望沙盒执行的具体细节,您可能需要实现内核模式驱动程序,以确保您可以充分虚拟化沙盒用户模式应用程序的环境。