让我们在我的应用程序中猜测我允许使用LoadLibrary WIN32加载DLL。由于我不知道该DLL的代码,它可能是恶意的。所以我的问题是,有一些方法可以告诉Windows对该DLL应用一些限制(例如磁盘访问,读取密码或其他潜在的危险数据读/写访问)?
这样,只要DLL代码尝试访问磁盘,就会生成异常,或者调用该方法会返回一些错误。避免使用javascript或其他脚本解释代码而不是编译和放大可能是有用的。联系与联系高效的。
是否存在我可以使用的任何类似机制?
ex1 :RestrictAccess(GetProcAdress(...),size); //通过代码存储器访问
ex2 :thread1.loadLibrary(file); RestrictAccess(thread1); //通过线程访问
等...
答案 0 :(得分:1)
没有简单的解决方案,例如您可以调用的API来限制进程或线程。
IE在保护模式下(在Vista和Windows 7上)的作用是将插件加载到低integrity level的单独进程中。以低完整性模式运行的进程对系统资源的访问较少,并且与更高完整性级别的进程更加隔离。您还可以在文件系统对象和注册表项之类的设置上设置ACL,以控制低完整性进程是否可以访问它们。这限制了他们可以做的伤害量。这是一种沙盒形式或(取决于您如何严格定义)虚拟化。
要做到这一点,还有很多工作要做。低完整性过程可能会受到限制,以至于需要帮助才能完成大部分任务。当IE启动受保护模式进程时,它为其提供了一个用于与主IE进程通信的通道。然后,插件可以通过此通道发出请求,例如进行注册表更改和写入文件系统。 IE会考虑这些请求,如果它确定应该允许,那么IE进程将代表该插件执行此操作。
另一种方法(可用于补充沙盒)是要求使用有效证书对DLL进行签名。签名允许您对DLL更加信任,因为证书标识了一个责任方。签名还确保没有人篡改DLL。
另一种方法是挂钩您想要限制的所有OS API调用。这有libraries,但该技术依赖于一些可能在任何更新中破坏的OS hackery。我们的想法是创建一个进程,其中包含一些代码,这些代码为您要限制的每个API设置一个钩子,然后加载不受信任的代码并执行它。如果DLL调用一个钩子API(例如,CreateFile
),那么代码将被调用,它可以决定是返回错误还是将调用传递给真正的OS API。这很困难,因为你必须挂钩的API数量可能很大。此外,如果DLL知道这是正在使用的技术,那么可以采取一些措施来破坏它。
最后,您可以通过不运行本机代码来执行真正的沙盒操作。您可以加载已编译为某种中间形式并解释它的代码,而不是加载不受信任的DLL。这使您的解释器可以完全控制程序可以执行的操作。这也很难实现,并且大大降低了性能。
如果您要运行不受信任的代码,这些是您必须经历的极端情况。
答案 1 :(得分:1)
典型的解决方案是仅允许使用解释语言的插件或编译的可以沙箱化的字节代码(例如Lua)。某些操作系统会进行此类限制(例如iOS和Android),但我不相信您在加载本机Windows DLL时会发现此类功能。
答案 2 :(得分:1)
使用模拟可以在每个线程的基础上增加权限,但从不减少权限(因为不受信任的代码总是可以RevertToSelf
)。
较低权限的最小单位是流程。是的,有一个API:CreateProcessAsUser
。您可以使用管道向不受信任的进程传输数据。
或者您可以使用DCOM调用DLL中对象的方法。您可以指定凭据,然后操作系统将使用这些凭据设置辅助进程并来回封送数据。
答案 3 :(得分:1)
您可以从DLL文件中读取名称。通过这种方式,您可以确定它链接的其他DLL以及它使用的外部函数(例如Windows API)。您可以创建一个白名单,只允许从该DLL调用您的函数,这样您就必须为插件可以合法访问的所有内容创建包装函数。