【问题标题】:Need to sandbox application that compiles C++ modules from untrusted sources online需要对从不受信任的来源在线编译 C++ 模块的应用程序进行沙箱处理
【发布时间】:2020-08-30 17:45:42
【问题描述】:

我正在开发一个 C++ 应用程序,我想在其中从可能不受信任的在线源编译 C++ 模块,并让它们在单个进程中对特定的数据库进行操作。我想以某种方式将这些沙箱化。这显然是一个复杂的问题,但希望发现是否有任何我还没有想到的潜在方法或工具/库。该应用程序至少可以在 Windows 和 OSX 以及(希望)Linux、iOS、Android 上运行。

我的应用程序会在本地编译它下载的 C++ 模块,并将目标代码动态链接到应用程序中的进程(不一定是“主”应用程序进程)。 C++ 模块只能通过我提供的标头访问我的 API,但是 API(和任何依赖库)需要链接到同一个进程。 API 的依赖库仅基于计算,例如基于本地 SIMD 的数学和可能的内存分配。我不认为他们需要调用任何网络、磁盘或任何其他操作系统功能——除了需要将他们的输入数据和计算结果传递给主进程(可能通过共享内存?)

我不在乎沙盒进程的内存是否损坏或空心,只要它包含在该进程中即可。我还想避免在进程内存空间中链接任何系统 API 调用地址,以防止受损代码找到它们。

我已经对基本的安全问题(堆栈崩溃、面向返回的编程黑客等)进行了审查。还看了一些相关的项目:

  1. 我看到 Google 在 Chromium 存储库中有一个沙盒子项目,它可能有用,但不确定它在我的情况下是否有用。
  2. Windows Sandbox 是仅适用于 Windows 的 Microsoft 工具,并且无论如何在某些版本上不可用。而且。使用它存在很大的性能问题。该应用实时运行,帧速率要求类似于视频游戏。
  3. 考虑编译到 WebAssembly,但目前它似乎太不成熟(没有 SIMD,难以调试,并且可能容易受到包装主机或浏览器中的黑客攻击。)
  4. 我认为可能已经存在某种包装库来拦截所有操作系统调用并允许自定义配置通过的调用(在我的情况下,除了进程间通信所需的任何东西都将被拒绝)

还有其他想法、架构建议或有前途的开源项目吗?

谢谢, C

【问题讨论】:

  • 更新:澄清一下,进程需要的任何内存分配都将与我自己的堆分配器挂钩,以避免调用操作系统。
  • 我的公司使用 VMware 将映像作为沙箱(在 VM 内)运行,可以相对轻松地以自动化方式管理和恢复,并在需要时以手动方式进行。
  • 更新:考虑将代码作为 LUA 脚本或其他一些相当快速的语言运行,而不是编译 C++,但我认为我只是将这种语言自己的运行时漏洞添加到我的组合中基本 API。

标签: c++ compilation sandbox


【解决方案1】:

编译不受信任的源代码并链接到您的应用听起来确实不安全。如果我正确理解您的问题,您需要“为仅访问您的 API 的单线程用户代码提供安全的运行时环境”,那么我认为最好改用运行时解释器。它将为您提供更多控制和沙盒功能、安全的 API 调用和用户代码异常处理。

如果您对口译员的表现有疑虑,最好权衡一下安全性、灵活性和控制力。大量的解释器将源代码编译为字节码并且运行速度非常快。此外,您还可以通过为脚本提供快速 API 来获得更好的性能。

在我的 Java 企业项目中,我使用内置的 Rhino JavaScript 解释器来运行用户脚本并提供 API 以实现灵活性、所需的性能和控制。这个脚本只能调用我的 API。安全、灵活、完全可控。

我找到了这些 C/C++(类似 C 的语法)解释器库:

  1. JavaScript (ECMA) https://v8.dev/

  2. Lua http://acamara.es/blog/2012/08/running-a-lua-5-2-script-from-c/

  3. C++ 解释器 https://github.com/root-project/cling

【讨论】:

  • (a) Cling 看起来很有趣,谢谢 - 尽管可能无法阻止无效指针访问。 (b) 你是对的,解释代码可以提供不错的性能。然而,仍然存在需要 C/C++ 的情况 - 因此像 Chromium Sandbox 等项目。
猜你喜欢
  • 2021-06-06
  • 2012-08-25
  • 1970-01-01
  • 2015-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-23
  • 1970-01-01
相关资源
最近更新 更多