动态链接〜限制DLL的系统访问

时间:2015-02-05 17:06:15

标签: c++ dll plugins dynamic-linking

我知道这个问题可能看起来有点模糊,但我会尽可能清楚地解释。

在C ++中,有一种方法可以将代码动态链接到已经运行的程序。我正在考虑创建自己的插件系统(用于学习/研究目的),但出于安全考虑,我想将插件限制为特定的系统访问。

我想给插件提供有限的访问权限,例如磁盘写入,这样它只能调用我从我的应用程序传递的API函数(并通过我的预定义接口写入)是否有办法强制执行此类行为申请方?

如果没有:是否有其他支持安全动态链接模块的语言?

3 个答案:

答案 0 :(得分:2)

您应该考虑编写一个插件容器(或沙盒),然后通过容器协调所有内容,同时确保在运行插件之前删除容器进程中不需要的权限。在进程中运行意味着,您也可以作为唯一用户运行容器,而不是启动进程的用户,之后您可以限制用户并自动限制进程。拥有流程的专用用户是最常见和最简单的方法,它也是限制流程的唯一跨平台方式,即使在Windows上,您也可以使用此方法来限制流程。

限制对操作系统提供的共享资源的访问权限,如磁盘,RAM或CPU在很大程度上取决于操作系统,并且您尚未指定操作系统。虽然它在大多数操作系统上都可行,但Linux是首选,因为它是在考虑多座位和服务器用例的情况下编写的。例如,在Linux中,您可以使用cgroups here轻松限制每个进程的CPU或RAM,然后您只需将它应用于您的插件容器进程。有blkio来控制磁盘访问,但您仍然可以使用Linux中的传统quote机制来限制每个进程或每用户共享的磁盘空间。

支持插件是一个参与的过程,最好的方法是阅读执行其中一些操作的代码,Chromium sand-boxing是我可以建议的最佳位置,编写得非常干净,文档很好。幸运的是code并不是很大。

如果您更少参与实际的cgroup,那么有一种更简单的资源限制机制,docker相当新,但抽象出低级操作系统结构以轻松包含应用程序,而无需在虚拟环境中运行它们机等。

答案 1 :(得分:0)

要阻止某些调用,第一个想法可能是挂钩被禁止的系统调用和其他您不想要的API调用。您还可以挂钩动态链接调用以防止插件加载另一个DLL。挂钩磁盘读/写API以阻止读/写。

看看this,它可能会让您知道如何禁止函数调用。

您也可以尝试沙盒插件,尝试查看一些开源沙箱并了解它们的工作原理。它应该对你有帮助。

答案 2 :(得分:0)

在这种情况下,你真的必须在DLL运行的环境中沙箱。建造这样的沙箱并不容易,而且你可能根本不想做这件事。系统调用可以隐藏在字符串中,也可以在执行时通过元编程生成,因此只需分析二进制文件就很难检测到。幸运的是人们已经建立了解决方案。例如google的项目native client,其目标通常是允许C ++代码在浏览器中安全运行。当它对于浏览器来说足够安全时,它对您来说可能足够安全,它可能会起作用outside of the browser