把一个进程放在沙箱里,这样做可以把危害降到最小

我正在寻找这样一个概念来产生一个过程

  • 它只能访问某些库/ API
  • 它不能访问文件系统或只有特定的部分
  • 如果恶意代码在其中运行,可以造成的伤害最小

这个概念被称为沙箱或监狱。

每个主要操作系统(Windows,MacOSX和Linux)都需要这样做,问题是概念性的(比如在做什么, 使用哪些API以及观察什么 ),而不是语言特定的。

回答要求

真的想接受一个答案,并给你20分。 我不能接受我自己的答案,反正我也没有答案。 所以,如果你真的希望你的答案被接受,请注意:

  • 答案必须是具体和完整的
  • 与具体我的意思是,这是更多的是指向互联网上的一些资源。 至less要总结一下资源对于这个话题所说的话。
  • 它可能包含或不包含示例代码,但如果它确实请写在C中
  • 我不能接受2/3完成的答案,即使那里的2/3是完美的。

这个问题的FAQ

  • 这功课吗? 没有。
  • 你为什么这样问一个作业的问题? 如果你问一个具体的问题,你想得到一个具体的答案,你知道答案应该是什么样子,即使你不知道答案,这是你得到的问题的风格。
  • 如果你知道它应该是什么样子,你为什么要问? 1)因为我不知道所有的答案2)因为在互联网上没有一个单一的地方包含了这个问题的所有细节在一个地方。 请同时阅读stackoverflow常见问题
  • 为什么你的问题的主要部分如何回答这个问题? 因为没有人阅读FAQ。

Mac OS X有一个代号为Seatbelt的沙箱设施。 公共API在沙盒(7),sandbox_init(3)和相关的手册页中进行了介绍。 公共API是有限的,但设施本身是非常强大的。 虽然公共API只允许您从某些预定义的沙箱中进行选择(例如“禁止所有基于套接字的网络连接”),但您也可以使用功能更强大的底层实现,以便您可以准确指定哪些操作系统资源可用类似计划的语言。 例如,以下是用于portmap的沙箱摘录:

(allow process-exec (regex #"^/usr/sbin/portmap$")) (allow file-read-data file-read-metadata (regex #"^/etc" #"^/usr/lib/.*\.dylib$" #"^/var" #"^/private/var/db/dyld/" #"^/dev/urandom$")) (allow file-write-data (regex #"^/dev/dtracehelper$")) 

您可以在/ usr / share / sandbox中看到系统使用的许多沙箱。 使用sandbox-exec(1)命令可以很容易地尝试使用沙盒。

对于Windows,您可能需要查看David LeBlanc在Black Hat USA 2007上的“Practical Sandboxing”演讲 。 Windows本身没有内置的沙盒技术,因此所描述的技术利用了Windows 2000中引入的称为SAFER的不完整机制。 通过使用受限令牌,可以创建对操作系统资源的访问权限有限的进程。

对于Linux,您可以调查复杂的SELinux机制: SELinux home , 一个HOWTO 。 例如,Red Hat使用它来加强某些产品中的一些系统服务。

对于Windows,Google Chrome中有一个沙箱。 你可能想要调查它。 它使用自由的BSD类许可证。

对于Linux来说,会有很好的旧chroot或更复杂的http://plash.beasts.org/wiki/

因为Leopard有一些类似SELinux的保护。

该网站codepad.prg有一个很好的“关于”页面,他们如何安全地允许任何代码片段的执行..

代码执行由基于geordi的主管处理。 策略是在ptrace下运行一切,许多系统调用不允许或忽略。 编译器和最终的可执行文件都在一个chroot监狱里执行,并且有严格的资源限制。 主管是用Haskell编写的。

当您的应用程序是远程执行代码时,您必须预料到安全问题。 我不是只依赖chroot和ptrace主管,而是采取了一些额外的预防措施:

  • 主管进程在虚拟机上运行,​​这些虚拟机受到防火墙限制,从而无法建立传出连接。

  • 运行虚拟机的机器也是防火墙,并定期从源图像中恢复。

如果你真的想要一种可以在所有这些平台上工作的技术,而不是为每个平台单独的解决方案,那么我认为你唯一的答案就是为每个测试环境设置一个虚拟机。 您可以随时恢复到快照。

使用虚拟化的另一大优势是,您可以将所有测试环境与其客户操作系统全部放在同一个盒子中。

FreeBSD具有特定的jail概念,Solaris有容器 。 根据你在找什么,这可能会有所帮助。

chroot监狱可以帮助限制应用程序可以做什么(尽管任何具有root特权的应用程序都可以逃脱监禁),并且它们在大多数UNIX上都可用,包括OS X.

至于Windows,我不确定。 如果有一个简单的方法来沙盒的Windows应用程序,现在,我相信大部分将更安全。

对于Linux,有AppArmor 。 不幸的是,这个项目有些中断。
另一种沙箱选择是使用虚拟化的Vserver 。

在Windows(2000和更高版本)上,您可以使用Job对象来限制进程。

我不是这方面的专家,但我认为linux的标准答案是定义一个SeLinux策略,具有正确的过程能力。

一般来说,任何虚拟专用服务器都将执

Linux Vserver http://linux-vserver.org/Welcome_to_Linux-Vserver.org

Parallels Virtuozzo Containers http://www.parallels.com/products/pvc/

正如所提到的,FreeBSD和Solaris有自己的实现。

哦。 其实我注意到你要求它在任何操作系统上工作。 那么,这可能会有点复杂,因为我认为更少的努力只是重用一些虚拟机,可以支持一定程度的沙盒,如:

  • Java的
  • 。净