V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
RicardoY
V2EX  ›  程序员

Online Judge 的评测机应该拦截哪些系统调用?

  •  
  •   RicardoY · 2019-06-05 21:27:43 +08:00 · 2116 次点击
    这是一个创建于 1776 天前的主题,其中的信息可能已经有所发展或是发生改变。

    迫于学校大作业...

    现在大概知道应该拦截(linux 64 位)

    56,57,58,59(sys_clone, sys_fork, sys_vfork, sys_execv)

    48, 62(sys_shutdown, sys_kill)

    还有什么系统调用需要拦截吗,求指点

    12 条回复    2019-06-06 06:24:05 +08:00
    meik2333
        1
    meik2333  
       2019-06-05 21:37:52 +08:00   ❤️ 1
    sys_clone 拦截了你要怎么运行 Java 程序……

    还有 read、write、openat 等等
    holyghost
        2
    holyghost  
       2019-06-05 21:44:38 +08:00 via iPhone   ❤️ 1
    damngood
        3
    damngood  
       2019-06-05 21:50:10 +08:00   ❤️ 1
    是用 seccomp 吗
    记得 seccomp 还可以根据调用参数来做拦截的

    之前写过一个小 demo
    ejq
        4
    ejq  
       2019-06-05 21:53:48 +08:00 via Android
    丢 KVM 虚拟机里面跑就行啦(
    CEBBCAT
        5
    CEBBCAT  
       2019-06-05 21:54:16 +08:00   ❤️ 1
    学习第一步:有问题,先 Google

    然后你就会发现 QingdaoU 开源了他们的 OJ 代码! https://github.com/QingdaoU/OnlineJudge
    RicardoY
        6
    RicardoY  
    OP
       2019-06-05 21:55:20 +08:00
    @meik2333

    现在只测试了 cpp 程序...没有测 Java 的...谢谢提醒 orz

    输入输出我用的重定向,似乎要调用 sys_read 和 sys_write,这里能再指点下吗
    RicardoY
        7
    RicardoY  
    OP
       2019-06-05 21:57:28 +08:00
    @ejq 我在外面套了一层 docker 兜底...但这应该是防范一些意外情况用吧..
    RicardoY
        8
    RicardoY  
    OP
       2019-06-05 21:57:53 +08:00
    @damngood 用的 ptrace
    meik2333
        9
    meik2333  
       2019-06-05 22:30:59 +08:00   ❤️ 1
    @RicardoY
    重定向流之后程序可以直接从 STDIN 读,写入 STDOUT,不需要调用 read 和 write,有关白名单或者黑名单可以直接看青大的做法: https://github.com/QingdaoU/Judger/blob/newnew/src/rules/seccomp_rules.h

    青大用的 seccomp,还有一个比较老的 HUSTOJ 用的 ptrace,然后为每种语言维护了一个名单: https://github.com/zhblue/hustoj/blob/master/trunk/core/judge_client/okcalls64.h。

    可以参考一下,我感觉青大的做法挺好的,外面再套层 Docker 感觉一般就没啥问题了。
    lqs
        10
    lqs  
       2019-06-05 22:45:35 +08:00 via iPhone   ❤️ 1
    可以直接用 docker 搞定,用它本身的功能可以限制各种资源,不需要再单独限制系统调用。

    如果是十年前就需要 ptrace,但它对被测程序的性能影响太大了(特别是 JVM )。
    RicardoY
        11
    RicardoY  
    OP
       2019-06-05 23:02:35 +08:00
    @meik2333 真是太感谢了
    ejq
        12
    ejq  
       2019-06-06 06:24:05 +08:00 via Android   ❤️ 1
    这个思路是我根据 katacontainer 这种东西想出来的
    因为容器仍然存在被绕过的风险
    @RicardoY 一个思路是参考 katacontainer 的这种实现,一个裁剪之后的 Linux 内核启动完毕大概是半秒这个量级,比容器略慢,但可以考虑把整个评测逻辑丢虚拟机里,外面再检查虚拟机的状态,如果出了妖蛾子报 system error 即可
    理论上绝对安全?


    (虽然我的 OJ 实际上还是用的 QDU 方案
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3273 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 13:17 · PVG 21:17 · LAX 06:17 · JFK 09:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.