需要对从不受信任的来源在线编译C ++模块的沙箱应用程序进行

问题描述

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

我的应用程序将在本地编译其下载的C ++模块,并将目标代码动态链接到应用程序中的进程(不一定是“主”应用程序进程)。 C ++模块只能通过我提供的标头访问我的API,但是该API(和任何相关库)需要链接到同一进程中。 API的依赖库仅基于计算,例如基于本地SIMD的数学以及可能的内存分配。我不希望他们为此而调用任何网络,磁盘或任何其他OS功能–除了需要将其输入数据和计算结果传达给主进程(也许通过共享内存?)

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

我对基本的安全性问题(堆栈崩溃,面向返回的编程技巧等)进行了回顾。还查看了一些相关项目:

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

是否还有其他想法,体系结构建议或有前途的开源项目呢?

谢谢, C

解决方法

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

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

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

我发现了这些C / C ++(类似于C的语法)解释器库:

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

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

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