【发布时间】:2020-08-30 17:45:42
【问题描述】:
我正在开发一个 C++ 应用程序,我想在其中从可能不受信任的在线源编译 C++ 模块,并让它们在单个进程中对特定的数据库进行操作。我想以某种方式将这些沙箱化。这显然是一个复杂的问题,但希望发现是否有任何我还没有想到的潜在方法或工具/库。该应用程序至少可以在 Windows 和 OSX 以及(希望)Linux、iOS、Android 上运行。
我的应用程序会在本地编译它下载的 C++ 模块,并将目标代码动态链接到应用程序中的进程(不一定是“主”应用程序进程)。 C++ 模块只能通过我提供的标头访问我的 API,但是 API(和任何依赖库)需要链接到同一个进程。 API 的依赖库仅基于计算,例如基于本地 SIMD 的数学和可能的内存分配。我不认为他们需要调用任何网络、磁盘或任何其他操作系统功能——除了需要将他们的输入数据和计算结果传递给主进程(可能通过共享内存?)
我不在乎沙盒进程的内存是否损坏或空心,只要它包含在该进程中即可。我还想避免在进程内存空间中链接任何系统 API 调用地址,以防止受损代码找到它们。
我已经对基本的安全问题(堆栈崩溃、面向返回的编程黑客等)进行了审查。还看了一些相关的项目:
- 我看到 Google 在 Chromium 存储库中有一个沙盒子项目,它可能有用,但不确定它在我的情况下是否有用。
- Windows Sandbox 是仅适用于 Windows 的 Microsoft 工具,并且无论如何在某些版本上不可用。而且。使用它存在很大的性能问题。该应用实时运行,帧速率要求类似于视频游戏。
- 考虑编译到 WebAssembly,但目前它似乎太不成熟(没有 SIMD,难以调试,并且可能容易受到包装主机或浏览器中的黑客攻击。)
- 我认为可能已经存在某种包装库来拦截所有操作系统调用并允许自定义配置通过的调用(在我的情况下,除了进程间通信所需的任何东西都将被拒绝)
还有其他想法、架构建议或有前途的开源项目吗?
谢谢, C
【问题讨论】:
-
更新:澄清一下,进程需要的任何内存分配都将与我自己的堆分配器挂钩,以避免调用操作系统。
-
我的公司使用 VMware 将映像作为沙箱(在 VM 内)运行,可以相对轻松地以自动化方式管理和恢复,并在需要时以手动方式进行。
-
更新:考虑将代码作为 LUA 脚本或其他一些相当快速的语言运行,而不是编译 C++,但我认为我只是将这种语言自己的运行时漏洞添加到我的组合中基本 API。
标签: c++ compilation sandbox