online judge sandbox 设计思路(1)

This article is deprecated, please see here for more details. 实现 OJ 的 sandbox 主要有两种思路:ptrace 和 seccomp,下面我们分别讨论。 ptrace() ptrace 是类 Unix 系统上一个可以观察、控制其他进程内部状态的工具。它的用途有很多,例如程序调试(gdb、dbx等)、代码覆盖率检测、甚至可以用来做运行时补丁(想没想起来IDA和OllyDbg )。今天我们讨论的是如何通过对系统调用的限制来达到在沙箱(sandbox)中运行程序的效果。 我们先写一个程序,用来删除 /etc/hosts 文件: a.out 完成了它的使命,成功的删除了 hosts 文件。 现在,我们需要设计一个程序:通过 ptrace() 来限制 unlink() 删除文件系统中的文件。 首先,我们来看下手册上是怎么介绍 ptrace() 的: 其中,request 参数决定了 ptrace() 的行为,我们选几个用得到的选项介绍: PTRACE_TRACEME: 表明子进程(tracee)正在被父进程(tracer)所控制。注意:只有本选项适用于子进程(tracee); PTRACE_PEEKUSER: 可以从子进程中获取通用寄存器中的值,寄存器(orig_rax /orig_eax,取决于平台 )中保存的是最近一次的syscall number; PTRACE_SYSCALL: 可以将子进程从停止的状态唤醒并继续; 这样,我们就有思路了:每次程序调用系统调用,我们都去看看本次系统调用是不是 unlink(),如果是,杀掉子进程并退出即可: 当系统调用发生时,内核会把当前的 %eax/%rax … Continue reading "online judge sandbox 设计思路(1)"

Read More