2

让我们猜测在我的应用程序中,我允许使用 LoadLibrary WIN32 加载 DLL。由于我不知道该 DLL 的代码,它可能是恶意的。所以我的问题是,有什么方法可以告诉 Windows 对该 DLL 应用一些限制(例如磁盘访问、读取密码或其他潜在的危险数据读/写访问)?

这样,每当 DLL 代码尝试访问磁盘时,就会生成异常或调用的方法返回一些错误。避免使用 javascript 或其他脚本解释代码而不是编译 & 链接 & 高效的代码可能很有用。

是否存在我可以使用的任何类似机制?

ex1 : RestrictAccess(GetProcAdress( ... ), size ); // 通过代码访问内存

ex2:thread1.loadLibrary(文件);限制访问(线程 1);// 通过线程访问

ETC...

4

4 回答 4

1

可以使用模拟在每个线程的基础上增加特权,但永远不会减少(因为不受信任的代码总是可以这样做RevertToSelf)。

较低权限的最小单位是进程。是的,有一个 API CreateProcessAsUser:. 您可以使用管道将数据传输到/从不受信任的进程。

或者,您可以使用 DCOM 调用 DLL 中对象的方法。您可以指定凭据,然后操作系统将使用这些凭据设置辅助进程并来回编组数据。

于 2011-03-20T16:40:29.437 回答
1

您可以从 DLL 文件中读取名称。通过这种方式,您可以确定它链接到的其他 DLL 以及它使用的外部函数(例如 Windows API)。您可以创建一个白名单,只允许从该 DLL 调用您的函数,这样您就必须为插件可以合法访问的所有内容创建包装函数。

于 2011-03-20T16:41:12.380 回答
1

没有简单的解决方案,例如您可以调用 API 来限制进程或线程。

IE 在保护模式下(在 Vista 和 Windows 7 上)所做的是将插件加载到低完整性级别的单独进程中。在低完整性模式下运行的进程对系统资源的访问较少,并且与更高完整性级别的进程更加隔离。您还可以在文件系统对象和注册表项等内容上设置 ACL,以控制低完整性进程是否可以访问它们。这限制了他们可以造成的伤害。这是沙盒或(取决于您定义它的严格程度)虚拟化的一种形式。

要做到这一点需要做很多工作。一个低完整性的过程可能会受到如此限制,以至于它需要帮助才能做很多事情。当 IE 启动保护模式进程时,它会为其提供与主 IE 进程通信的通道。然后,插件可以通过此通道发出请求,以执行诸如更改注册表和写入文件系统之类的操作。IE 考虑请求,如果确定应该允许,IE 进程将代表插件执行此操作。

另一种方法(可用于补充沙盒)是要求使用有效证书对 DLL 进行签名。签名允许您对 DLL 有更多的信任,因为证书标识了责任方。签名还确保没有人篡改 DLL。

另一种方法是挂钩您想要限制的所有操作系统 API 调用。有这方面的,但该技术依赖于一点操作系统黑客,可能会因任何更新而中断。这个想法是用你的一些代码创建一个进程,为你想要限制的每个 API 设置一个钩子,然后加载不受信任的代码并执行它。如果 DLL 调用挂钩 API(例如,CreateFile),您的代码将被调用,它可以决定是返回错误还是将调用传递给真正的 OS API。这很困难,因为您必须挂钩的 API 数量可能很大。此外,如果 DLL 知道这是正在使用的技术,它可以做一些事情来颠覆它。

最后,您可以通过根本不运行本机代码来进行真正的沙盒。您无需加载不受信任的 DLL,而是加载已编译为某种中间形式的代码并对其进行解释。这使您的解释器可以完全控制程序可以做什么。这也很难实现,并且大大降低了性能。

如果您要运行不受信任的代码,这些是您必须经历的极端情况。

于 2011-03-20T16:35:56.270 回答
1

典型的解决方案是只允许使用可以被沙盒(例如 Lua)编译的解释语言或字节码的插件。一些操作系统会做出这样的限制(例如 iOS 和 Android),但我不相信在加载原生 Windows DLL 时你会发现这样的功能。

于 2011-03-20T16:37:21.343 回答