我开发了一个 Linux 应用程序,它运行从用户(参赛者)收到的不受信任的代码。更具体地说,该应用程序是在线评委,类似于UVa OJ、SPOJ和Codeforces,但主要类似于BOCA Online Contest Administrator。我的 OJ 支持 C、C++、Java 和 Python。
目前,我的 OJ 非常不安全,因为在运行不受信任的代码时没有沙盒。所以我正在寻找最好的方法来做到这一点。该解决方案的主要要求是:用户(正在设置比赛,而不是参赛者)必须花费尽可能少的精力来设置我的应用程序。我认为,,,,,,,git clone repo
更改一些文件make
,sudo make install
将秘密测试用例放入
pjudge install <contest_dir>
其中已经太多了。cd <contest_dir>
.txt
problems/
pjudge start <port>
chroot(2)
首先,考虑使用/的解决方案,我宁愿让我的软件不安全,也不愿强迫用户设置根目录chroot(8)
。作为开发人员和用户,这个解决方案对我来说比我愿意为这个个人项目受苦更痛苦。
我还考虑了一个解决方案ptrace(2)
,如果它进行了禁止的系统调用,则终止该进程。我尝试了一些简单的代码来查看它是否有效,但对于某些系统调用,它似乎无法正常工作。另外,我想我必须过滤很多系统调用......而且我不知道 JVM/Python 运行时需要什么系统调用......我不确定这个解决方案是否可行。如果有人知道如何正确使用此解决方案,请帮助我!
而且我还发现seccomp(2)
。这使得进程只能调用read(2)
、write(2)
和。这个解决方案似乎很棒。在我的应用程序中实现它很容易,它应该完全按照我的需要工作......但仅适用于 C 和 C++。Java 和 Python 又是一个问题。考虑到我在源代码中使用了+ / (顺便说一下,这是在 C++ 中),我不知道这个解决方案如何适用于后两种语言。_exit(2)
sigreturn(2)
fork(2)
exec(2)
system(3)
任何帮助将非常感激。ptrace(2)
也许是使用/的一些正确/有效的方法seccomp(2)
,或者我缺少的其他一些解决方案。但是,请满足我唯一要求的东西!用户设置我的应用程序应该非常容易、简单和快速。
提前致谢!