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