动态链接 ~ 限制 DLL 的系统访问
Dynamic Linking ~ Limiting a DLL's system access
我知道这个问题可能看起来有点模糊,但我会尽量解释清楚。
在C++中,有一种方法可以将代码动态链接到已经运行的程序。我正在考虑创建自己的插件系统(出于学习/研究目的),但出于安全目的,我想将插件限制在特定的系统访问范围内。
我想给插件有限的访问权限,例如磁盘写入,这样它只能调用我从应用程序传递的API中的函数(并通过我的预定义接口进行写入)。有没有办法从应用程序端强制执行这种行为?
如果没有:是否有其他语言支持安全动态链接模块?
您应该考虑编写一个插件容器(或沙盒),然后通过容器协调所有内容,并确保在运行插件之前将不需要的权限放入容器进程中。在流程中运行意味着,您也可以作为唯一用户而不是启动流程的用户来运行容器,之后您可以限制用户,流程将自动受到限制。为进程指定一个专用用户是最常见和最简单的方法,也是限制进程的唯一跨平台方法,即使在Windows上,您也可以使用此方法来限制进程。
限制对操作系统提供的共享资源(如磁盘、RAM或CPU)的访问在很大程度上取决于操作系统,并且您没有指定什么操作系统。虽然它在大多数操作系统上都是可行的,但Linux是首选,因为它是在考虑多座位和服务器用例的情况下编写的。例如,在Linux中,您可以在这里使用cgroups来限制每个进程的CPU或RAM,然后您只需要将其应用于插件容器进程。有blkio
来控制磁盘访问,但您仍然可以在Linux中使用传统的报价机制来限制每个进程或每个用户的磁盘空间共享。
支持插件是一个复杂的过程,最好的开始方式是阅读代码来完成其中的一些工作,铬砂箱是我可以建议的最好的地方,它写得非常干净,并且有很好的文档。幸运的是,代码不是很大。
如果你喜欢较少地参与实际的cgroup,那么有一种更简单的机制来限制资源,docker是一种相当新的机制,但它抽象了低级别的操作系统结构,可以轻松地包含应用程序,而无需在虚拟机中运行它们。
要阻止某些调用,第一个想法可能是挂接禁止的系统调用和您不想要的其他API调用。您还可以挂接动态链接调用,以防止插件加载其他DLL。挂钩磁盘读/写API以阻止读/写。
看看这个,它可能会让你知道如何禁止函数调用。
你也可以尝试沙盒你的插件,尝试看看一些开源沙盒,了解它们是如何工作的。它应该对你有帮助。
在这种情况下,您必须对运行DLL的环境进行沙盒处理。建造这样一个沙箱一点都不容易,而且这可能是你根本不想做的事情。系统调用可以隐藏在字符串中,也可以在执行时通过元编程生成,因此仅通过分析二进制文件很难检测到。幸运的人已经建立了解决方案。例如,谷歌的项目原生客户端的目标是通常允许C++代码在浏览器中安全运行。当它对浏览器来说足够安全时,它可能对你来说足够安全,而且它可能在浏览器之外工作。
- Windows 后台服务(系统配置文件)无法使用 C++ 访问 win 10 上的用户 appData 文件夹?
- 如何访问基类向量中的子类变量?(对于实体组件系统)
- 16 位系统中的程序如何访问大于 65535 的整数,但不能访问地址
- C++ 17 文件系统copy_file访问被拒绝
- 访问另一个类(系统)的非静态字段,就好像它是我自己的字段一样 - 优雅地
- 并发内存访问减慢系统速度
- Boost文件系统存在访问违规
- 用户土地访问内核土地驱动程序系统通知
- 将WM_CHANGEUISTATE发送到窗口应用程序后,当用鼠标访问菜单时,助记符不会显示在系统菜单上
- 系统访问出界异常,尝试从flatbuffer的二进制文件访问"LengthofTable"
- 简单Boost文件系统访问冲突
- 我可以直接访问 Windows 内核系统调用吗?
- 动态链接 ~ 限制 DLL 的系统访问
- 使用 P/Invoke 会导致系统访问违规异常
- 未处理的异常:系统.访问违规异常:尝试读取或写入受保护的内存
- 在 .Net 应用程序中调用 C++ DLL 时出现系统访问冲突异常
- 在编译的形式中抛出系统访问冲突,但在VS2010中没有.原因
- 数据库或文件系统访问的const语义
- 收缩图像"系统.访问违规异常"
- 系统访问冲突异常:试图读取或写入受保护的内存