我开发了一个Linux应用程序,它运行从用户(参赛者)收到的不受信任的代码。更具体地说,该应用程序是online judge,类似于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)
,_exit(2)
和sigreturn(2)
。这个解决方案似乎很棒在我的应用程序中实现它很容易,它应该完全按照我的需要工作......但仅适用于C和C ++。 Java和Python又是一个问题。我不知道这个解决方案如何适用于后两种语言,考虑到我在源代码中使用fork(2)
+ exec(2)
/ system(3)
(在C ++中,由方式)。
任何帮助都会非常感激。也许是一些正确/有效的方式来使用ptrace(2)
/ seccomp(2)
,或者我失踪的其他解决方案。但是,请满足我唯一的要求!用户设置我的应用程序应该非常简单,简单和快速。
提前致谢!
答案 0 :(得分:2)
开发自己的沙箱机制很困难,并且会导致明显的安全漏洞。还有您的definitely should not use chroot和namespaces(7)
作为安全工具。
请使用成熟的工具。我建议从bubblewrap开始-因为它非常易于使用,轻巧并且不需要root特权。它将使用Linux cgroups(7)
来将提交与根文件系统,网络和进程列表安全地隔离。
接下来您应该关心的是资源限制。这可以通过Linux systemd-nspawn
功能来完成。尝试使用设置了systemd.resource-control(5)
属性的seccomp-bpf
工具。它需要root特权才能运行,因此请小心。
最后使用依赖于平台的(本机,python,java){{1}}过滤器来强化syscall调用。