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

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

  •  
  •   RicardoY · 134 天前 · 997 次点击
    这是一个创建于 134 天前的主题,其中的信息可能已经有所发展或是发生改变。

    迫于学校大作业...

    现在大概知道应该拦截(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
        1
    meik2333   134 天前   ♥ 1
    sys_clone 拦截了你要怎么运行 Java 程序……

    还有 read、write、openat 等等
        2
    holyghost   134 天前 via iPhone   ♥ 1
        3
    damngood   134 天前   ♥ 1
    是用 seccomp 吗
    记得 seccomp 还可以根据调用参数来做拦截的

    之前写过一个小 demo
        4
    ejq   134 天前 via Android
    丢 KVM 虚拟机里面跑就行啦(
        5
    CEBBCAT   134 天前   ♥ 1
    学习第一步:有问题,先 Google

    然后你就会发现 QingdaoU 开源了他们的 OJ 代码! https://github.com/QingdaoU/OnlineJudge
        6
    RicardoY   134 天前
    @meik2333

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

    输入输出我用的重定向,似乎要调用 sys_read 和 sys_write,这里能再指点下吗
        7
    RicardoY   134 天前
    @ejq 我在外面套了一层 docker 兜底...但这应该是防范一些意外情况用吧..
        8
    RicardoY   134 天前
    @damngood 用的 ptrace
        9
    meik2333   134 天前   ♥ 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 感觉一般就没啥问题了。
        10
    lqs   134 天前 via iPhone   ♥ 1
    可以直接用 docker 搞定,用它本身的功能可以限制各种资源,不需要再单独限制系统调用。

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


    (虽然我的 OJ 实际上还是用的 QDU 方案
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2327 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 25ms · UTC 13:21 · PVG 21:21 · LAX 06:21 · JFK 09:21
    ♥ Do have faith in what you're doing.