实现一个 OJ judger 的思路 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Recommended Services
Amazon Web Services
LeanCloud
New Relic
ClearDB
holyghost
V2EX    云计算

实现一个 OJ judger 的思路

  •  
  •   holyghost 2016-05-07 15:14:36 +08:00 6563 次点击
    这是一个创建于 3518 天前的主题,其中的信息可能已经有所发展或是发生改变。

    上周学习了一下针对 c 语言的 OJ judger 的实现思路,记录了下:

    https://tech.liuchao.me/2016/05/online-judge-sandbox-design-1/

    https://tech.liuchao.me/2016/05/online-judge-sandbox-design-2/

    当然据我说知,还有人应该在虚拟机的层面上实现过类似的沙箱,难度太大暂时就不考虑了,所以主要针对的还是 *nix 平台上的 c 语言。

    不知道各位有没有其它的想法。

    23 条回复    2016-05-08 08:19:49 +08:00
    cjsoft
        1
    cjsoft  
       2016-05-07 15:46:53 +08:00 via Android   2
    您可以参考一下 qduoj , qduoj 可以部署 docker judger ,实现沙箱功能
    zjhzxhz
        2
    zjhzxhz  
       2016-05-07 16:28:09 +08:00   1
    月经贴.

    不过还是要安利一下我写的 OJ: https://github.com/zjhzxhz/voj

    顺便给一下知乎上的讨论: https://www.zhihu.com/question/20343652
    holyghost
        3
    holyghost  
    OP
       2016-05-07 16:38:11 +08:00 via iPhone
    @zjhzxhz

    知乎上的讨论我早就看过了,他们也很少提到基于 seccomp 实现的 judgerjudger 。

    docker 和 ptrace 不是不可以,但是我觉得对待放到生产环境的东西应该更严肃点。
    zjhzxhz
        4
    zjhzxhz  
       2016-05-07 16:38:30 +08:00
    艾玛~ 原谅我看错题了~
    holyghost
        5
    holyghost  
    OP
       2016-05-07 16:45:08 +08:00 via iPhone
    @zjhzxhz anyway 我还是要看看你那个是怎么写的哈哈哈哈哈哈哈哈
    codesun
        6
    codesun  
       2016-05-07 18:24:48 +08:00
    @zjhzxhz 好好安利
    fcicq
        7
    fcicq  
       2016-05-07 18:55:17 +08:00   1
    看起来应该可以用 LD_PRELOAD 法做一个 wrapper 预先缓存需要的 fd, 然后上 seccomp strict. 这等同于弱化的 OpenBSD pledge / tame syscall.
    不过从 linux 糟糕的安全记录来看, 通过某一个 syscall 还是有被打穿的可能性, 相对于 solaris 来说差太远而且看不到前景.
    holyghost
        8
    holyghost  
    OP
       2016-05-07 19:09:26 +08:00 via iPhone
    @fcicq 感谢,看来还得去研究研究 Solaris
    virusdefender
        9
    virusdefender  
       2016-05-07 19:37:35 +08:00 via Android   2
    https://github.com/QingdaoU/Judger

    基于 seccomp 知乎上我也回答了
    holyghost
        10
    holyghost  
    OP
       2016-05-07 19:39:47 +08:00   1
    @virusdefender
    之前搜索到你的实现了, int syscalls_whitelist[]
    谢谢。
    fcicq
        11
    fcicq  
       2016-05-07 20:14:57 +08:00   1
    @virusdefender 你实现里的 open 看起来还是能绕过. 开了 mmap 之后 write 也等于白限制了. 再靠 namespace 限制特殊文件的读取之后, 虽然看起来没有直接隐患, 但这种东拼西凑的方法还是逃不出不优雅的结论.
    virusdefender
        12
    virusdefender  
       2016-05-07 21:13:00 +08:00
    @fcicq 十分感谢。但是有两点不是很清楚,麻烦指教一下

    1. open 绕过是什么意思,里面并没有限制 open ,可以随便的 open 和 read ,主要限制 write 。

    2. mmap 写文件第一次听说,根据 https://gist.github.com/sanmarcos/991042 的 demo , write 和 msync 系统调用至少是需要的, write 第一个参数是文件 fd ,是大于 2 的,可以被限制的。不知道"开了 mmap 之后 write 也等于白限制了"是怎么回事。能不能给一个 poc ?
    br />再次表示感谢。
    breeswish
        13
    breeswish  
       2016-05-07 21:32:44 +08:00
    Linux: containers
    Windows: FS ACL + Restricted User
    helihuo
        14
    helihuo  
       2016-05-07 21:36:01 +08:00
    天啊,大咕咕鸡也编程,亚克西
    fcicq
        15
    fcicq  
       2016-05-07 21:38:49 +08:00   1
    @virusdefender (1) 可以限制但没有做, 但做路径限制的方法不漂亮. (2) 能读写 /dev/mem 的话一切不都完了? 其实 munmap 就能起到 write 的作用.

    随手一个程序, strace 结果, 你觉得写入成功了没有?
    open("FILE", O_RDWR) = 3
    mmap(NULL, 256, PROT_READ|PROT_WRITE, MAP_SHARED, 3, 0) = 0x7ffa18a1f000
    close(3) = 0
    fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 5), ...}) = 0
    brk(NULL) = 0x2545000
    brk(0x2566000) = 0x2566000
    munmap(0x7ffa18a1f000, 256) = 0
    holyghost
        16
    holyghost  
    OP
       2016-05-08 00:06:53 +08:00
    @helihuo
    钱打到 [email protected] ,荣耀归于特师。
    minsheng
        17
    minsheng  
       2016-05-08 00:53:02 +08:00 via iPhone
    为什么 OJ judger 总让我想起 PDF format
    RecursiveG
        18
    RecursiveG  
       2016-05-08 05:17:04 +08:00   2
    好像最近看到好几篇 OJ 的文章,贴一下我两年前的文章 (已烂尾) http://www.devinprogress.org/tags/PTRACE/

    这是在 seccomp 还没有 BPF 的时候写的。
    ptrace 作为调试器的基础,功能还是是很强大的。
    对于 OJ 来说,大部分程序还是以 CPU 计算为主,较少使用系统调用, ptrace 的性能损失估计不会很多。
    实在不行我们还可以堆硬件呀(雾
    搭配好 chroot 和 setuid 我觉得应该差不多了。
    holyghost
        19
    holyghost  
    OP
       2016-05-08 07:48:02 +08:00 via iPhone
    @RecursiveG 感谢,一会去研究研究前辈的文章。
    virusdefender
        20
    virusdefender  
       2016-05-08 07:57:06 +08:00 via Android
    @fcicq 感谢。我晚上仔细看下。有问题再问。
    wodesuck
        21
    wodesuck  
       2016-05-08 08:03:39 +08:00 via Android
    docker-seccomp 有研究过的吗,有什么优缺点
    holyghost
        22
    holyghost  
    OP
       2016-05-08 08:06:44 +08:00
    @wodesuck
    除了并发上不去,我暂时没看出来有什么缺点。
    holyghost
        23
    holyghost  
    OP
       2016-05-08 08:19:49 +08:00
    @RecursiveG
    六篇文章全部过了一遍,之前遇到了一些细节没有深探究竟,文章里也提到了,非常赞!
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1027 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 18:40 PVG 02:40 LAX 10:40 JFK 13:40
    Do have faith in what you're doing.
    ubao msn 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