CVE-2026-98432 是一个影响 linux 内核 IPv4 TCP 栈的释放后使用(use-after-free)漏洞,公开资料给出的 CVSS 评分为 9.8,影响范围从 linux 4.4 起的内核。它出问题的位置在网络栈而不是某个应用,因此一台面向公网提供 WordPress 的 VPS,只要接受 IPv4 TCP 入站连接,就在暴露面之内;而 Nginx、PHP-FPM、MySQL、SSH、监控探针、备份任务,以及可能存在的 Go 1.24+ 服务,都是需要逐一验证的业务路径。需要先厘清一点:MPTCP 不是暴露的必要条件,普通 TCP 连接同样可以走到有问题的代码路径,把关闭 MPTCP 当作修复是错误判断。
这篇文章按四步展开:核对内核包和 Ubuntu 补丁通道、用 nftables 做有边界的小范围缓解、安排重启窗口并逐项验收、准备好回滚路径。受影响版本、修复状态和利用条件以官方公告与发行版说明为准,本文给出的是可复核的检查方法和变更顺序。

第一步:把运行内核、安装包和通道状态分开核对
不要只看 uname -r 就下结论。运行内核、已安装的内核包、软件源里可用的候选版本,是三件不同的事,必须分别记录。
在 VPS 上以具备 sudo 权限的账号执行:
uname -r
dpkg -l 'linux-image-*' | awk '/^ii/ {print $2, $3}'
apt-cache policy linux-image-generic
apt-cache madison linux-image-generic | head预期现象是:uname -r 显示当前运行版本;dpkg -l 列出已安装的内核包及其版本;apt-cache policy 的 Candidate 指向某个软件源。重点看 Candidate 来自 -updates、-security 还是 -proposed。如果 /etc/apt/sources.list.d/ 下启用了 -proposed,要把这个事实单独标注出来,因为它意味着候选版本可能来自预发布通道。
接着到 Ubuntu 的 CVE 追踪页核对具体 release 与内核 flavor。Ubuntu 的 linux 包按发行版、按 flavor(generic、oracle、aws、gcp 等)分行列出状态,不能只看 generic 一行就推断所有 VPS 镜像。实际部署中,云厂商镜像常用的是带 flavor 的内核包。
把核对结果归入下面三类,处理动作完全不同:
| 状态 | 判断依据 | 处理动作 |
|---|---|---|
| 已修复 | 追踪页对应 release/flavor 标记为已修复,且 apt-cache policy 的候选版本来自正式 -updates 或 -security | 安排正常更新与重启窗口,按第三步验收 |
仅进入 -proposed | 候选版本来自 -proposed,或追踪页显示修复仍在预发布通道 | 不在生产全量推送;可在测试机或非关键节点小范围验证,记录版本号与变更单 |
| 暂无修复 | 追踪页显示对应行仍为 work in progress | 以临时缓解降低暴露面,持续复查通道,不自行拼接过期补丁 |
这里有两个常见误判。第一,把追踪页的“work in progress”当成“已有修复”,实际上它只表示有人在处理。第二,看到某个第三方帖子说“已经更新”,就直接在生产执行 apt install,而没有确认候选版本来自哪个通道。Ubuntu 的修复会按 release 和 flavor 分批推进,不同 VPS 镜像的节奏并不一致,必须以本机 apt-cache policy 和官方追踪页为准。
如果确认修复包已进入正式通道,更新时建议只升级内核相关包,避免顺带引入无关变更:
sudo apt update
sudo apt install --only-upgrade linux-image-generic linux-headers-generic如果使用的是云厂商 flavor,把包名换成对应的 linux-image-<flavor>。执行后不要立即重启,先确认新内核已安装、GRUB 已生成对应条目,再进入第三步的窗口安排。
第二步:nftables 临时缓解的适用边界
在修复包尚未进入正式通道时,可以用 nftables 丢弃带 IP 选项的 IPv4 TCP SYN 包,降低被触发的概率。原理很直接:漏洞与 TCP 连接请求处理中 IP option 内存的释放时序有关,把携带 IP options 的入站 SYN 挡在主机边界外,能减少走到该路径的机会。公开测试资料显示,规则加载后普通 TCP 连接仍然成功,而 SYN 携带 IP options 的连接会超时;Red Hat 也明确说明这类过滤只能降低暴露,不能完全防止利用。
这意味着它是缓解,不是修复。不要把它写进变更单的“已修复”栏,也不要用它替代内核更新。
先建独立的 table 和链,避免和现有防火墙规则混在一起难以回滚:
sudo nft add table ip cve98432
sudo nft add chain ip cve98432 input '{ type filter hook input priority -10; policy accept; }'先只计数、不丢弃,观察一段时间:
sudo nft add rule ip cve98432 input ip protocol tcp ip hdrlength != 5 tcp flags syn counter
sudo nft list table ip cve98432ip hdrlength != 5 匹配的是 IPv4 头长度大于最小 20 字节、即携带 IP options 的包;配合 tcp flags syn 只处理建连请求。计数器增长说明网络里确实存在这类流量。确认没有合法业务依赖 IP options 后,再把计数规则改为丢弃:
sudo nft delete rule ip cve98432 input handle <handle号>
sudo nft add rule ip cve98432 input ip protocol tcp ip hdrlength != 5 tcp flags syn counter drop执行位置是 VPS 本机,priority -10 让它在常规过滤之前生效。需要评估的影响面如下:
- HTTP/HTTPS:普通浏览器和 CDN 回源一般不带 IP options,Nginx 访问日志和状态码应无变化;如果前面有某些老式负载均衡或健康检查带 options,需要单独确认。
- SSH:日常登录不受影响。建议在变更时保留一个已建立的 SSH 会话,另开一个新会话验证,避免把自己锁在外面。
- 监控:Prometheus node_exporter、黑盒探针等如果走普通 TCP,不受影响;若探针构造特殊包,需要观察探针成功率。
- Go 1.24+ 服务:如果服务显式启用了 MPTCP 或对 IP options 有依赖,要单独测试;不要假设所有 Go 服务行为一致。
- IPv6:该规则只处理 IPv4,IPv6 路径不在覆盖范围内,不要误以为已全面缓解。
验证时准备两类检查:普通连接应成功,例如 curl -I https://你的域名 和对 SSH 端口做一次新连接;带 IP options 的 SYN 应超时。后者涉及构造数据包,只应在你拥有授权的测试环境中进行,不要在第三方系统上尝试。若没有条件构造,至少确认计数器在增长、业务探针全部正常,并把“未验证带 options 路径”写进变更记录。
回滚很简单:
sudo nft delete table ip cve98432删除后规则立即消失,不需要重启。把这条命令和变更单放在一起,确保值班人员能找到。

