2010-06-12 36 views
11

如何在C#中为外部进程创建沙箱? 作为一个沙箱,我了解一个从C#开始的进程环境,即阻止该进程干扰其他任何内容 - 内核,系统变量,系统配置,内存,注册表,磁盘,硬件,除起始位置之外的位置等等。如何在C#中为外部进程创建沙箱?

我想要在一个地方执行可执行文件,并确保这个地方只能被这个进程改变的地方。此外,可执行文件可以用C,C++,C#等编写。

回答

2

使用Sandboxie作为我认为您希望在某种程度上达到的示例。恕我直言,你将无法做到这一点在托管代码。

如果您希望能够限制应用程序的操作和效果,无论它是托管应用程序还是本地应用程序,甚至是Java应用程序。这意味着您需要监控应用程序采取的每一个行动,并采取适当的行动以确保它不会影响您的系统。适当的操作可能意味着您将应用程序写入重定向到磁盘上的备用位置,编写虚拟化注册表以便真正的注册表不受影响等等。所有这些都需要很多低级别的工作,即托管代码不会今天提供。

注意我说的是纯托管代码,您当然可以使用Interop Services等来利用某些代码区域的非托管实现,或者您可以使用托管C++。但是,根据您希望沙盒执行的具体细节,您可能需要实现一个内核模式驱动程序,以确保您可以充分虚拟化沙盒用户模式应用程序的环境。

+0

你说过重定向到另一个注册表或磁盘位置。如何完整地使用注册表,并且不用重定向?会更简单吗?因为这些应用程序不需要任何这些功能。我只是想阻止他们。 – SuitUp 2010-06-15 12:31:06

+1

@SuitUp,虽然这可能更容易,但仍然需要相同或类似的机制来拦截呼叫并使其失败。这个重要的简化是你不需要虚拟化注册表等,但拦截的复杂性仍然存在。你可以使用像Detours这样的库进行拦截,但说实话,我怀疑这会给你一个健壮和可靠的沙盒解决方案,当然,我假设你需要一个完整的可靠和安全的解决方案,这将需要更多的基本呼叫拦截。 – 2010-06-15 17:06:07

+0

你的假设是正确的。你能给我一些技术细节吗? – SuitUp 2010-07-13 23:03:15

3

如果你只是想运行托管代码,这是很容易用一个AppDomain创建一个沙箱环​​境瓦特/受限制的权限集:

 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来保护您。

注意:该代码示例不是一个工作示例,只是代码的样子。一些w/Evidence和AppDomainSetup可能是必需的,并且考虑到安全性影响,您当然应该研究/测试它。这里有一个关于这个主题的好文章:http://msdn.microsoft.com/en-us/magazine/cc163701.aspx

+1

非托管/不安全代码和一些代码片段如何? – SuitUp 2010-07-14 10:32:48

+1

说实话,我真的不知道从何处开始使用非托管/不安全的代码,并找出需要深入了解Windows操作系统,内核/系统调用,内存分配和访问的几个月的项目。在微软工作的人甚至无法正确使用这些东西。 – 2010-07-18 07:09:37

+1

我的建议:更改您的要求,要么只接受托管代码,要么向用户明确说明他们只应使用他们信任的第三方可执行文件。 除非您只是将流程作为不同的用户运行,在这种情况下请检查ProcessStartInfo类的Domain/UserName/Password属性。 – 2010-07-18 07:18:56