linux - 在线评委沙盒

标签 linux sandbox ptrace seccomp

我开发了一个 Linux 应用程序,它运行从用户(参赛者)那里收到的不受信任的代码。更具体地说,该应用程序是一个 online judge ,类似于 UVa OJ , SPOJCodeforces , 但主要是 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文件,将 secret 测试用例放入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) ,或我缺少的其他一些解决方案。但是,拜托,满足我唯一要求的东西!用户设置我的应用程序应该非常容易、简单和快速。

提前致谢!

最佳答案

开发自己的沙箱机制很困难,会导致不明显的安全漏洞。还有你的definitely should not use chrootptrace 作为安全工具。

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

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

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

关于linux - 在线评委沙盒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36191589/

相关文章:

c - ptrace mprotect调试麻烦

java - 在 Android 平台上从 java 代码读取/写入/proc/<pid>/mem

linux - 访问进程的内存区域

linux - 在单用户模式下登录 red hat linux 时遇到问题

linux - bash 脚本中的字符串替换给出错误

c - 当 main 什么都不返回时,为什么我得到了 linux c 中 main 调用的最后一个函数的返回值?

python - 尝试在虚拟环境中安装 flask 时出错

ios - Twitter 应用程序开发有沙盒环境吗?

macos - 获取 OS X 中用户库文件夹的路径

python - 按时进行沙箱 shell 程序