安全地在VM中运行C ++

时间:2011-01-26 22:16:52

标签: 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
    

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

4 个答案:

答案 0 :(得分:9)

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

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

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

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

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

答案 1 :(得分:0)

如果您使用Linux运行代码,则可以通过重新定义一些具有潜在危险的功能来提高VM的安全性,例如:open(...)fopen(...)socket(...)等等LD_PRELOAD

答案 2 :(得分:0)

您可以使用用户级安全性。您正在运行本机代码,这意味着您的代码可能会执行用户可能执行的任何操作。因此,限制用户可能做的事情。在用户限制中添加“无网络,工作目录外无文件访问”限制。当然,你仍然保留VM规则,但你更愿意及早发现这些事情。

既然你提到了GNU,我会假设一个linux系统。然后,您需要一个SELinux VM。您添加到VM的任何内容都可能会受到影响,因此请跳过它。可能没有必要安装X服务器,等等。

答案 3 :(得分:0)