【问题标题】:Sandboxing for online judges在线评委沙盒
【发布时间】:2016-07-11 12:51:52
【问题描述】:

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

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

提前致谢!

【问题讨论】:

  • docker 能解决你的问题吗?您的参赛者可以在 docker 镜像中提交代码,您可以以受控方式运行该镜像以进行评判。
  • Docker 就像用大锤杀死苍蝇。参赛者平均每个问题有 30 分钟的时间来做所有事情:阅读问题陈述,思考算法,编写代码,调试,然后提交代码。在这种情况下 Docker 是否可行?只有 OJ 应该处理它......参赛者应该只发送 C/C++/Java/Python 代码,不要发送其他代码。
  • 而我的 OJ 设置比赛的用户必须安装 Docker... 这太麻烦了 =(
  • 使用 seccomp-bpf,您可以准确地决定启用哪些系统调用(并使用 ptrace 来处理您需要更细粒度决策的系统调用)

标签: linux sandbox ptrace seccomp


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-10
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多