uname -r提取纯内核版本字符串是判断漏洞影响范围的第一步,但需用cut -d'-' -f1剥离发行版后缀,再通过dpkg --compare-versions或rpmdev-vercmp进行数值比对,并结合安全公告验证补丁状态,不可仅凭版本号下结论。

直接用 uname -r 获取内核版本号,是排查旧内核漏洞的第一步,但不能只看这个结果就下结论——它只是起点,不是终点。
提取干净的主版本号用于比对
执行 uname -r 输出类似 5.4.0-122-generic 或 4.18.0-305.19.1.el8_4.x86_64 这样的字符串,其中混杂了发行版构建号、平台标识等干扰信息。漏洞是否受影响,只取决于上游内核主版本(如 5.4.0、4.18.0),其余后缀一律忽略。
- 最简方式:用
uname -r | cut -d'-' -f1提取前段 - 更稳妥方式:用
sed 's/^[^-]*-\([0-9.]\+\).*/\1/'防止个别版本格式异常 - 别用
uname -a或/proc/version,它们含主机名、编译时间等无关字段,易解析出错
对照 CVE 描述中的影响范围做版本判断
查到主版本后,不能靠字符串比较(比如 [ "5.15.0" \> "5.4.0" ] 会错判,因为字典序把 5.15.0 当成小于 5.4.0)。必须用数值化比对工具:
- Debian/Ubuntu 系统:用
dpkg --compare-versions "$(uname -r | cut -d- -f1)" ge "5.10.72" - RHEL/CentOS/AlmaLinux 系统:装
rpmdevtools后运行rpmdev-vercmp "$(uname -r | cut -d- -f1)" "5.10.72" | grep -q '^1$' - 避免手写 awk 脚本做点分版本比较——逻辑复杂、边界易漏,不推荐用于关键判断
确认是否已打补丁,而非仅看版本号
很多发行版会对旧内核 backport 修复(例如 CentOS 7 的 3.10.0-1160.114.2.el7 就含 Dirty COW 补丁),此时 uname -r 显示仍是 3.10.0,但实际已免疫。单靠版本号会误报。
- 查具体 CVE 是否修复:访问对应发行版安全公告页(如麒麟信安 CVE 页面、Ubuntu Security Notices、Red Hat Errata)
- 检查内核配置是否禁用相关功能:比如 CVE-2026-31431(Copy Fail)需运行
grep CONFIG_CRYPTO_USER_API_AEAD /boot/config-$(uname -r),若输出为=y或=m才真正受影响 - 容器环境注意:
lsb_release和hostnamectl常不可用或不返回真实内核版本,一律跳过
结合自动化工具交叉验证
人工比对容易遗漏边缘情况,建议搭配成熟检测工具快速筛查:
-
linux-exploit-suggester.sh:输入当前uname -r结果,自动列出可能适用的本地提权漏洞及 PoC 链接 - 检查
/lib/modules/$(uname -r)/kernel/crypto/目录是否存在疑似高危模块(如algif_aead.ko、fuse.ko),再查其是否被启用(lsmod | grep algif_aead) - 对生产系统,优先使用厂商提供的合规扫描器(如银河麒麟的
nkvers+ 官方补丁清单匹配)


















