seccomp初探
早就听说过seccomp,只是知道他是控制syscall的。因为解一个bug,对seccomp了解多了一丢丢,记录一下。
seccomp是linux用来控制用户进程系统调用使用的。有三种模式:
SECCOMP_SET_MODE_STRICT: 严格限制系统调用的使用,只允许read,write,_exit,sigreturn。这个模式用的较少。
SECCOMP_SET_MODE_FILTER:利用bpf来过滤syscall,也就是可以让用户控制哪些syscall可以使用。这是非常合理的,给了用户较大的选择,主要使用的模式;
SECCOMP_GET_ACTION_AVAIL:不了解;
当进程使用了不被允许的syscall时会被seccomp kill掉。常见的是进程收到SIGSYS,这个信号不能屏蔽只能退出。
如果打开了audit服务,在journal log里面可以看到如下的log:
audit[3028351]: SECCOMP auid=4294967295 uid=0 gid=0 ses=4294967295 subj=unconfined pid=3028351 comm="virtiofsd" exe="/root/virtiofs/virtiofsd/virtiofsd" sig=31 arch=c00000b7 syscall=130 compat=0 ip=0x57a7cc code=0x80000000
sig 31就是SIGSYS, syscall后面的数字表明是哪个系统调用, comm和exe表示被杀掉的进程的可执行文件,pid是进程id,code是错误码。ip是被杀掉时执行的指令地址。看起来打开audit对于了解进程退出原因非常有帮助。