如何使用.NET以编程方式沙箱化进程

时间:2016-11-21 21:58:03

标签: .net security process sandbox

我打算设计一个系统,它基本上允许用户在我的机器上运行PHP,Ruby等脚本代码。我想沙箱来访问机器的关键方面。 .NET API可用于此目的?我计划从主进程创建一个子进程,并希望以编程方式从主进程中对子进程进行沙盒处理。感谢。

1 个答案:

答案 0 :(得分:2)

设计(用户模式)沙箱是一项艰巨的挑战,需要深入了解底层操作系统(换句话说:使用现有解决方案可能比重新发明轮子更可取。)

在.NET中出现的隔离级别(如AppDomains)不适合您的场景。您需要从较低级别开始,并且可能会考虑使用以下方法之一来运行具有对主机的受限访问权限的应用程序。

Windows完整性机制

运行具有对系统的受限访问权限的程序的一种简单方法是利用Windows完整性机制,这是一种方法,例如,保护模式下的Internet Explorer或Microsoft Office是隔离的。该机制不是为提供完全隔离的沙箱而设计的,但在基本情况下可能就足够了。文档states

  

Windows完整性机制不适用于应用程序沙箱。但是,它可以是应用程序开发人员用来限制不太可靠的应用程序行为的安全工具之一。

完整性机制主要限制写入权限,但它不会抑制或阻止在任何更高级别读取数据。

启动具有最低完整性级别的进程就像将descibred here更改为可执行映像的ACL一样简单,然后启动该程序:

  1. 设置完整性级别:

    icacls myprogram.exe /setintegritylevel Low
    
  2. 启动现在以最低完整性级别运行的程序(使用Process Explorer等工具可以看到):

    myprogram.exe
    
  3. 如链接文章中所述,您还可以以编程方式启动低完整性的新进程(不使用.NET,而是使用P /调用Windows API)。本文还提供了关于低级程序如何设计工作的提示(例如哪些位置是可写的等)。

    容器

    像Docker这样的容器解决方案提供了更高级别的隔离,这是通过添加一些操作系统级别的障碍来实现的,但是某些资源(如内核)仍然是共享的(从而带来了一定的恶意代码逃离沙箱的风险)。

    虚拟化

    虚拟化提供更高级别的隔离:整个系统在隔离的VM中运行,并且只能通过专用接口(例如,开放TCP端口)访问。虚拟化方法提供了最高的安全性,并且对于大多数情况而言,可以认为逃避VM足够困难(尽管可能存在管理程序中的漏洞并且可能利用某些相当复杂的攻击来利用漏洞)。

    与容器的区别在于,您从一个几乎完全隔离的系统开始,在该系统中,您只打开到主机系统的特定专用通信通道。相比之下,对于容器,您共享相同的系统并根据需要构建隔离来隔离访客。这样做的缺点是更容易忘记某些事情。

    在Information Security Stackexchange站点的帖子中进一步讨论了该问题: Docker as a sandbox for untrusted code