禁用危险内核接口与调试功能的核心是系统性收敛暴露面:设kptr_restrict=2隐藏符号地址,dmesg_restrict=1禁止非特权读日志,只读挂载或禁用debugfs,禁用unprivileged_userns_clone、kexec、ftrace、perf_event_open及bpf jit,并通过grub参数永久加固。

禁用危险内核接口与调试功能,核心是关闭非必要暴露面、限制特权路径、防止信息泄露和本地提权。这不是简单关几个开关,而是围绕攻击链中常被利用的内核调试/诊断机制做系统性收敛。
重点关闭的高危内核接口
以下接口在默认启用时易被滥用,尤其在容器或共享宿主机环境中风险突出:
-
/proc/sys/kernel/kptr_restrict:设为 2,彻底隐藏内核符号地址(如
slab_alloc、commit_creds),阻断KASLR绕过类漏洞利用 - /proc/sys/kernel/dmesg_restrict:设为 1,禁止非特权用户读取内核日志,防止敏感内存布局或驱动缺陷信息泄露
-
/sys/kernel/debug/ 目录:通过
mount -o remount,ro /sys/kernel/debug只读挂载;更彻底方式是在内核编译时禁用CONFIG_DEBUG_FS=n,或启动参数加debugfs=off - /proc/sys/kernel/unprivileged_userns_clone(Linux 5.12+):设为 0,禁用普通用户创建 user namespace,缓解 CVE-2021-41073 等逃逸漏洞
运行时禁用调试相关功能
避免重启即可生效的加固项,适合生产环境快速落地:
- 禁用 kexec 加载新内核:
echo 0 > /proc/sys/kernel/kexec_load_disabled(需在首次加载后立即执行,否则不可逆) - 关闭 ftrace 跟踪器:
echo 0 > /sys/kernel/debug/tracing/tracing_on,并设/sys/kernel/debug/tracing/options/function-graph为只读 - 限制 perf_event_open 系统调用:
echo 2 > /proc/sys/kernel/perf_event_paranoid(2 表示仅允许 root 使用 perf) - 禁用 BPF JIT 编译器(若无需 eBPF):
echo 0 > /proc/sys/net/core/bpf_jit_enable,防止 JIT spray 类攻击
启动参数级永久禁用
在 GRUB 配置中追加内核命令行参数,确保每次启动都生效:
-
kptr_restrict=2 dmesg_restrict=1 debugfs=off nokaslr(nokaslr仅用于极特殊审计场景,一般不建议) -
security=lockdown lockdown=confidentiality:启用内核 Lockdown 模式,阻止运行时修改内核代码、禁用 kexec 和模块加载 -
user_namespace.enable=0(旧内核用user_namespace.disable=1):全局禁用 user namespace - 移除
rd.debug、systemd.log_level=debug等调试引导参数
验证是否生效
执行后务必逐项检查,不能只看设置命令是否返回成功:
- 运行
cat /proc/cmdline确认启动参数已写入 - 检查
ls /sys/kernel/debug/是否为空或仅含极少数只读文件 - 用普通用户执行
dmesg,应提示Operation not permitted - 执行
cat /proc/sys/kernel/kptr_restrict和/proc/sys/kernel/dmesg_restrict,确认值为 2 和 1 - 尝试
unshare -r /bin/sh,应失败并报Operation not permitted











