在虚拟机中安全运行C++
因此,我正在制作一个在线应用程序,用户可以提交代码并将输出显示给用户。我已将安全设置为重中之重,并已采取以下步骤确保代码安全运行:在虚拟机中安全运行C++
- 在虚拟机上运行代码,在仅使用的VPS上运行这些虚拟机。这些虚拟机不允许任何网络或文件访问通过工作目录。
-
使用下面的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
我的问题我想是真的我怎样才能使这个任何更安全?你个人看到这种方法有什么问题吗?
编译器标志并不重要。带有这些标志的C++程序可以执行与使用任何其他标志集编译的C++程序相同的功能。特别是,有很多方法可以解决未定义的行为,并且可能会利用操作系统中可能存在的任何安全漏洞。
您正在执行不可信的代码,故事结束。您可以希望操作系统不会受到影响,代码将无法获得新的权限,甚至无法以root身份运行,否则会导致系统混乱。
你可以希望如果发生这种情况,它仍然会被包含在虚拟机中,并且不会影响主机。
但它仍然是不可信的代码,它可以做任何不受信任的代码可能做的事情。您可以做的最好的事情是确保它以最低的权限运行,并且操作系统和虚拟化软件都是100%修补的。
当然,有了你提到的限制,我的第一个问题是,“有没有什么能阻止我用垃圾填充硬盘?”好的,所以我不能在工作目录之外写入,但我仍然可以使磁盘空间不足。还是有一个磁盘配额或任何强制执行?限制我使用的CPU时间量如何?我能否使用机器上的所有资源,使其无响应?
+1为好建议。 – 2011-01-26 22:32:03
唯一正确的答案。令人惊讶的是,这个概念似乎在大量报告安全问题的人身上丢失。 [你可以运行代码并不奇怪](http://blogs.msdn。com/b/oldnewthing/archive/2010/12/08/10101773.aspx);) – 2011-01-26 22:32:23
如果您正在使用Linux来运行代码,你可以通过重新定义一些具有潜在危险的功能,如提高你的虚拟机的安全性:open(...)
,fopen(...)
,socket(...)
,等使用LD_PRELOAD
。
An您可以使用用户级安全性。您正在运行本机代码,这意味着您的代码可能会执行用户可能执行的任何操作。因此,限制用户可以做的事情。用户的限制也添加了“无网络,无工作目录外的文件访问”限制。当然,你仍然会遵守虚拟机规则,但是你更愿意尽早赶上这些事情。
既然你提到GNU,我会假设一个linux系统。你会想要一个SELinux虚拟机。你添加到虚拟机中的任何东西都可能被破坏,所以请跳过它。可能不需要安装X服务器,等等。
防止C++ 03真的没有意义。 C++ 0x *也许*因为它的标准库包含线程,但C++ 03没有任何问题。 – Puppy 2011-01-26 22:25:21