需要沙盒应用程序,从不受信任的来源在线编译C++模块



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

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

我不在乎沙盒进程的内存是否被破坏或挖空,只要它包含在那个进程中。我还想避免在进程内存空间中链接任何系统API调用地址,以防止泄露的代码找到它们。

我已经对基本的安全问题(堆栈崩溃、面向返回的编程技巧等(进行了审查

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

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

谢谢,C

编译不受信任的源代码并链接到您的应用程序听起来真的很不安全。如果我正确理解你的问题,你需要;为只访问API的单线程用户代码提供安全的运行时环境";,那么在我看来,最好使用运行时解释器。它将为您提供更多的控制和沙箱功能、安全的API调用和用户代码异常处理。

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

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

我发现了以下C/C++(类C语法(解释器库:

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

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

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

最新更新