seccomp接口用法及示例详解
seccomp接口用法及示例
seccomp
(Secure Computing Mode)是 Linux 内核的安全机制,用于限制进程可用的系统调用(syscall),增强应用程序的安全性。以下是详细用法及示例:
核心接口
prctl(PR_SET_SECCOMP, ...)
传统模式,仅允许read
/write
/exit
/sigreturn
四种系统调用。seccomp(SECCOMP_SET_MODE_FILTER, ...)
基于 BPF(Berkeley Packet Filter)的高级模式,支持自定义过滤规则。
示例 1:基础用法(C语言)
1 |
|
示例 2:BPF 高级过滤(C语言)
1 |
|
示例 3:Python 使用 libseccomp
1 | import ctypes |
关键步骤
- 初始化上下文
seccomp_init(SCMP_ACT_KILL)
:默认拒绝所有调用。
- 添加规则
seccomp_rule_add(ctx, action, syscall, arg_cnt, ...)
:允许/拒绝特定系统调用。
- 加载过滤器
seccomp_load(ctx)
:应用规则到当前进程。
- 释放资源
seccomp_release(ctx)
:清理上下文。
常用系统调用编号
调用名 | 编号 | 说明 |
---|---|---|
read |
0 | 读取文件 |
write |
1 | 写入文件 |
exit |
60 | 退出进程 |
exit_group |
231 | 退出所有线程 |
openat |
257 | 打开文件 |
通过
grep -r "SYSCALL_NAME" /usr/include/
查找编号。
注意事项
- 禁止提权:必须先调用
prctl(PR_SET_NO_NEW_PRIVS, 1)
。 - 多线程:需在主线程设置,子线程继承规则。
- 调试:使用
SCMP_ACT_TRAP
替代KILL
,捕获SIGSYS
信号调试规则。 - 容器支持:Docker 等容器默认启用 seccomp,配置文件位于
/etc/docker/seccomp.json
。
通过合理配置 seccomp,可显著减少应用程序的攻击面,提升系统安全性。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Helloeuler!