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

2019-06-05 21:27:43 +08:00
 RicardoY

迫于学校大作业...

现在大概知道应该拦截(linux 64 位)

56,57,58,59(sys_clone, sys_fork, sys_vfork, sys_execv)

48, 62(sys_shutdown, sys_kill)

还有什么系统调用需要拦截吗,求指点

2280 次点击
所在节点    程序员
12 条回复
meik2333
2019-06-05 21:37:52 +08:00
sys_clone 拦截了你要怎么运行 Java 程序……

还有 read、write、openat 等等
holyghost
2019-06-05 21:44:38 +08:00
damngood
2019-06-05 21:50:10 +08:00
是用 seccomp 吗
记得 seccomp 还可以根据调用参数来做拦截的

之前写过一个小 demo
ejq
2019-06-05 21:53:48 +08:00
丢 KVM 虚拟机里面跑就行啦(
CEBBCAT
2019-06-05 21:54:16 +08:00
学习第一步:有问题,先 Google

然后你就会发现 QingdaoU 开源了他们的 OJ 代码! https://github.com/QingdaoU/OnlineJudge
RicardoY
2019-06-05 21:55:20 +08:00
@meik2333

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

输入输出我用的重定向,似乎要调用 sys_read 和 sys_write,这里能再指点下吗
RicardoY
2019-06-05 21:57:28 +08:00
@ejq 我在外面套了一层 docker 兜底...但这应该是防范一些意外情况用吧..
RicardoY
2019-06-05 21:57:53 +08:00
@damngood 用的 ptrace
meik2333
2019-06-05 22:30:59 +08:00
@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 感觉一般就没啥问题了。
lqs
2019-06-05 22:45:35 +08:00
可以直接用 docker 搞定,用它本身的功能可以限制各种资源,不需要再单独限制系统调用。

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


(虽然我的 OJ 实际上还是用的 QDU 方案

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

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

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

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

© 2021 V2EX