上周学习了一下针对 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 语言。
不知道各位有没有其它的想法。
1
cjsoft 2016-05-07 15:46:53 +08:00 via Android 2
您可以参考一下 qduoj , qduoj 可以部署 docker judger ,实现沙箱功能
|
2
zjhzxhz 2016-05-07 16:28:09 +08:00 1
月经贴.
不过还是要安利一下我写的 OJ: https://github.com/zjhzxhz/voj 顺便给一下知乎上的讨论: https://www.zhihu.com/question/20343652 |
3
holyghost OP @zjhzxhz
知乎上的讨论我早就看过了,他们也很少提到基于 seccomp 实现的 judgerjudger 。 docker 和 ptrace 不是不可以,但是我觉得对待放到生产环境的东西应该更严肃点。 |
4
zjhzxhz 2016-05-07 16:38:30 +08:00
艾玛~ 原谅我看错题了~
|
7
fcicq 2016-05-07 18:55:17 +08:00 1
看起来应该可以用 LD_PRELOAD 法做一个 wrapper 预先缓存需要的 fd, 然后上 seccomp strict. 这等同于弱化的 OpenBSD pledge / tame syscall.
不过从 linux 糟糕的安全记录来看, 通过某一个 syscall 还是有被打穿的可能性, 相对于 solaris 来说差太远而且看不到前景. |
9
virusdefender 2016-05-07 19:37:35 +08:00 via Android 2
|
10
holyghost OP |
11
fcicq 2016-05-07 20:14:57 +08:00 1
@virusdefender 你实现里的 open 看起来还是能绕过. 开了 mmap 之后 write 也等于白限制了. 再靠 namespace 限制特殊文件的读取之后, 虽然看起来没有直接隐患, 但这种东拼西凑的方法还是逃不出不优雅的结论.
|
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 ? 再次表示感谢。 |
13
breeswish 2016-05-07 21:32:44 +08:00
Linux: containers
Windows: FS ACL + Restricted User |
14
helihuo 2016-05-07 21:36:01 +08:00
天啊,大咕咕鸡也编程,亚克西
|
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 |
16
holyghost OP |
17
minsheng 2016-05-08 00:53:02 +08:00 via iPhone
为什么 OJ judger 总让我想起 PDF format
|
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 我觉得应该差不多了。 |
19
holyghost OP @RecursiveG 感谢,一会去研究研究前辈的文章。
|
20
virusdefender 2016-05-08 07:57:06 +08:00 via Android
@fcicq 感谢。我晚上仔细看下。有问题再问。
|
21
wodesuck 2016-05-08 08:03:39 +08:00 via Android
docker-seccomp 有研究过的吗,有什么优缺点
|
23
holyghost OP @RecursiveG
六篇文章全部过了一遍,之前遇到了一些细节没有深探究竟,文章里也提到了,非常赞! |