沙盒为在线评委

时间:2016-03-24 01:12:53

标签: linux sandbox ptrace seccomp

我开发了一个Linux应用程序,它运行从用户(参赛者)收到的不受信任的代码。更具体地说,该应用程序是online judge,类似于UVa OJSPOJCodeforces,但主要类似于BOCA Online Contest Administrator。我的OJ支持C,C ++,Java和Python。

目前,我的OJ非常不安全,因为在运行不受信任的代码时没有沙盒。所以我正在寻找最好的方法。解决方案的主要要求是:用户(正在设置比赛,而不是参赛者)必须花费尽可能少的努力来设置我的应用程序。我认为git clone repomakesudo make installpjudge 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),或者我失踪的其他解决方案。但是,请满足我唯一的要求!用户设置我的应用程序应该非常简单,简单和快速。

提前致谢!

1 个答案:

答案 0 :(得分:2)

开发自己的沙箱机制很困难,并且会导致明显的安全漏洞。还有您的definitely should not use chrootnamespaces(7)作为安全工具。

请使用成熟的工具。我建议从bubblewrap开始-因为它非常易于使用,轻巧并且不需要root特权。它将使用Linux cgroups(7)来将提交与根文件系统,网络和进程列表安全地隔离。

接下来您应该关心的是资源限制。这可以通过Linux systemd-nspawn功能来完成。尝试使用设置了systemd.resource-control(5)属性的seccomp-bpf工具。它需要root特权才能运行,因此请小心。

最后使用依赖于平台的(本机,python,java){{1}}过滤器来强化syscall调用。