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

Dynamic Linking ~ Limiting a DLL's system access

本文关键字:系统 访问 DLL 限制 链接 动态      更新时间:2023-10-16

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

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

我想给插件有限的访问权限,例如磁盘写入,这样它只能调用我从应用程序传递的API中的函数(并通过我的预定义接口进行写入)。有没有办法从应用程序端强制执行这种行为?

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

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

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

支持插件是一个复杂的过程,最好的开始方式是阅读代码来完成其中的一些工作,铬砂箱是我可以建议的最好的地方,它写得非常干净,并且有很好的文档。幸运的是,代码不是很大。

如果你喜欢较少地参与实际的cgroup,那么有一种更简单的机制来限制资源,docker是一种相当新的机制,但它抽象了低级别的操作系统结构,可以轻松地包含应用程序,而无需在虚拟机中运行它们。

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

看看这个,它可能会让你知道如何禁止函数调用。

你也可以尝试沙盒你的插件,尝试看看一些开源沙盒,了解它们是如何工作的。它应该对你有帮助。

在这种情况下,您必须对运行DLL的环境进行沙盒处理。建造这样一个沙箱一点都不容易,而且这可能是你根本不想做的事情。系统调用可以隐藏在字符串中,也可以在执行时通过元编程生成,因此仅通过分析二进制文件很难检测到。幸运的人已经建立了解决方案。例如,谷歌的项目原生客户端的目标是通常允许C++代码在浏览器中安全运行。当它对浏览器来说足够安全时,它可能对你来说足够安全,而且它可能在浏览器之外工作。