直接设置unprivileged_bpf_disabled为1即可禁用非特权BPF,但该值设为1后不可运行时修改,必须重启才能更改;其仅限制非root用户调用bpf系统调用,需配合CAP权限管控、debugfs禁用等措施才能全面收敛风险。

直接设置 unprivileged_bpf_disabled 为 1 即可禁用非特权 BPF
只要内核版本 ≥ 3.15(几乎全部现代发行版都满足),且未被编译为完全禁用 BPF(即 CONFIG_BPF_SYSCALL=y),就可以通过写入 /proc/sys/kernel/unprivileged_bpf_disabled 立即生效。值设为 1 表示:非 root 用户调用 bpf() 系统调用将直接返回 -EPERM,且该值**不可再运行时修改**——必须重启才能改回 0 或 2。
unprivileged_bpf_disabled 的三个取值含义和陷阱
这个参数不是简单的“开/关”开关,不同值的行为差异极大:
-
0:默认值,允许非特权用户使用 BPF(含 eBPF 加载、map 创建等)——这是大多数开发/调试环境的起点,但生产环境极不推荐 -
1:禁止非特权用户调用bpf(),且**写入后无法再通过echo改回其他值**;验证方式是普通用户执行bpf(BPF_PROG_LOAD, ...)会失败,cat /proc/sys/kernel/unprivileged_bpf_disabled仍显示 1 -
2:同样禁止非特权调用,但**允许管理员后续再次写入 0 或 1**;适合需要临时放开调试又不想重启的场景(如容器平台运维)
注意:unprivileged_bpf_disabled=1 是单向锁,误设会导致 sudo 用户以外的所有 BPF 工具(如 bpftool、tc 带 bpf 分类器、cilium agent 初始化)全部失败,且无提示——只报 Operation not permitted。
如何验证是否真正禁用成功
不能只看 echo 1 > /proc/sys/kernel/unprivileged_bpf_disabled 是否返回成功,必须用非 root 用户实测关键路径:
- 运行
bpftool prog list(应报错Permission denied) - 在普通用户下尝试加载一个最简 bpf 程序(如用
libbpf调用bpf_prog_load()) - 检查
strace -e trace=bpf su -c 'true' 2>&1 | grep -q "bpf.*-1 EPERM"是否命中 - 确认
cat /proc/sys/kernel/unprivileged_bpf_disabled输出确实是1(不是空或报错)
特别注意:某些发行版(如 RHEL 8.8+、Ubuntu 22.04 LTS 后续内核)默认已设为 2,而非 0;直接设 1 前建议先 cat 确认当前值。
永久生效要加 GRUB 参数,别只靠 sysctl
/proc/sys 设置会在重启后丢失。若需每次启动都禁用,必须在 GRUB 内核命令行中添加:
unprivileged_bpf_disabled=1
操作步骤:sudo nano /etc/default/grub → 修改 GRUB_CMDLINE_LINUX 行,追加该参数 → sudo update-grub && sudo reboot。否则重启后恢复为默认值(通常是 0 或 2),安全策略形同虚设。
另外,unprivileged_bpf_disabled=1 只管系统调用入口,不防 root 用户滥用;真正收敛风险还需配套关闭 perf_event_paranoid、限制 CAP_SYS_ADMIN 和 CAP_BPF、禁用 debugfs 等——它只是整条加固链里关键但非唯一的一环。


















