seccomp(2) System Calls Manual seccomp(2) seccomp - (libc -lc) #include /* SECCOMP_* */ #include /* struct sock_fprog */ #include /* AUDIT_* */ #include /* SIG* */ #include /* PTRACE_* */ #include /* SYS_* */ #include int syscall(SYS_seccomp, unsigned int operation, unsigned int flags, void *args); : glibc seccomp() syscall(2). seccomp() (seccomp) . operation : SECCOMP_SET_MODE_STRICT read(2) write(2) _exit(2) ( exit_group(2)) sigreturn(2). SIGKILL . . sigprocmask(2) sigreturn(2) SIGKILL SIGSTOP. alarm(2) ( ) . SIGKILL. timer_create(2) SIGEV_SIGNAL sigev_signo SIGKILL setrlimit(2) RLIMIT_CPU. CONFIG_SECCOMP. flags 0 args NULL. : prctl(PR_SET_SECCOMP, SECCOMP_MODE_STRICT); SECCOMP_SET_MODE_FILTER (BPF) args. struct sock_fprog . seccomp() EINVAL errno. fork(2) clone(2) . execve(2) execve(2). SECCOMP_SET_MODE_FILTER CAP_SYS_ADMIN no_new_privs . : prctl(PR_SET_NO_NEW_PRIVS, 1); SECCOMP_SET_MODE_FILTER EACCES errno. bit-set-user-ID execve(2) . ( setuid(2) 0 . ). prctl(2) seccomp() . . SECCOMP_SET_MODE_FILTER CONFIG_SECCOMP_FILTER. flags 0 : prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, args); (flags) : SECCOMP_FILTER_FLAG_LOG ( 4.14) SECCOMP_RET_ALLOW. /proc/sys/kernel/seccomp/actions_logged. SECCOMP_FILTER_FLAG_NEW_LISTENER ( 5.0) . ( close-on-exec ). SECCOMP_RET_USER_NOTIF . seccomp SECCOMP_FILTER_FLAG_NEW_LISTENER . seccomp_unotify(2) . SECCOMP_FILTER_FLAG_SPEC_ALLOW ( 4.17) (Speculative Store Bypass). SECCOMP_FILTER_FLAG_TSYNC seccomp . " " . ( seccomp() ). seccomp . SECCOMP_MODE_STRICT seccomp . SECCOMP_GET_ACTION_AVAIL ( 4.14) . SECCOMP_RET_KILL_PROCESS. flags 0 args 32- . SECCOMP_GET_NOTIF_SIZES ( 5.0) seccomp . . flags 0 args struct seccomp_notif_sizes : struct seccomp_notif_sizes __u16 seccomp_notif; /* */ __u16 seccomp_notif_resp; /* */ __u16 seccomp_data; /* 'struct seccomp_data' */ }; seccomp_unotify(2) . SECCOMP_SET_MODE_FILTER args : struct sock_fprog { unsigned short len; /* BPF */ struct sock_filter *filter; /* BPF */ }; BPF : struct sock_filter { /* */ __u16 code; /* */ __u8 jt; /* */ __u8 jf; /* */ __u32 k; /* */ }; BPF ( BPF_ABS) ( ) : struct seccomp_data { int nr; /* */ __u32 arch; /* AUDIT_ARCH_* ( ) */ __u64 instruction_pointer; /* */ __u64 args[6]; /* 6 */ }; ( x86-64) ( execve(2) ) arch. " " . " " ( ) . Caveats . arch . x86-64 ABI x32 ABI AUDIT_ARCH_X86_64 arch . __X32_SYSCALL_BIT (ABIs). __X32_SYSCALL_BIT __X32_SYSCALL_BIT . nr nr __X32_SYSCALL_BIT __X32_SYSCALL_BIT. 5.4 nr 512-547 x32 OR __X32_SYSCALL_BIT. nr == 521 nr == (101 | __X32_SYSCALL_BIT) ptrace(2) x32 x86_64 . 5.4 . 5.4 ENOSYS . instruction_pointer . /proc/pid/maps () . ( mmap(2) mprotect(2) ). args seccomp. i386 ABI x86-64: 32 64 seccomp. x86-64 ABI int seccomp. seccomp 32- : 16 ( SECCOMP_RET_ACTION_FULL) "" 16 ( SECCOMP_RET_DATA) "" . . ( SECCOMP_RET_KILL. ). ( ) . seccomp : SECCOMP_RET_KILL_PROCESS ( 4.14) (core dump). . SECCOMP_RET_KILL_THREAD . ( CLONE_THREAD clone(2)). SIGSYS. SIGSYS . ( waitpid(2) ) wstatus SIGSYS. SECCOMP_RET_KILL_THREAD ( SECCOMP_RET_KILL) . . . SIGSYS. SECCOMP_RET_KILL_PROCESS . 4.11 ( SIGSYS signal(7) ). 4.11 . SECCOMP_RET_KILL_PROCESS 4.14 SECCOMP_RET_KILL_THREAD SECCOMP_RET_KILL . : SECCOMP_RET_KILL_THREAD . SECCOMP_RET_TRAP SIGSYS . ( ). siginfo_t ( sigaction(2)) : o si_signo SIGSYS. o si_call_addr . o si_syscall si_arch . o si_code SYS_SECCOMP. o si_errno SECCOMP_RET_DATA . ( ). . ( ENOSYS ). SECCOMP_RET_ERRNO SECCOMP_RET_DATA errno . SECCOMP_RET_USER_NOTIF ( 5.0) . ( SECCOMP_FILTER_FLAG_NEW_LISTENER ) ENOSYS ( SECCOMP_RET_TRACE ). seccomp_unotify(2) . SECCOMP_RET_USER_NOTIF. SECCOMP_RET_TRACE ptrace(2) . errno ENOSYS. PTRACE_O_TRACESECCOMP ptrace(PTRACE_SETOPTIONS). PTRACE_EVENT_SECCOMP SECCOMP_RET_DATA PTRACE_GETEVENTMSG. -1. . . 4.8 seccomp . ( seccomp ptrace(2) - - seccomp ). SECCOMP_RET_TRACE. SECCOMP_RET_LOG ( 4.14) . /proc/sys/kernel/seccomp/actions_logged. SECCOMP_RET_ALLOW . SECCOMP_RET_KILL_PROCESS ( 4.14) SECCOMP_RET_KILL_THREAD ( 4.13 ). /proc /proc/sys/kernel/seccomp seccomp : actions_avail ( 4.14) seccomp . . seccomp . actions_logged ( 4.14) seccomp . actions_avail. actions_logged . actions_logged SECCOMP_RET_ALLOW. "allow" actions_logged SECCOMP_RET_ALLOW. "allow" EINVAL. seccomp 4.14 seccomp . actions_logged ( audit=1). : o SECCOMP_RET_ALLOW . o SECCOMP_RET_KILL_PROCESS SECCOMP_RET_KILL_THREAD actions_logged . o ( SECCOMP_FILTER_FLAG_LOG) actions_logged . o (autrace(8)) . o . seccomp() 0. SECCOMP_FILTER_FLAG_TSYNC (thread) . ( clone(2) gettid(2)). -1 errno . seccomp() : EACCES CAP_SYS_ADMIN no_new_privs SECCOMP_SET_MODE_FILTER. EBUSY SECCOMP_FILTER_FLAG_NEW_LISTENER . EFAULT args . EINVAL operation . EINVAL flags operation . EINVAL operation BPF_ABS 32 sizeof(struct seccomp_data). EINVAL operation . EINVAL operation SECCOMP_SET_MODE_FILTER args BPF_MAXINSNS (4096) . ENOMEM . ENOMEM MAX_INSNS_PER_PATH (32768) . 4 . EOPNOTSUPP operation SECCOMP_GET_ACTION_AVAIL args. ESRCH . . 3.17. seccomp libseccomp seccomp. Seccomp /proc/pid/status seccomp proc(5). seccomp() prctl(2) PR_SET_SECCOMP ( flags). 4.4 ptrace(2) PTRACE_SECCOMP_GET_FILTER seccomp . seccomp BPF seccomp BPF : o x86-64, i386, x32 ( 3.5) o ARM ( 3.8) o s390 ( 3.8) o MIPS ( 3.16) o ARM-64 ( 3.19) o PowerPC ( 4.3) o Tile ( 4.3) o PA-RISC ( 4.6) seccomp : o vdso(7) . clock_gettime(2) gettimeofday(2) time(2). seccomp . ( vdso(7) seccomp ). o Seccomp . C . : o glibc . exit(2) exit_group(2) fork(2) clone(2). o . . o glibc. glibc open(2) glibc 2.26 openat(2) . . 2 C library/kernel differences. seccomp (bugs) . seccomp . BPF Seccomp BPF seccomp: o BPF_H BPF_B : (4 ) (BPF_W). o seccomp_data BPF_ABS. o BPF_LEN seccomp_data . . . BPF : o BPF ENOSYS. o BPF errno . execv(3) ( execve(2)). . (x86-64) : $ uname -m; x86_64 $ syscall_nr() { cat /usr/src/linux/arch/x86/syscalls/syscall_64.tbl | \ awk '$2 != "x32" && $3 == "'$1'" { print $1 }' }; BPF ( [2] ) . 99: $ errno 99; EADDRNOTAVAIL 99 Cannot assign requested address whoami(1) BPF execve(2) : $ syscall_nr execve; 59 $ ./a.out; Usage: ./a.out [] Hint for : AUDIT_ARCH_I386: 0x40000003 AUDIT_ARCH_X86_64: 0xC000003E $ ./a.out 59 0xC000003E 99 /bin/whoami; execv: Cannot assign requested address BPF write(2) whoami(1) : $ syscall_nr write; 1 $ ./a.out 1 0xC000003E 99 /bin/whoami; BPF whoami(1) : $ syscall_nr preadv; 295 $ ./a.out 295 0xC000003E 99 /bin/whoami; cecilia #include #include #include #include #include #include #include #include #include #include #define X32_SYSCALL_BIT 0x40000000 static int install_filter(int syscall_nr, unsigned int t_arch, int f_errno) { unsigned int upper_nr_limit = 0xffffffff; /* AUDIT_ARCH_X86_64 ABI x86-64 ( ABI x32 30 'nr' >= X32_SYSCALL_BIT). */ if (t_arch == AUDIT_ARCH_X86_64) upper_nr_limit = X32_SYSCALL_BIT - 1; struct sock_filter filter[] = { /* [0] 'seccomp_data' . */ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, (offsetof(struct seccomp_data, arch))), /* [1] 5 't_arch'. */ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, t_arch, 0, 5), /* [2] 'seccomp_data' . */ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, (offsetof(struct seccomp_data, nr))), /* [3] ABI - x86-64 . BPF_JGT . */ BPF_JUMP(BPF_JMP | BPF_JGT | BPF_K, upper_nr_limit, 3, 0), /* [4] 'syscall_nr'. */ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, syscall_nr, 0, 1), /* [5] : 'f_errno' 'errno'. */ BPF_STMT(BPF_RET | BPF_K, SECCOMP_RET_ERRNO | (f_errno & SECCOMP_RET_DATA)), /* [6] : . */ BPF_STMT(BPF_RET | BPF_K, SECCOMP_RET_ALLOW), /* [7] : . */ BPF_STMT(BPF_RET | BPF_K, SECCOMP_RET_KILL_PROCESS), }; struct sock_fprog prog = { .len = countof(filter), .filter = filter, }; if (syscall(SYS_seccomp, SECCOMP_SET_MODE_FILTER, 0, &prog)) { perror("seccomp"); return 1; } return 0; } int main(int argc, char *argv[]) { if (argc < 5) { fprintf(stderr, "Usage: " "%s []\n" "Hint for : AUDIT_ARCH_I386: 0x%X\n" " AUDIT_ARCH_X86_64: 0x%X\n" "\n", argv[0], AUDIT_ARCH_I386, AUDIT_ARCH_X86_64); exit(EXIT_FAILURE); } if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) { perror("prctl"); exit(EXIT_FAILURE); } if (install_filter(strtol(argv[1], NULL, 0), strtoul(argv[2], NULL, 0), strtol(argv[3], NULL, 0))) exit(EXIT_FAILURE); execv(argv[4], &argv[4]); perror("execv"); exit(EXIT_FAILURE); } bpfc(1), strace(1), bpf(2), prctl(2), ptrace(2), seccomp_unotify(2), sigaction(2), proc(5), signal(7), socket(7) libseccomp : scmp_sys_resolver(1) seccomp_export_bpf(3) seccomp_init(3) seccomp_load(3) seccomp_rule_add(3). Documentation/networking/filter.rst Documentation/userspace-api/seccomp_filter.rst. McCanne, S. and Jacobson, V. (1992) The BSD Packet Filter: A New Architecture for User-level Packet Capture, Proceedings of the USENIX Winter 1993 Conference Terence Kelly and Edison Fuh (2025) Sandboxing: Foolproof Boundaries vs. Unbounded Foolishness 3 . . : . 6.18 10 2026 seccomp(2)