宝塔报 dhcp 漏洞?一次 CentOS 版本号引发的误报
结论先说:宝塔报的这三个 dhcp 漏洞是误报。服务器上装的就是它要求的版本,只是 CentOS 换了个名字,扫描器没认出来。
事情是这样的
一台 CentOS 7 服务器上,宝塔面板的安全扫描报了三条系统软件漏洞:
dhcp-common-4.2.5-83.el7.centos.2 版本低于 4.2.5-83.el7_9.2
dhcp-libs-4.2.5-83.el7.centos.2 版本低于 4.2.5-83.el7_9.2
dhclient-4.2.5-83.el7.centos.2 版本低于 4.2.5-83.el7_9.2
乍一看像是漏了补丁。但仔细对比会发现,两个版本号都是 4.2.5-83,末尾也都是 .2,只有中间一个写 el7.centos、一个写 el7_9。
排查:看一眼 changelog 就清楚了
判断补丁有没有打,最可靠的办法不是比版本号,而是看包自己的变更记录:
[root@banana2 ~]# rpm -q --changelog dhclient | head -20
* Mon Jun 10 2024 CentOS Sources <bugs@centos.org> - 4.2.5-83.el7.centos.2
- Roll in CentOS Branding
* Wed May 22 2024 Stepan Broz <sbroz@redhat.com> - 12:4.2.5-83.2
- Rebuild because of bind ABI changes related to CVE-2023-50387
* Thu May 27 2021 Pavel Zhukov <pzhukov@redhat.com> - 12:4.2.5-83.1
- Fix for CVE-2021-25217
...
从下往上读:
- 83.1(2021-05-27):Red Hat 修复 CVE-2021-25217。
- 83.2(2024-05-22):Red Hat 的重新编译,就是 RHEL 上的
4.2.5-83.el7_9.2,也就是宝塔要求的版本。 - 83.el7.centos.2(2024-06-10):CentOS 在 83.2 的基础上只做了一件事——替换品牌标识(Roll in CentOS Branding)。
也就是说,宝塔要求的补丁已经完整包含在当前安装的包里。
为什么会误报
误报有两个原因叠加:CentOS 改了版本号的写法,而 RPM 的比较规则恰好把改后的名字判为更旧。
CentOS 会重命名 release 标签
CentOS 是拿 RHEL 公开的源码重新编译的。重编译时,它会把 RHEL 版本号里的 el7_9 替换成 el7.centos,代码本身不变。
|
RHEL 版本 |
CentOS 对应版本 |
内容 |
|---|---|---|
|
4.2.5-83.el7_9.2 |
4.2.5-83.el7.centos.2 |
配合 bind 修复的重编译(2024) |
|
4.2.5-83.el7_9.1 |
4.2.5-83.el7.centos.1 |
修复 CVE-2021-25217(2021) |
宝塔的漏洞规则显然是照着 RHEL 的安全公告写的,只认 el7_9 这种写法。
RPM 把「centos」判得比「9」旧
RPM 比较版本号时,会把字符串切成一段一段的数字和字母,逐段比较:
83.el7.centos.2 → 83 | el | 7 | centos | 2
83.el7_9.2 → 83 | el | 7 | 9 | 2
前三段完全相同。第四段一边是字母 centos,一边是数字 9。RPM 的规则是:数字段总是比字母段新。于是 el7.centos.2 被判为「低于」el7_9.2,尽管两者是同一份代码。
实际上,宝塔对 CentOS 7 上所有 el7_9.x 规则的包都可能触发同样的误报。
83.2 其实没修 dhcp 的漏洞
顺带一个有意思的细节:83.2 这次更新本身并不修 dhcp 的漏洞。
changelog 写得很明白:这是一次因为 bind 的 ABI 变化而做的重新编译。当时 bind 修复了 CVE-2023-50387(俗称 KeyTrap,一个 DNSSEC 验证时可被利用来耗尽 CPU 的拒绝服务漏洞),库的接口变了。dhcp 链接了 bind 的库,所以必须跟着重编译一次才能兼容。
换句话说,真正的安全修复在 bind 那边。如果要确认服务器对 KeyTrap 是安全的,该看的是 bind 的版本,而不是 dhcp。
怎么处理
- 在宝塔里忽略这三项。 已经确认是同一版本,没有任何需要升级的东西。
- 顺便检查 bind 的库是否已修复 KeyTrap。
rpm -q bind-export-libs bind-libs-lite
版本号中带 9.11.4-26.P2.el7_9.16 或更高即为已修复;更低的话执行 yum update bind-export-libs bind-libs-lite。
如果想亲自验证 RPM 的比较结果,可以装上 rpmdevtools 后运行:
rpmdev-vercmp 4.2.5-83.el7.centos.2 4.2.5-83.el7_9.2
它会告诉你后者「更新」,正好复现了宝塔的判断。
更值得关心的问题:CentOS 7 已经停更
注意 changelog 最上面那条的日期:2024 年 6 月 10 日。二十天后,2024 年 6 月 30 日,CentOS 7 正式停止维护。这个包很可能就是 CentOS 7 上 dhcp 的最后一次更新。
这意味着:
- 这次是误报,但之后宝塔报出的漏洞会越来越多是真的,而且永远等不到官方补丁。
- 官方镜像已下线,
yum需要改用 vault.centos.org 或国内镜像的 vault 源才能用。
如果是长期在用的生产服务器,建议尽快规划迁移到仍在维护的发行版,如 Rocky Linux、AlmaLinux 或 OpenCloudOS。
小结:扫描器说「版本过低」时怎么判断
漏洞扫描器本质上是在比字符串,而不是在检查代码。遇到类似告警,可以按这个顺序判断:
- 对比主版本号和末尾的数字。 如果只是
el7_9与el7.centos这类发行版标签不同,很可能是同一个版本。 - 看
rpm -q --changelog。 上游的修复记录和 CVE 编号都在里面,这是最直接的证据。 - 试一下
yum update。 如果提示没有可用更新,说明已经是发行版能提供的最新版。
确认是误报就忽略;确认是真漏洞但发行版已停更,那该考虑的就不是打补丁,而是换系统了。
浙公网安备 33010602011771号