Linux 6.x内核下如何通过eBPF LSM钩子精准拦截文件删除?
问题分析与解决方案
你的eBPF LSM程序加载成功但未生效,核心原因是BPF LSM模块未被内核激活,同时可能存在钩子使用细节问题,以下是具体排查和解决步骤:
1. 确认BPF LSM已加入内核激活列表
即便编译内核时开启了CONFIG_BPF_LSM=y,内核默认也可能不会将BPF LSM纳入active LSM管控链:
- 查看当前启用的LSM模块:
若输出不含cat /sys/kernel/security/lsmbpf,说明BPF LSM未激活。 - 临时激活:修改内核启动参数,在原有LSM列表后追加
bpf(比如原参数为lsm=apparmor,改为lsm=apparmor,bpf),重启系统生效。 - 永久生效:编辑GRUB配置文件(如
/etc/default/grub),在GRUB_CMDLINE_LINUX字段中加入lsm=...,bpf,执行update-grub后重启。
2. 修正钩子函数签名(可选但推荐)
你的代码使用void *ctx作为参数虽合法,但显式声明钩子的标准参数可提升兼容性:
#include <linux/path.h> #include <linux/dentry.h> #include <linux/types.h> #include <linux/errno.h> #include <bpf/bpf_helpers.h> SEC("lsm/path_unlink") int BPF_PROG(security_path_unlink, struct path *dir, struct dentry *dentry) { return -EPERM; } char LICENSE[] SEC("license") = "GPL";
3. 确保程序正确附加到钩子
部分内核版本中,仅用bpftool prog load加载程序不会自动绑定到LSM钩子,需显式创建链接:
- 加载程序后,用
bpftool prog show获取程序ID(例如你的示例中是93) - 创建链接:
可用bpftool link create prog 93 type lsmbpftool link show验证链接状态。
4. 测试验证
完成上述操作后,尝试删除文件:
rm test.txt
若收到Operation not permitted错误,说明eBPF程序已生效。
内容的提问来源于stack exchange,提问作者u4963840
相关产品推荐
相关产品推荐

