3

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

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

我想到了两种可能:

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

编辑:我对理论更感兴趣——我不在乎某些操作系统具有一些未记录的功能,或者如何在给定操作系统上对任何应用程序进行沙箱处理。例如,我想沙箱应用程序并只允许两个功能:从控制台获取字符,将字符放入控制台。怎么可能做到牢不可破,没有绕过的可能?

提到的答案:

  • Google Native Client,使用 x86 的子集 - 正在开发中,以及(可能?) PNaCl - 便携式本机客户端
  • 完整的虚拟机 - 显然是矫枉过正,想象一下数十个程序......

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

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

4

4 回答 4

2

您在原始问题中几乎描述了AppArmor。有很多很好的视频解释它,我强烈推荐观看。

于 2011-02-25T17:44:27.643 回答
2

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

于 2011-02-25T16:04:33.797 回答
1

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

大多数现代操作系统支持各种级别的进程隔离,可用于实现您想要的。最简单的方法是简单地附加一个调试器并中断所有系统调用;然后在调试器中过滤这些调用。然而,这会对性能造成很大影响,并且在存在多个线程的情况下很难保证安全。在没有记录低级系统调用接口的操作系统(例如 Mac OS 或 Windows)上也很难安全地实现。

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

如果可以接受对托管应用程序的一些修改,Google 的本机客户端值得一看。这限制了编译器的代码生成选择,使得加载器可以证明它没有做任何讨厌的事情。这显然不适用于任意可执行文件,但它会让您获得本机代码的性能优势。

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

于 2011-02-25T16:08:48.900 回答
1

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

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

操作系统真正需要做的就是正确使用这些功能,并且任何代码都不可能突破沙箱。当然,这说起来比实际应用要容易得多。主要是因为操作系统会在有利于性能的情况下自由发挥,疏忽某些操作系统调用可以用来做什么,最后但并非最不重要的是实现中的错误。

于 2011-02-25T19:54:31.507 回答