迫于学校大作业...
现在大概知道应该拦截(linux 64 位)
56,57,58,59(sys_clone, sys_fork, sys_vfork, sys_execv)
48, 62(sys_shutdown, sys_kill)
还有什么系统调用需要拦截吗,求指点
1
meik2333 2019-06-05 21:37:52 +08:00 1
sys_clone 拦截了你要怎么运行 Java 程序……
还有 read、write、openat 等等 |
2
holyghost 2019-06-05 21:44:38 +08:00 via iPhone 1
|
3
damngood 2019-06-05 21:50:10 +08:00 1
是用 seccomp 吗
记得 seccomp 还可以根据调用参数来做拦截的 之前写过一个小 demo |
4
ejq 2019-06-05 21:53:48 +08:00 via Android
丢 KVM 虚拟机里面跑就行啦(
|
5
CEBBCAT 2019-06-05 21:54:16 +08:00 1
|
6
RicardoY OP |
9
meik2333 2019-06-05 22:30:59 +08:00 1
@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 感觉一般就没啥问题了。 |
10
lqs 2019-06-05 22:45:35 +08:00 via iPhone 1
可以直接用 docker 搞定,用它本身的功能可以限制各种资源,不需要再单独限制系统调用。
如果是十年前就需要 ptrace,但它对被测程序的性能影响太大了(特别是 JVM )。 |