2012-04-11 76 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