Cod*_*utz 2 c++ compiler-construction virtual-machine
所以,我正在制作一个在线应用程序,用户可以提交代码,输出将显示给用户.我已将安全性作为首要任务,并已采取以下步骤以确保代码安全运行:
使用以下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)我的问题我想我真的怎么能让这更安全?你个人认为这种方法有什么问题吗?
编译器标志并不重要.带有这些标志的C++程序可以执行与使用任何其他标志集编译的C++程序相同的功能.特别是,有许多方法可以解决未定义的行为,是的,可能会利用操作系统中可能存在的任何安全漏洞.
您正在执行不受信任的代码,故事结束.您可以希望操作系统不会受到损害,代码将无法获得新的权限,甚至无法以root身份运行,或以其他方式搞乱系统.
而且你可以希望,如果发生这种情况,它仍然会被包含在VM中,并且无法影响主机.
但它仍然是不受信任的代码,它可以做任何不受信任的代码可能做的事情.您可以做的最好的事情是确保它以最少的权限运行,并且操作系统和虚拟化软件都是100%补丁.
当然,有了你提到的限制,我的第一个问题是,"有没有什么可以阻止我用垃圾填满硬盘?" 好的,所以我不能在工作目录之外写,但我仍然可以让磁盘空间不足.或者是否有磁盘配额或强制执行的任何操作?如何限制我使用的CPU时间?我是否可以使用机器上的所有资源,使其无响应?