没有简单的解决方案,例如您可以调用 API 来限制进程或线程。
IE 在保护模式下(在 Vista 和 Windows 7 上)所做的是将插件加载到低完整性级别的单独进程中。在低完整性模式下运行的进程对系统资源的访问较少,并且与更高完整性级别的进程更加隔离。您还可以在文件系统对象和注册表项等内容上设置 ACL,以控制低完整性进程是否可以访问它们。这限制了他们可以造成的伤害。这是沙盒或(取决于您定义它的严格程度)虚拟化的一种形式。
要做到这一点需要做很多工作。一个低完整性的过程可能会受到如此限制,以至于它需要帮助才能做很多事情。当 IE 启动保护模式进程时,它会为其提供与主 IE 进程通信的通道。然后,插件可以通过此通道发出请求,以执行诸如更改注册表和写入文件系统之类的操作。IE 考虑请求,如果确定应该允许,IE 进程将代表插件执行此操作。
另一种方法(可用于补充沙盒)是要求使用有效证书对 DLL 进行签名。签名允许您对 DLL 有更多的信任,因为证书标识了责任方。签名还确保没有人篡改 DLL。
另一种方法是挂钩您想要限制的所有操作系统 API 调用。有这方面的库,但该技术依赖于一点操作系统黑客,可能会因任何更新而中断。这个想法是用你的一些代码创建一个进程,为你想要限制的每个 API 设置一个钩子,然后加载不受信任的代码并执行它。如果 DLL 调用挂钩 API(例如,CreateFile
),您的代码将被调用,它可以决定是返回错误还是将调用传递给真正的 OS API。这很困难,因为您必须挂钩的 API 数量可能很大。此外,如果 DLL 知道这是正在使用的技术,它可以做一些事情来颠覆它。
最后,您可以通过根本不运行本机代码来进行真正的沙盒。您无需加载不受信任的 DLL,而是加载已编译为某种中间形式的代码并对其进行解释。这使您的解释器可以完全控制程序可以做什么。这也很难实现,并且大大降低了性能。
如果您要运行不受信任的代码,这些是您必须经历的极端情况。