我的问题类似于question,但我没有得到答案。
我正在设计一名法官。
在线评判系统的用户提交他们的源代码 服务器程序编译并运行它。所以服务器程序必须 保持服务器的安全。
用户可以使用很多东西来更改服务器。
如何更改程序的权限?因此编译后的代码除了打印东西外无法做任何事情!
P.S:寻找怀疑词并不是一个好主意。例如,用户可以在C ++中使用以下命令而不是单词system
:
#define glue(a,b) a ## b
glue(sys,tem) ("rm *"); //DO NOT RUN THIS CODE
因此,实际上用户使用以下代码而不使用单词system
:
system ("rm *"); //DO NOT RUN THIS CODE
答案 0 :(得分:2)
您有两个选择:您当前正在研究的选项 - 尝试制作您的编译器,也就是运行用户提供的源代码检测服务器进程"漏洞利用"。那可能是很难。如果您允许用户向您发送c ++源代码,则可以使用很多的内容。我想你需要一些真正的c ++专家才能获得这个解决方案,即使是半途安全"。
因此,选项二:您必须在某种沙箱中运行该用户提供的输入。例子可能是:
如果你认真对待自己所做的事情,你可能会首先关注选项2(因为这会给你带来很多好处,成本中等);但你肯定也想看看选项1(因为可以从很多中学习)。
答案 1 :(得分:1)
您可以在chroot
jail中运行它们,如果没有人真正可以执行重要操作,则将用户ID设置为nobody或某些nonce帐户。 (您可以使用su
或sudo
。或者甚至在他们自己的VM中。将输出传输到文件中,然后从判断程序中读取它。