2012-04-11 81 views
2

为什么进入seccomp模式的进程总是在退出时被终止?为什么seccomp进程总是被杀死?

$ cat simple.c 
#include <stdio.h> 
#include <stdlib.h> 
#include <linux/prctl.h> 

int main(int argc, char **argv) 
{ 
    printf("Starting\n"); 
    prctl(PR_SET_SECCOMP, 1); 
    printf("Running\n"); 
    exit(0); 
} 
$ cc -o simple simple.c 
$ ./simple || echo "Returned $?" 
Starting 
Running 
Killed 
Returned 137 

回答

3

在手册页PR_SET_SECCOMP下,唯一允许的系统调用是读,写,退出和sigreturn。

当您在标准库(在最近的Linux)中调用exit(0)时,您调用exit_group系统调用,而不是退出。这是不允许的,所以你得到一个SIGKILL。

(你可以看到这个,如果你把这个过程...)

+0

太棒了,谢谢。你如何得到strace来打印exit_group调用? strace ./simple在写完后立即显示“+++杀死了SIGKILL +++”。 – engie 2012-04-11 22:51:43

+0

要查看strace中的exit_group,您必须*不*设置PR_SET_SECCOMP。 – antlersoft 2012-04-11 22:54:39

+0

@engie antlersoft绝对是正确的,如[答案](http://stackoverflow.com/a/40455896/2411320)所示。谢谢antlersoft张贴这个! :) – gsamaras 2016-11-07 01:29:58