将进程放在沙箱中,它可以造成最小的伤害

时间:2008-09-25 20:24:57

标签: windows linux security language-agnostic macos

我正在寻找生成流程的概念,以便:

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

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

每个主要操作系统(Windows,MacOSX和Linux)需要执行此,问题是概念性的(如何做,要使用哪些API以及使用哪些API观察而不是语言特定。

回答要求

真的想要接受答案,并为此给你20分。我不能接受我自己的答案,反正我还没有。因此,如果您真的希望接受您的答案,请注意:

  • 答案必须具体而完整
  • 具体来说,我的意思是它更像是指向互联网上某些资源的指针。它必须至少总结资源对该主题的看法。
  • 它可能包含也可能不包含示例代码,但如果确实如此,请在C
  • 中编写
  • 我不能接受2/3完成的答案,即使那里的2/3是完美的。

此问题常见问题解答

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

9 个答案:

答案 0 :(得分:14)

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’s “Practical Sandboxing” talk given at Black Hat USA 2007。 Windows本身没有内置的沙盒技术,因此所描述的技术利用了Windows 2000引入的一种称为SAFER的不完整机制。通过使用受限制的令牌,可以创建一个对操作系统资源具有有限访问权限的进程。

对于Linux,您可以研究复杂的SELinux机制: SELinux homea HOWTO。例如,Red Hat使用它来强化某些产品中的某些系统服务。

答案 1 :(得分:7)

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

对于Linux来说,有一个好老的chroot或更复杂的http://plash.beasts.org/wiki/

OS X,因为Leopard提供了类似SELinux的保护。

答案 2 :(得分:5)

网站codepad.prg有一个很好的"About"页面,介绍了如何安全地允许执行任何代码段。

  

代码执行由基于geordi的主管处理。策略是在ptrace下运行所有​​内容,不允许或忽略许多系统调用。编译器和最终可执行文件都在chroot jail中执行,具有严格的资源限制。主管是用Haskell编写的。

     

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

     
      
  • 管理程序进程在虚拟机上运行,​​这些虚拟机具有防火墙,因此无法进行传出连接。

  •   
  • 运行虚拟机的计算机也经过严密防火墙处理,并定期从源映像中恢复。

  •   

答案 3 :(得分:2)

FreeBSD具有jails的特定概念,Solaris具有containers。根据您的需求,这些可能有所帮助。

chroot jails可以帮助限制应用程序可以执行的操作(尽管任何具有root权限的应用程序都可以逃脱监狱),并且它们在大多数UNIXen上都可用,包括OS X.

至于Windows,我不确定。如果有一种简单的方法来沙盒化Windows应用程序,那么现在大多数都会更加安全,我敢肯定。

答案 4 :(得分:2)

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

答案 5 :(得分:2)

如果您真的想要一种适用于所有这些平台的技术,而不是针对每个平台的单独解决方案,那么我认为您唯一的答案是为每个测试环境设置虚拟机。您可以随时还原到快照。

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

答案 6 :(得分:1)

对于Linux,有AppArmor。不幸的是,这个项目有点间断 另一种沙盒替代方案是VServer,它使用虚拟化。

答案 7 :(得分:0)

我不是这方面的专家,但我认为linux的标准答案是定义具有适当流程功能的SeLinux策略。

答案 8 :(得分:0)

通常任何虚拟专用服务器都可以:

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

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

并且如前所述,FreeBSD和Solaris都有自己的实现。

喔。实际上我已经注意到你要求它在任何操作系统上工作。好吧,这可能有点复杂,因为我认为只需重用一些可以支持某种程度的沙盒的VM就可以了:

  • 爪哇
  • .NET