介绍
seccomp按照字面意思可以理解为security computing,最早是作用于网格计算,主要通过限制进程的系统调用来完成部分沙箱隔离功能。
通过man prctl可以发现,seccomp的引入是在内核2.6.23,早期的seccomp主要限制read、write、exit以及sigreturn四个系统调用。内核3.5版本引入filter模式,将seccomp分成strict和filter两种。其中strict依旧限制四种系统调用,而filter模式则借助了Berkeley Pakcet Filter来进行更细致的指令和参数控制。
STRICT模式
我们可以查阅2.6.32内核代码来了解strict模式下的系统调用控制是如何实现的。
设置
seccomp是通过prctl系统调用来进行设置的。
具体使用: prctl(PR_SET_SECCOMP, 1, 0, 0, 0),第二个参数设置为1即可。
通过sys_prctl进行追踪,在prctl_set_seccomp函数中,将当前进程结构(struct task_struct结构)中的seccomp中的mode标记设置为1,并将thread_info中flag设置为TIF_SECCOMP。
我们可以由此猜测,只要将对应的进程task_struct结构中的对应标记mode置位,则可以进行进程系统调用限制。程序可通过prctl给自己做限制,如果想限制其他程序,则需要在自己制作的测试驱动中,通过对不同的测试程序设置mode,来测试该功能,参考如下:
read_lock(&tasklck);
for_each_process(p) {
if (p->pid == seccomp_pid) {
p_pid_address = &(p->seccomp.mode);
ori_seccomp_mode = *p_pid_address;
*p_pid_address = 1;
break;
}
}
read_unlock(&tasklck);
拦截
每个系统调用都会陷入系统调用控制函数syscall_trace_enter中,该函数中调用了secure_computing,系统调用号作为