Linux seccomp机制及示例代码
Linux seccomp介绍及demo示例
Linux seccomp 介绍
seccomp(Secure Computing Mode) 是 Linux 内核的安全机制,用于限制进程可执行的系统调用(syscalls)。通过过滤系统调用,seccomp 能有效减少内核暴露的攻击面,提升应用安全性。它有两种工作模式:
严格模式(strict mode)
只允许read()
,write()
,_exit()
,sigreturn()
四个系统调用,其他调用会触发SIGKILL
。过滤模式(filter mode / seccomp-bpf)
使用 BPF(Berkeley Packet Filter)规则 自定义允许/禁止的系统调用,支持精细控制(如参数检查、返回错误码而非终止进程)。
示例:使用 libseccomp 的过滤模式 Demo
场景说明
创建一个程序,仅允许:
- 退出进程(
exit_group
) - 内存分配(
brk
,由malloc
触发) - 向终端输出(
write
) - 从终端读取(
read
)
禁止其他所有系统调用(如文件操作)。
代码实现
1 |
|
编译与运行
安装依赖(Ubuntu):
1
sudo apt-get install libseccomp-dev gcc
编译程序:
1
gcc seccomp_demo.c -o seccomp_demo -lseccomp
运行测试:
1
./seccomp_demo
输出示例:
1
2Hello, seccomp!
Enter something: [输入任意字符后程序正常退出]测试违规操作:
取消fopen
的注释后重新编译运行,程序会立即终止(触发SIGKILL
)。
关键函数说明
函数 | 作用 |
---|---|
seccomp_init(SCMP_ACT_KILL) |
初始化上下文,默认禁止所有系统调用 |
seccomp_rule_add(ctx, action, syscall, 0) |
添加规则(0 表示无条件允许) |
seccomp_load(ctx) |
将规则加载到内核 |
seccomp_release(ctx) |
释放上下文资源 |
高级用法
参数过滤
只允许特定参数的系统调用,例如仅允许向标准输出(fd=1
)写入:1
2seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(write), 1,
SCMP_A0(SCMP_CMP_EQ, STDOUT_FILENO)); // 检查第一个参数 fd==1返回错误码
禁止系统调用时返回错误码(而非终止进程):1
seccomp_init(SCMP_ACT_ERRNO(EPERM)); // 返回 EPERM 错误
调试规则
导出规则到文件:1
seccomp_export_bpf(ctx, f); // 将 BPF 规则写入文件描述符 f
应用场景
- 容器安全(Docker、Kubernetes)
- 浏览器沙箱(Chrome、Firefox)
- 敏感服务(如密钥管理)
- 防止提权攻击
通过 seccomp,开发者能主动定义进程的“权限边界”,极大增强 Linux 应用的纵深防御能力。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Helloeuler!