Skip to content
Back to skills

Syscall Filtering Seccomp

ASecurity

Linux seccomp BPF syscall filtering. Default-deny profiles, allow-listing safe syscalls, SCMP_ACT_ERRNO vs SCMP_ACT_KILL, Docker/OCI seccomp JSON format, blocking reboot/mount/ptrace for agent subprocesses. Sources: seccomp/libseccomp, opencontainers/runc.

  • 10 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 9, 2026
ai-agentsbashnodedockergit

Security analysis

A100/100

Scanned September 9, 2026

npx -y skills add yanacuti1121/Yana-AI --skill syscall-filtering-seccomp --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Syscall Filtering Seccomp?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Syscall Filtering Seccomp
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/yanacuti1121-syscall-filtering-seccomp/badge)](https://www.skillsdirectory.com/skills/yanacuti1121-syscall-filtering-seccomp)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: syscall-filtering-seccomp
description: Linux seccomp BPF syscall filtering. Default-deny profiles, allow-listing safe syscalls, SCMP_ACT_ERRNO vs SCMP_ACT_KILL, Docker/OCI seccomp JSON format, blocking reboot/mount/ptrace for agent subprocesses. Sources: seccomp/libseccomp, opencontainers/runc.
origin: yana-ai — synthesized from seccomp/libseccomp (Linux Foundation), opencontainers/runc seccomp spec
license: Apache-2.0
version: 1.0.0
compatibility: yana-ai >= 1.3.48
---

# /syscall-filtering-seccomp

## When to Use

- Hard-blocking dangerous syscalls (reboot, mount, ptrace, kexec_load) from agent subprocesses
- Writing OCI-compatible seccomp profiles for runc / Docker
- Auditing which syscalls a binary actually needs (strace → allowlist)
- Defense in depth below capability dropping

## Do NOT use for

- Replacing namespaces or capability dropping — use all three together
- Filtering network destinations (use network namespaces + egress rules)

---

## OCI seccomp profile (JSON — Docker/runc compatible)

```json
{
  "defaultAction": "SCMP_ACT_ERRNO",
  "defaultErrnoRet": 1,
  "architectures": ["SCMP_ARCH_X86_64","SCMP_ARCH_X86","SCMP_ARCH_X32"],
  "syscalls": [
    {
      "names": [
        "read","write","open","openat","close","stat","fstat","lstat",
        "poll","lseek","mmap","mprotect","munmap","brk","rt_sigaction",
        "rt_sigprocmask","rt_sigreturn","ioctl","pread64","pwrite64",
        "readv","writev","access","pipe","select","sched_yield",
        "mremap","msync","mincore","madvise","shmget","shmat","shmctl",
        "dup","dup2","pause","nanosleep","getitimer","alarm","setitimer",
        "getpid","sendfile","socket","connect","accept","sendto","recvfrom",
        "sendmsg","recvmsg","shutdown","bind","listen","getsockname",
        "getpeername","socketpair","setsockopt","getsockopt","clone",
        "fork","vfork","execve","exit","wait4","kill","uname","fcntl",
        "flock","fsync","fdatasync","truncate","ftruncate","getdents",
        "getcwd","chdir","fchdir","rename","mkdir","rmdir","creat","link",
        "unlink","symlink","readlink","chmod","fchmod","chown","fchown",
        "lchown","umask","gettimeofday","getrlimit","getrusage","sysinfo",
        "times","getuid","getgid","setuid","setgid","geteuid","getegid",
        "getgroups","getppid","getpgrp","setsid","setreuid","setregid",
        "getresuid","getresgid","getpgid","setfsuid","setfsgid","getsid",
        "capget","capset","rt_sigpending","rt_sigtimedwait","rt_sigqueueinfo",
        "rt_sigsuspend","sigaltstack","utime","mknod","uselib","personality",
        "ustat","statfs","fstatfs","sysfs","getpriority","setpriority",
        "sched_setparam","sched_getparam","sched_setscheduler","sched_getscheduler",
        "sched_get_priority_max","sched_get_priority_min","sched_rr_get_interval",
        "mlock","munlock","mlockall","munlockall","vhangup","modify_ldt",
        "pivot_root","prctl","arch_prctl","adjtimex","setrlimit","chroot",
        "sync","acct","settimeofday","getdents64","restart_syscall","tgkill",
        "utimes","epoll_create","epoll_ctl","epoll_wait","set_tid_address",
        "semtimedop","fadvise64","timer_create","timer_settime","timer_gettime",
        "timer_getoverrun","timer_delete","clock_gettime","clock_getres",
        "clock_nanosleep","exit_group","epoll_wait","epoll_ctl","tgkill",
        "utimes","vserver","waitid","ioprio_set","ioprio_get","inotify_init",
        "inotify_add_watch","inotify_rm_watch","migrate_pages","openat","mkdirat",
        "mknodat","fchownat","futimesat","newfstatat","unlinkat","renameat",
        "linkat","symlinkat","readlinkat","fchmodat","faccessat","pselect6",
        "ppoll","unshare","set_robust_list","get_robust_list","splice","tee",
        "sync_file_range","vmsplice","move_pages","utimensat","epoll_pwait",
        "signalfd","timerfd_create","eventfd","fallocate","timerfd_settime",
        "timerfd_gettime","accept4","signalfd4","eventfd2","epoll_create1",
        "dup3","pipe2","inotify_init1","preadv","pwritev","rt_tgsigqueueinfo",
        "perf_event_open","recvmmsg","fanotify_init","fanotify_mark","prlimit64",
        "name_to_handle_at","open_by_handle_at","clock_adjtime","syncfs",
        "sendmmsg","setns","getcpu","process_vm_readv","process_vm_writev",
        "seccomp","getrandom","memfd_create","kexec_file_load","bpf",
        "execveat","userfaultfd","membarrier","mlock2","copy_file_range",
        "preadv2","pwritev2","pkey_mprotect","pkey_alloc","pkey_free",
        "statx","io_pgetevents","rseq","pidfd_send_signal","io_uring_setup",
        "io_uring_enter","io_uring_register","open_tree","move_mount","fsopen",
        "fsconfig","fsmount","fspick","pidfd_open","clone3","close_range",
        "openat2","pidfd_getfd","faccessat2","process_madvise","epoll_pwait2",
        "mount_setattr","quotactl_fd","landlock_create_ruleset","landlock_add_rule",
        "landlock_restrict_self","futex_waitv","set_mempolicy_home_node"
      ],
      "action": "SCMP_ACT_ALLOW"
    },
    {
      "names": ["reboot","kexec_load","init_module","finit_module","delete_module",
                "mount","umount","umount2","pivot_root","chroot","swapon","swapoff",
                "syslog","ptrace","process_vm_readv","process_vm_writev"],
      "action": "SCMP_ACT_ERRNO",
      "errnoRet": 1
    }
  ]
}
```

---

## Applying seccomp in bash (via libseccomp / prctl)

```bash
# Apply Docker default seccomp profile to runc container
runc run --bundle /tmp/oci-bundle \
  --no-new-keyring \
  sandbox-$(date +%s)
# seccomp profile embedded in config.json under linux.seccomp

# Verify which syscalls a binary needs
strace -c -e trace=all /bin/bash -c "ls /tmp" 2>&1 | grep -v '^%'
```

---

## Minimal agent allowlist (bash-only workload)

```
ALLOW: read, write, open, openat, close, stat, fstat, execve, exit_group
ALLOW: mmap, munmap, brk, mprotect, clone, wait4, getpid, getuid
ALLOW: nanosleep, clock_gettime, getrandom, futex, prctl
DENY ALL OTHERS with SCMP_ACT_ERRNO(EPERM)
```

---

## Anti-Fake-Pass Checklist

```
❌ defaultAction SCMP_ACT_ALLOW — defeats the entire filter
❌ ptrace allowed → process can read/write arbitrary memory of other processes
❌ mount allowed → can mount new filesystems to escape jail
❌ kexec_load allowed → can replace running kernel
❌ No architecture filter → x86 compat syscalls bypass x86_64 profile
❌ SCMP_ACT_KILL used for all denies → crashes legitimate binaries that probe syscalls
❌ Profile not embedded in OCI config.json → runc ignores it
```

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.