Seccomp 通过内核态白名单机制最小化系统调用,需默认禁止一切并仅放行必需项;推荐先记录真实 syscall 行为,结合 auditctl 或 seccomp-tools trace 分析,再按应用内嵌或容器运行时两种方式配置 JSON 规则,注意兼容运行时依赖(如 glibc、Go、systemd)。

Seccomp 是 Linux 内核原生的系统调用过滤机制,它不依赖外部工具或运行时,在内核态直接拦截非法 syscall,开销极低、生效即时。要真正限制不必要的内核调用,关键不是“禁用危险调用”,而是构建最小可用白名单——只放行进程实际需要的那几个系统调用。
明确目标:从白名单思维出发
默认禁止一切,再逐个添加必需项,比从黑名单删减更可靠。很多看似“安全”的调用(如 openat、execve)在特定上下文中可能被滥用;而一些冷门调用(如 rt_sigreturn、brk)却是 C 运行时或内存分配所必需的。
- 先运行应用并记录真实 syscall 行为,推荐使用 auditctl -a always,exit -F arch=b64 -S all 或 seccomp-tools trace
- 避免直接禁用 clone、execve、mmap 等基础调用——容器运行时和动态链接器本身依赖它们
- 对只读服务,可拒绝 openat 的写标志(通过 BPF 参数匹配 O_WRONLY 或 O_RDWR)
两种主流配置方式
根据使用场景选择合适路径:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 应用内嵌策略(C/C++/Rust):在 main() 开头、任何线程创建前,用 libseccomp 加载规则。适合长期运行的守护进程或 CLI 工具
- 容器运行时加载(Docker / CRI-O / Podman):通过 JSON 格式 seccomp profile 指定,默认挂载到所有容器进程。适合云原生环境,无需修改应用代码
编写有效 JSON 规则的关键点
一个实用的 seccomp 配置文件需包含三项核心内容:
- defaultAction 设为 "SCMP_ACT_ERRNO"(返回 EPERM)而非 "SCMP_ACT_KILL",便于调试时识别被拦调用
- syscalls 列表中每个条目应有明确 action,例如:"name": "write", "action": "SCMP_ACT_ALLOW"
- 对敏感调用加参数约束:比如只允许 write 到 fd=1(stdout)或 fd=2(stderr),用 args 字段配合 SCMP_CMP_EQ 实现
避开常见陷阱
很多配置失效并非规则写错,而是忽略了运行时上下文:
- glibc 和 musl 在初始化阶段会调用 getrandom、clock_gettime、statx 等,未放行会导致程序启动失败
- Go 程序默认启用 CGO,会隐式触发 getuid、getgid;若禁用 CGO,则需额外允许 epoll_wait、epoll_ctl
- 容器中若启用了 systemd 或 journald 日志收集,需保留 sendto、connect 及 Unix domain socket 相关调用

















