seccomp函数用法及示例详解
seccomp函数用法及示例
seccomp
(Secure Computing Mode)是 Linux 内核的安全机制,用于限制进程可用的系统调用(syscall),从而减少攻击面。以下是详细用法和示例:
核心概念
两种模式:
SECCOMP_MODE_STRICT
:只允许read
,write
,_exit
,sigreturn
四个系统调用。SECCOMP_MODE_FILTER
(推荐):基于 BPF 规则自定义允许/拒绝的系统调用。
常用工具:
- 系统调用:
prctl()
或seccomp()
- 库:libseccomp(简化操作,推荐使用)
- 系统调用:
使用 libseccomp 的步骤
初始化过滤器
设置默认动作(如拒绝非法 syscall)。1
scmp_filter_ctx ctx = seccomp_init(SCMP_ACT_KILL); // 非法调用时杀死进程
添加允许的规则
明确允许需要的系统调用。1
2
3seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(read), 0); // 允许 read
seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(write), 0); // 允许 write
seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(exit), 0); // 允许 exit加载并应用规则
1
seccomp_load(ctx);
释放资源
1
seccomp_release(ctx);
完整示例:限制为只读/写文件
1 |
|
编译:
1 | gcc example.c -o example -lseccomp |
高级用法
1. 条件过滤(允许特定参数)
只允许从标准输入(fd=0)读取:
1 | seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(read), 1, |
2. 错误处理代替终止
非法调用时返回错误码(代替杀死进程):
1 | seccomp_init(SCMP_ACT_ERRNO(EPERM)); // 返回 EPERM 错误 |
3. 多架构支持
适配 x86_64 和 ARM:
1 | seccomp_arch_add(ctx, SCMP_ARCH_X86_64); |
调试技巧
- 检查所需系统调用:
1
strace -c ./your_program # 统计使用的 syscall
- 测试规则:
使用SCMP_ACT_LOG
记录违规但不终止进程:1
seccomp_init(SCMP_ACT_LOG); // 仅记录违规
常见问题
- 缺失必要系统调用:
程序崩溃或功能异常(如缺失brk
可能导致内存分配失败)。 - 信号处理冲突:
确保允许rt_sigreturn
(通常由 libseccomp 自动处理)。 - 性能影响:
BPF 过滤器对性能影响极小(通常 < 0.5%)。
应用场景
- 容器安全(Docker 默认使用 seccomp 配置文件)
- 沙盒化不可信代码
- 特权进程降权(如 Chromium 渲染进程)
通过合理配置 seccomp,可显著提升 Linux 应用程序的安全性。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Helloeuler!