安全地在VM中运行C++

Cod*_*utz 2 c++ compiler-construction virtual-machine

所以,我正在制作一个在线应用程序,用户可以提交代码,输出将显示给用户.我已将安全性作为首要任务,并已采取以下步骤以确保代码安全运行:

  • 在VM上运行代码,在仅使用的VPS上运行这些VM.这些VM不允许通过工作目录进行任何网络或文件访问.
  • 使用以下G ++标志:

    -O -std=c++98 -pedantic-errors -Wfatal-errors -Werror -Wall -Wextra -Wno-missing-field-initializers -Wwrite-strings -Wno-deprecated -Wno-unused -Wno-non-virtual-dtor -Wno-variadic-macros -fmessage-length=0 -ftemplate-depth-128 -fno-merge-constants -fno-nonansi-builtins -fno-gnu-keywords -fno-elide-constructors -fstrict-aliasing -fstack-protector-all -Winvalid-pch
    
    Run Code Online (Sandbox Code Playgroud)

我的问题我想我真的怎么能让这更安全?你个人认为这种方法有什么问题吗?

jal*_*alf 9

编译器标志并不重要.带有这些标志的C++程序可以执行与使用任何其他标志集编译的C++程序相同的功能.特别是,有许多方法可以解决未定义的行为,是的,可能会利用操作系统中可能存在的任何安全漏洞.

您正在执行不受信任的代码,故事结束.您可以希望操作系统不会受到损害,代码将无法获得新的权限,甚至无法以root身份运行,或以其他方式搞乱系统.

而且你可以希望,如果发生这种情况,它仍然会被包含在VM中,并且无法影响主机.

但它仍然是不受信任的代码,它可以做任何不受信任的代码可能做的事情.您可以做的最好的事情是确保它以最少的权限运行,并且操作系统和虚拟化软件都是100%补丁.

当然,有了你提到的限制,我的第一个问题是,"有没有什么可以阻止我用垃圾填满硬盘?" 好的,所以我不能在工作目录之外写,但我仍然可以让磁盘空间不足.或者是否有磁盘配额或强制执行的任何操作?如何限制我使用的CPU时间?我是否可以使用机器上的所有资源,使其无响应?