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 · 5833 次点击
    这是一个创建于 2882 天前的主题,其中的信息可能已经有所发展或是发生改变。

    上周学习了一下针对 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 ?

    再次表示感谢。
    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   ·   我们的愿景   ·   实用小工具   ·   3270 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 14:04 · PVG 22:04 · LAX 07:04 · JFK 10:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.