实现一个 OJ judger 的思路

2016-05-07 15:14:36 +08:00
 holyghost

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

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

5857 次点击
所在节点    云计算
23 条回复
cjsoft
2016-05-07 15:46:53 +08:00
您可以参考一下 qduoj , qduoj 可以部署 docker judger ,实现沙箱功能
zjhzxhz
2016-05-07 16:28:09 +08:00
月经贴.

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

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

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

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

基于 seccomp 知乎上我也回答了
holyghost
2016-05-07 19:39:47 +08:00
@virusdefender
之前搜索到你的实现了, int syscalls_whitelist[]
谢谢。
fcicq
2016-05-07 20:14:57 +08:00
@virusdefender 你实现里的 open 看起来还是能绕过. 开了 mmap 之后 write 也等于白限制了. 再靠 namespace 限制特殊文件的读取之后, 虽然看起来没有直接隐患, 但这种东拼西凑的方法还是逃不出不优雅的结论.
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
2016-05-07 21:32:44 +08:00
Linux: containers
Windows: FS ACL + Restricted User
helihuo
2016-05-07 21:36:01 +08:00
天啊,大咕咕鸡也编程,亚克西
fcicq
2016-05-07 21:38:49 +08:00
@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
2016-05-08 00:06:53 +08:00
@helihuo
钱打到 daguguguji@gmail.com ,荣耀归于特师。
minsheng
2016-05-08 00:53:02 +08:00
为什么 OJ judger 总让我想起 PDF format
RecursiveG
2016-05-08 05:17:04 +08:00
好像最近看到好几篇 OJ 的文章,贴一下我两年前的文章 (已烂尾) http://www.devinprogress.org/tags/PTRACE/

这是在 seccomp 还没有 BPF 的时候写的。
ptrace 作为调试器的基础,功能还是是很强大的。
对于 OJ 来说,大部分程序还是以 CPU 计算为主,较少使用系统调用, ptrace 的性能损失估计不会很多。
实在不行我们还可以堆硬件呀(雾
搭配好 chroot 和 setuid 我觉得应该差不多了。
holyghost
2016-05-08 07:48:02 +08:00
@RecursiveG 感谢,一会去研究研究前辈的文章。
virusdefender
2016-05-08 07:57:06 +08:00
@fcicq 感谢。我晚上仔细看下。有问题再问。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/276965

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX