Linux 内核 MPTCP 漏洞(CVE-2026-98432)处置手册
本文适用于使用 LAS 以下公共镜像创建的实例:Ubuntu 22.04、Ubuntu 24.04、CentOS Stream 9、Debian 11 和 Debian 12。
CVE-2026-98432 影响 Linux 内核的 IPv4 TCP 连接处理。漏洞可能导致内核崩溃、内存破坏,在满足特定条件时可能造成远程代码执行。请优先升级到发行版已经发布修复的内核,并在升级后重启实例。
确认当前状态
在实例中执行:
# 查看发行版和当前运行内核
cat /etc/os-release
uname -r
# 查看 MPTCP 总开关;系统不支持该参数时会显示“未提供”
sysctl -n net.mptcp.enabled 2>/dev/null || echo "net.mptcp.enabled 未提供"
# 查看 MPTCP 监听套接字;ss 不支持 -M 时可能没有输出
ss -Mln 2>/dev/null || true
# 查看 IPv4 TCP 请求迁移开关
sysctl -n net.ipv4.tcp_migrate_req 2>/dev/null || echo "tcp_migrate_req 未提供"
处置方式
- 升级内核并重启。(推荐)
- 关闭 MPTCP 和 TCP 请求迁移,处理已有监听,并限制不必要的 TCP 访问。
- 配置 iptables 报文过滤,丢弃带 IPv4 选项的 TCP 报文和带 MPTCP 选项的 SYN 报文,并配置开机恢复。
方式 2~3 只作为临时可选的防护办法,不能替代内核补丁修复。
处置步骤 1:升级内核并重启
Ubuntu 22.04/24.04 内核升级
升级前请创建实例快照,升级完成后需要重启实例。
- 以
root用户登录,执行:
set -e
# 更新软件包索引并升级内核
apt-get update
apt-get install --only-upgrade -y linux-image-virtual
- 重启实例:
reboot
- 实例恢复后检查:
uname -r
Ubuntu 22.04 应显示 5.15.0-203-generic 或更新版本;Ubuntu 24.04 应显示 6.8.0-149-generic 或更新版本,即表示升级成功。
旧内核会保留。如新内核无法启动,请通过控制台进入 GRUB 的高级选项,选择旧内核启动。
CentOS Stream 9 内核升级
升级前请创建实例快照,升级完成后需要重启实例。
- 以
root用户登录,执行:
set -e
# 刷新软件包索引并升级内核
dnf --refresh upgrade -y kernel kernel-core kernel-modules
- 重启实例:
reboot
- 实例恢复后检查:
uname -r
显示 5.14.0-763.el9.x86_64 或更新版本,即表示升级成功。
旧内核会保留。如新内核无法启动,请通过控制台进入 GRUB,选择旧内核启动。
Debian 11 内核补丁
升级前请创建实例快照,升级完成后需要重启实例。
- 以
root用户登录,执行:
set -e
# 下载修复内核
curl -fL --retry 3 \
https://kodo-toolbox.qiniu.com/las/deb/debian-5.10.274_amd64.deb \
-o /tmp/debian-5.10.274_amd64.deb
# 安装内核并更新启动项
dpkg -i /tmp/debian-5.10.274_amd64.deb
update-grub
- 重启实例:
reboot
- 实例恢复后检查:
uname -r
显示以下版本即表示升级成功:
5.10.274-bullseye-local
旧内核会保留。如新内核无法启动,请通过控制台进入 GRUB 的高级选项,选择旧内核启动。
Debian 12 内核升级
升级前请创建实例快照,升级完成后需要重启实例。
- 以
root用户登录,普通系统镜像执行:
set -e
# 更新软件包索引并升级 cloud 内核
apt-get update
apt-get install --only-upgrade -y linux-image-cloud-amd64
桌面镜像将上述 linux-image-cloud-amd64 替换为 linux-image-amd64。
- 重启实例:
reboot
- Debian 执行 uname -r 查看的是内核 ABI 版本。请执行以下命令,确认当前运行内核对应的软件包版本:
dpkg-query -W -f='${Version}\n' "linux-image-$(uname -r)"
显示 6.1.190-1 或更新版本,即表示升级成功。
旧内核会保留。如新内核无法启动,请通过控制台进入 GRUB 的高级选项,选择旧内核启动。
处置步骤 2:关闭 MPTCP 和 TCP 请求迁移
在无法立即升级时,可采取以下措施降低风险,但不能替代补丁:
关闭 MPTCP:
sysctl -w net.mptcp.enabled=0;Go 程序可设置环境变量GODEBUG=multipathtcp=0,或在 main 模块go.mod中加入godebug multipathtcp=0,或改用net.ListenConfig.SetMultipathTCP(false)。强调:关闭内核 MPTCP 开关只影响后续创建的 socket,已有 MPTCP 监听和连接不会自动清除,需重启对应服务、断开已有连接。如果服务显式创建 MPTCP socket,重启后可能启动失败。
环境变量需写入服务或容器的启动配置,并保留已有的其他
GODEBUG选项;修改后重启服务。go.mod或代码变更需重新构建发布。执行
sysctl -w net.ipv4.tcp_migrate_req=0,并用bpftool prog list排查、移除sk_reuseport类型的 BPF 迁移程序,以关闭第二条路径;同步修改其启动配置,避免重启后重新加载。清理不必要的
setsockopt(IP_OPTIONS)用法。收敛暴露面:对非必要对外开放的 TCP 服务实施访问控制,优先保护 Web、SSH、数据库与代理等互联网可达服务,并将规则保存在安全组或现有防火墙配置中。
内核参数持久化:以 root 执行以下命令,保存上述两个参数并立即生效,确保重启后仍然生效:
set -e
# 仅配置当前内核支持的参数,并立即生效
: > /etc/sysctl.d/99-cve-2026-98432.conf
for key in net.mptcp.enabled net.ipv4.tcp_migrate_req; do
if sysctl -n "$key" >/dev/null 2>&1; then
printf '%s = 0\n' "$key" >> /etc/sysctl.d/99-cve-2026-98432.conf
sysctl -w "$key=0"
fi
done
# 确认参数为 0;当前内核不支持的参数会显示“未提供”
sysctl -n net.mptcp.enabled 2>/dev/null || echo "net.mptcp.enabled 未提供"
sysctl -n net.ipv4.tcp_migrate_req 2>/dev/null || echo "tcp_migrate_req 未提供"
支持的参数应显示为 0,重启后再次查询确认。
处置步骤 3:配置 iptables 报文过滤
本方案通过 iptables 丢弃带 IPv4 选项的 TCP 报文和带 MPTCP 选项的 SYN 报文,不影响普通 TCP 选项。
请以 root 用户登录实例,并配合处置步骤 2操作。
重要:如果业务使用 IPv4 选项或 MPTCP,请先在测试环境验证,确认业务正常后再应用到生产环境。
根据实例的操作系统,执行对应命令安装 iptables:
# Ubuntu、Debian
apt-get update
apt-get install -y iptables
# CentOS Stream 9
dnf install -y iptables
执行以下命令,创建过滤脚本并设置开机自动加载。如果实例中已存在同名规则链、脚本或服务,请先确认是否已配置本方案。
set -e
# 加载 xt_u32 模块,并设置开机自动加载
modprobe xt_u32
printf '%s\n' xt_u32 > /etc/modules-load.d/cve-2026-98432.conf
# 创建可重复执行的规则脚本,不清空其他防火墙规则
cat > /usr/local/sbin/cve-2026-98432-iptables.sh <<'SCRIPT'
#!/usr/bin/env bash
set -euo pipefail
CHAIN=CVE-2026-98432
ipt() { iptables -w 5 -t raw "$@"; }
# 只创建专用链和缺失规则,不清空已有防火墙规则。
if ! ipt -S "$CHAIN" >/dev/null 2>&1; then
ipt -N "$CHAIN"
fi
ipt -C "$CHAIN" -p tcp --tcp-flags SYN,ACK SYN -m tcp --tcp-option 30 -j DROP 2>/dev/null ||
ipt -I "$CHAIN" 1 -p tcp --tcp-flags SYN,ACK SYN -m tcp --tcp-option 30 -j DROP
ipt -C "$CHAIN" -p tcp -m u32 --u32 '0&0x0F000000=0x06000000:0x0F000000' -j DROP 2>/dev/null ||
ipt -I "$CHAIN" 1 -p tcp -m u32 --u32 '0&0x0F000000=0x06000000:0x0F000000' -j DROP
ipt -C "$CHAIN" -j RETURN 2>/dev/null || ipt -A "$CHAIN" -j RETURN
# 先准备完整链,再接入入站路径。
ipt -C PREROUTING -p tcp -j "$CHAIN" 2>/dev/null ||
ipt -I PREROUTING 1 -p tcp -j "$CHAIN"
SCRIPT
chmod 0750 /usr/local/sbin/cve-2026-98432-iptables.sh
# 创建开机恢复服务
cat > /etc/systemd/system/cve-2026-98432-mitigation.service <<'UNIT'
[Unit]
Description=CVE-2026-98432 temporary packet filtering
Wants=network-pre.target
After=network-pre.target systemd-modules-load.service iptables.service nftables.service netfilter-persistent.service firewalld.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/sbin/cve-2026-98432-iptables.sh
ExecReload=/usr/local/sbin/cve-2026-98432-iptables.sh
[Install]
WantedBy=multi-user.target
UNIT
# 启用开机恢复并立即应用
systemctl daemon-reload
systemctl enable cve-2026-98432-mitigation.service
systemctl restart cve-2026-98432-mitigation.service
执行以下命令,检查服务和规则是否生效。实例重启后,请再次检查。
# 应显示 enabled,存在跳转规则及两条 DROP 规则
systemctl is-enabled cve-2026-98432-mitigation.service
iptables -t raw -C PREROUTING -p tcp -j CVE-2026-98432
iptables -t raw -L CVE-2026-98432 -n -v -x
服务状态应为 enabled,跳转规则检查无报错,规则列表中应包含两条 DROP 规则。配置完成后,请确认 SSH 和业务访问正常。
说明:重载防火墙后,请重新检查规则。如果规则丢失,执行 systemctl restart cve-2026-98432-mitigation.service 恢复。
已有 MPTCP 监听仍需按步骤 2 重启对应服务。本方案仅过滤经过实例 iptables 的报文;如需保护容器或 Pod,请在其网络环境中单独验证规则是否生效。