Online Judge 的评测机应该拦截哪些系统调用? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
RicardoY
V2EX    程序员

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

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

    迫于学校大作业...

    现在大概知道应该拦截(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     Solana     2573 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 04:55 PVG 12:55 LAX 21:55 JFK 00:55
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86