第三步:重启窗口与逐项验收
内核更新只有重启进入新内核才真正生效。对 WordPress VPS 来说,重启窗口要覆盖数据库连接、PHP 进程、Nginx 上游和备份任务,不能只看网站首页是否打开。
重启前完成四件事:
- 记录当前运行内核
uname -r和已安装内核包版本,写入变更单。 - 确认新内核已安装、GRUB 中存在对应启动项,并保留至少一个旧内核可回退。
- 完成一次数据库和站点文件的可用备份,确认备份可读,而不只是“任务成功”。
- 暂停或错开正在运行的备份、抓取、图片处理等长任务,避免重启中途留下半成品。
重启后按下面清单逐项确认:
| 检查项 | 命令或方法 | 预期现象 |
|---|---|---|
| 运行内核 | uname -r | 与刚安装的包版本一致 |
| 内核包状态 | dpkg -l 'linux-image-*' | 新包为 ii,旧包仍在 |
| 内核日志 | `dmesg -T | tail -50` |
| Nginx | nginx -t 与 systemctl status nginx | 配置通过,服务 active |
| PHP-FPM | systemctl status php*-fpm | active,无频繁重启 |
| 数据库 | 本地连接与一次简单查询 | 连接正常,无异常断开 |
| SSH | 新开一个会话登录 | 可登录,密钥与密码策略正常 |
| 站点入口 | curl -I 首页、登录页、上传接口 | 状态码符合预期 |
| 监控 | 探针页面与告警面板 | 指标恢复,无断点 |
| 备份 | 手动触发一次小备份 | 任务完成且产物可读 |
观察窗口建议至少覆盖一个完整的业务低峰到高峰周期。重点看四类信号:dmesg 是否出现新的内核告警;Nginx 的 5xx 和上游超时是否上升;SSH 新连接是否变慢或失败;监控探针是否出现规律性断点。如果更新前启用了 nftables 缓解规则,重启后要确认规则仍在、计数器行为符合预期,或者按计划移除。
回滚路径要提前写清楚,而不是出事再找:
- 如果新内核启动后业务异常,先在 GRUB 中选择旧内核启动,确认站点恢复,再排查新内核与驱动、云厂商 agent、文件系统的兼容性。
- 如果只是 nftables 规则导致连接异常,删除对应 table 即可,不需要重启。
- 不建议在生产直接降级内核包;优先通过启动旧内核恢复服务,保留现场后再决定后续动作。
第四步:把这次处置变成可复用的检查项
做完一轮之后,至少留下三样东西:一份记录运行内核、包版本、通道来源和重启时间的变更单;一份 nftables 缓解规则的启用与移除记录,注明它只是临时措施;一份重启后的验收结果,包含失败项和回滚动作。下次遇到同类内核 CVE,可以直接复用这套顺序:先分清运行内核、安装包和通道状态,再决定是更新、观察还是临时缓解,最后用业务路径验收而不是只看服务是否启动。
还有两点需要持续跟踪。第一,Ubuntu 的修复会按 release 和 flavor 分批推进,今天在 -proposed 不代表明天还在,今天没修复也不代表明天没有,复查时要重新看追踪页和 apt-cache policy,不要凭上一次的结论操作。第二,公开的 PoC 和利用细节会改变风险判断,但在自己的环境中做任何验证都必须限定在授权范围内,不要对生产入口做压力式测试。临时规则能争取时间,真正关闭这个问题仍然要回到厂商内核包和一次经过验收的重启。
- flag
- it2021
- it2021.com
- linux
- nginx
- WordPress
- 密码策略





1F
内核漏洞真麻烦,重启窗口最怕业务断
2F
云厂商内核 flavor 容易漏看,之前只查 generic 吃过亏
3F
nftables 只挡 IPv4,IPv6 那边怎么观察?
4F
proposed 包敢不敢上小站?
5F
先核通道再动手,这顺序稳
6F
apt-cache policy 每次都要看,不然容易翻车