记忆安全 - 沙盒任意程序?

时间:2011-02-25 16:01:12

标签: security memory-management sandbox native-code

在某些语言中(Java,C#没有不安全的代码,......)它(应该)不可能破坏内存 - 没有手动内存管理等。这允许它们限制资源(访问文件,访问网络) ,最大内存使用,...)非常容易的应用程序 - 例如Java applets(Java web start)。它有时被称为沙盒。

我的问题是:是否可以使用本机程序(例如用内存不安全的语言编写,如C,C ++;但没有源代码)?我不是指简单的可绕过沙箱或反病毒软件。

我想到两种可能性:

  • 以不同的OS用户身份运行应用程序,为该用户设置限制。缺点 - 许多用户,对于每个参数组合,访问权限?
  • (某种程度上)限制(OS API)函数,可以调用 我不知道是否有任何可能性(至少在理论上)可以完全保护,不可能绕过。

编辑:我对理论更感兴趣 - 我不在乎,例如某些操作系统有一些未记录的功能,或者如何在给定的操作系统上沙箱任何应用程序。例如,我想要沙箱应用程序并只允许两个函数:从控制台获取char,将char放到控制台。怎么可能无法破坏,不可能绕过?

提到答案:

  • Google Native Client,在开发中使用x86的子集,以及(可能的?)PNaCl - 可移植的本机客户端
  • 完全虚拟机 - 显然有点过分,想象几十个程序......

换句话说,可以在受限制的环境中使用本机(不安全的存储器访问)代码,例如,在网络浏览器中,100%(至少在理论上)安全性?

Edit2: Google Native Client 正是我想要的 - 任何语言,安全或不安全,以本机速度,沙箱运行,甚至在网络浏览器中运行。每个人都可以在网络或桌面上使用您想要的任何语言。

4 个答案:

答案 0 :(得分:2)

您可能想了解Google的Native Client,它在沙盒中运行x86代码(我现在相信的ARM代码)。

答案 1 :(得分:2)

您在原始问题中几乎描述了AppArmor。有quite a few good videos解释它,我强烈建议观看。

答案 2 :(得分:1)

可能?是。难?也是的。依赖于操作系统的?非常好。

大多数现代操作系统支持各种级别的进程隔离,可用于实现您的需求。最简单的方法是简单地附加调试器并中断所有系统调用;然后在调试器中过滤这些调用。然而,这是一个很大的性能损失,并且在存在多个线程时很难保证安全。在没有记录低级系统调用接口的操作系统上安全实施也很困难 - 例如Mac OS或Windows。

Chrome浏览器的用户在此领域做了大量工作。他们发布了WindowsLinux(特别是the SUID sandbox)和Mac OS X的设计文档。他们的方法很有效但并非完全万无一失 - 外部操作系统和来宾应用程序之间可能仍然存在一些小的信息泄漏。此外,某些操作系统需要对来宾程序进行特定修改才能与沙箱进行通信。

如果对托管应用程序进行了一些修改,Google的native client值得一看。这限制了编译器的代码生成选择,使得加载器可以证明它不会做任何令人讨厌的事情。这显然不适用于任意可执行文件,但它将为您提供本机代码的性能优势。

最后,您始终可以在模拟器中简单地运行有问题的程序,以及整个操作系统。这种方法基本上是万无一失的,但会增加很多开销。

答案 3 :(得分:1)

是的,如果硬件提供限制内存访问的机制,这是可能的。桌面处理器通常配备MMU和访问级别,因此操作系统可以使用这些来拒绝访问线程无法访问的任何内存地址。

虚拟内存通过相同的方式实现:对当前交换到磁盘的内存的任何访问都被捕获,从磁盘获取内存然后继续线程。虚拟化使它更进一步,因为它也会陷入对硬件寄存器的访问。

所有操作系统真正需要做的就是正确使用这些功能,任何代码都不可能突破沙箱。当然,这比实际应用要容易得多。主要是因为操作系统如果有利于性能,可以使用某些操作系统调用的疏忽,并且在实现中持续但并非最不重要的错误,那就是自由。