沙盒为在线评委

mat*_*scp 6 linux ptrace sandbox seccomp

我开发了一个Linux应用程序,它运行从用户(参赛者)收到的不受信任的代码.更具体地说,该应用程序是一个在线评判,类似于UVa OJ,SPOJCodeforces,但主要是像BOCA在线竞赛管理员.我的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),或者我缺少的其他一些解决方案.但是,请满足我唯一的要求!用户设置我的应用程序应该非常简单,简单和快速.

提前致谢!

小智 3

开发自己的沙箱机制很困难,并且会导致不明显的安全缺陷。你绝对不应该使用 chrootptrace作为安全工具。

使用成熟的工具代替。我建议从bubblewrap开始- 因为它非常易于使用、轻量级并且不需要 root 权限。它将让 Linuxnamespaces(7)安全地将提交与根文件系统、网络和进程列表隔离。

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

最后使用平台相关的(本机、python、java)过滤器强化系统调用调用seccomp-bpf