如何在C#中为外部流程创建沙盒?

如何在C#中为外部流程创建沙盒?,c#,sandbox,C#,Sandbox,如何在C#中为外部流程创建沙盒? 作为sandbox,我了解从C#开始的进程的环境,它阻止进程干扰其他任何东西——内核、系统变量、系统配置、内存、注册表、磁盘、硬件、起始位置以外的位置等等 我希望将可执行文件放在一个地方,并确保这个地方是这个过程唯一可以更改的地方。另外,可执行文件可以用C、C++、C等编写,< P>作为我想在一定程度上实现的一个例子。恕我直言,您将无法在纯托管代码中执行此操作 如果您希望能够限制应用程序的操作和效果,而不管它是托管应用程序还是本机应用程序,甚至是Java应用程序

如何在C#中为外部流程创建沙盒? 作为sandbox,我了解从C#开始的进程的环境,它阻止进程干扰其他任何东西——内核、系统变量、系统配置、内存、注册表、磁盘、硬件、起始位置以外的位置等等

我希望将可执行文件放在一个地方,并确保这个地方是这个过程唯一可以更改的地方。另外,可执行文件可以用C、C++、C等编写,

< P>作为我想在一定程度上实现的一个例子。恕我直言,您将无法在纯托管代码中执行此操作

如果您希望能够限制应用程序的操作和效果,而不管它是托管应用程序还是本机应用程序,甚至是Java应用程序。这意味着您需要监视应用程序执行的每个操作,并采取适当的操作以确保它不会影响您的系统。适当的操作可能意味着您将应用程序写入重定向到磁盘上的一个备用位置,写入一个虚拟化注册表以使真实注册表不受影响等等。所有这些都需要大量托管代码目前没有提供的低级工作


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

如果您只想运行托管代码,那么使用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来保护您


注意:该代码示例不是一个工作示例,只是一个关于代码外观的想法。一些欺骗的证据和AppDomainSetup可能是必要的,考虑到安全问题,您当然应该研究/测试它。这是一篇关于这个主题的好文章:

您说过要重定向到另一个注册表或磁盘位置。注册表的完全块使用如何,而不必担心重定向?会更简单吗?因为这些应用程序不需要任何这些功能。我只想阻止它们。@SuitUp,虽然这可能更容易,但仍然需要相同或类似的机制来拦截调用并使其失败。重要的简化是,您不需要虚拟化注册表等,但拦截的复杂性仍然存在。您可以使用类似库的迂回路线进行拦截,但老实说,我怀疑这是否会为您提供一个健壮可靠的沙盒解决方案,当然我假设您需要一个完整可靠的安全解决方案,这需要的不仅仅是基本的呼叫拦截。您的假设是正确的。你能给我一些技术细节吗?老实说,我真的不知道从哪里开始使用非托管/不安全代码,弄明白这一点需要几个月的时间,需要深入了解Windows操作系统、内核/系统调用、内存分配和访问。在微软工作的人甚至不能正确理解这一点。我的建议是:改变你的要求,要么只接受托管代码,要么让你的用户明白他们应该只使用他们信任的第三方可执行文件。除非你只是想以不同的用户身份运行一个进程,在这种情况下,请查看ProcessStartInfo类的域/用户名/密码属性。问题是,我不能只接受托管代码(性能,我大多数时候需要纯c),整个想法是使用第三方可执行文件。这是整个系统的主要用途。我现在该怎么办?提出新问题还是什么?