如eigenstate.org和SECCOMP (2)解釋說:
唯一的系統調用調用線程允許 化妝讀取(2),寫(2),_exit(2)( 但不是 exit_group(2)), 和sigreturn(2)。其他系統調用導致SIGKILL信號的交付 。
其結果是,人們所期望的_exit()
工作,但它是一個包裝函數調用exit_group(2)
未嚴格模式允許([1], [2]),因而,處理就會被殺死。
它甚至報道exit(2) - Linux man page:
在glibc的高達2.3版本,的_exit()包裝函數調用同名的內核系統調用。由於glibc 2.3,包裝函數調用exit_group(2),以終止進程中的所有線程。
與return
聲明相同,聲明最終會以與_exit()
非常相似的方式殺死您的進程。
Stracing過程中會提供進一步的確認(允許這種情況出現,你必須不集PR_SET_SECCOMP;只是評論prctl()
)和我有兩個不工作的情況下,類似的輸出:
linux12:/home/users/grad1459>gcc seccomp.c -o seccomp
linux12:/home/users/grad1459>strace ./seccomp
execve("./seccomp", ["./seccomp"], [/* 24 vars */]) = 0
brk(0) = 0x8784000
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb775f000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=97472, ...}) = 0
mmap2(NULL, 97472, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7747000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/i386-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\220\226\1\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=1730024, ...}) = 0
mmap2(NULL, 1739484, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xdd0000
mmap2(0xf73000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1a3) = 0xf73000
mmap2(0xf76000, 10972, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xf76000
close(3) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7746000
set_thread_area({entry_number:-1 -> 6, base_addr:0xb7746900, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0
mprotect(0xf73000, 8192, PROT_READ) = 0
mprotect(0x8049000, 4096, PROT_READ) = 0
mprotect(0x16e000, 4096, PROT_READ) = 0
munmap(0xb7747000, 97472) = 0
exit_group(0) = ?
linux12:/home/users/grad1459>
正如你所看到的,exit_group()
被稱爲,解釋一切!
現在正如你所說的那樣,「SYS_exit equals __NR_exit
」;例如,它在mit.syscall.h定義:
#define SYS_exit __NR_exit
所以最後兩個電話是等價的,即你可以使用你喜歡的人,並且輸出應該是這樣的:
linux12:/home/users/grad1459>gcc seccomp.c -o seccomp && ./seccomp ; echo "${?}"
0
PS
你當然可以自己定義一個filter
並使用:
prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, filter);
在本徵態鏈接中解釋,允許_exit()
(或嚴格來說,exit_group(2)
),但只有在您確實需要知道您在做什麼時才這樣做。
難道你不能只返回EXIT_SUCCESS? (Woops:沒關係 - 沒有仔細查看你的代碼。) – Steven
我得到了同樣的問題,我的進程被殺死了。 – Lev
非常奇怪'_exit(EXIT_SUCCESS)'不起作用,因爲manpage明確指出,在嚴格的seccomp模式下,「只允許調用線程允許進行的系統調用(2),write(2 ),_exit(2)(但不是exit_group(2))和sigreturn(2)。「 (括號內的數字當然是手動部分)。 – 2016-11-06 20:33:14