Livepatch 模块,可在无需重启的情况下,在运行中的 AlmaLinux 或 Rocky Linux 8、9 或 10 主机(x86_64)上修复 CVE-2026-98432。对于同样缺少 CVE-2026-99999 修复的内核,同一模块也会一并修复该漏洞,因此无论主机内核缺少这两个漏洞中的哪一个,都只需要一个模块。
状态(2026-11-02):每个模块都已构建并完成加载测试;目前尚无任何模块发布,因此暂无可应用的内容。 接下来将进行发布,并在每个已发布模块上测试一行命令;在此之前,scripts/livepatch.sh 的表中没有任何模块,并会拒绝所有内核。
684 个内核:380 个来自 AlmaLinux,304 个来自 Rocky Linux,版本从 8.3 到 10.2,列于 tools/kernels.tsv。这涵盖了其 SRPM 和 debuginfo 均位于发行版镜像(包括 vault)上的所有内核,仅限 x86_64,但 Rocky 的 5.14.0-611.41.1.el9_7 除外,其 debuginfo 不在任何镜像上。它包括 Rocky 唯一的一个 8.3 内核 4.18.0-240.22.1.el8(此前的 Rocky 仓库未覆盖该内核),以及两个发行版在此前仓库之后发布的内核,直至 4.18.0-553.180.1.el8_10(AlmaLinux)、5.14.0-687.61.1.el9_8 和 6.12.0-211.69.1.el10_2。AlmaLinux 10 的 x86_64_v2 变体未覆盖。
684 个内核中有 666 个同样缺少 CVE-2026-99999 的修复,其模块同时包含两者。其余 18 个已具备该修复(从 AlmaLinux 4.18.0-553.177.1.el8_10 和 Rocky 553.178.1.el8_10 起,以及两个发行版从 5.14.0-687.59.1.el9_8 和 6.12.0-211.67.1.el10_2 起),其模块仅包含 CVE-2026-98432 的更改。
每个模块均在 CI 中构建,并于 2026-10-31 通过 scripts/livepatch.sh 在 VM 中应用到其随附内核(tools/loadtest.sh),每个发行版和次版本各运行一次,共 40 次运行;全部 684 个均输出 RESULT: PASS。在每次运行中:
inet_sock_destruct 和 tcp_v4_reqsk_destructor 被列为 vmlinux 的已修补函数。tools/tcpopt.py)。这会驱动修复所更改的两个释放路径,且选项存在;没有 IP 选项时,它们仅释放 NULL。nfnetlink_queue 和 xt_CHECKSUM 上生效(在 9 和 10 上还会在 nf_conntrack_bridge 上生效)。在 8 和 9 上(511 个内核,以及 Rocky 的 8.3),一个构造的帧被随附内核分片,并在应用模块后被丢弃。在 10 上(154 个内核),该帧在到达缺陷之前就被拒绝,因此该探测在 10 上无法说明任何问题。未测试:竞态本身。要在随附内核上展示 CVE-2026-98432 的存在以及应用模块后的消失,需要 KASAN 以及重传 SYN 与子进程释放的刻意交错;在这些 VM 中无法按需触发。也未在启用 Secure Boot 的情况下测试任何模块(模块未签名,会被拒绝),或通过 kpatch.service 在启动时加载。
tools/mkdiffs.sh 移植某个次版本的每个内核 SRPM。它首先像 %prep 那样将 SRPM 自身的补丁应用到其 tarball(tools/prep.py):AlmaLinux 以这种方式携带自己的修复,其中包括 4.18.0-553.177.1.el8_10 中 CVE-2026-99999 的修复,而 10.2 的 6.12.0-211.69.1 是 Red Hat 的 211.56.1 tarball 加上 466 个补丁,因此针对裸 tarball 制作的移植会遗漏内核实际拥有的内容。然后对照 tools/ref/ 检查更改的行:CVE-2026-98432 的更改必须与上游一致,CVE-2026-99999 的更改在 8 或 9 上必须与 AlmaLinux 的补丁一致、在 10 上必须与上游一致,或者在内核已具备该修复的地方不存在。全部 684 个均匹配。如果树中的 kfree_rcu() 不会跳过 NULL 指针(两个指针通常都是 NULL),tools/port.py 也会停止。
8 和 9 使用 kpatch-build 构建,10 使用内核自带的 klp-build 构建;两者都构建替换补丁,这正是模块接管先前模块的方式。
上游修复为 torvalds/linux e3f33b0a1d89,“ipv4: free inet_opt and
ireq_opt after an RCU grace period”。当 SYN 携带 IP 选项时,监听方会将这些选项保留在请求套接字(ireq_opt)上,并在不复制的情况下交给子套接字(inet_opt)。对同一请求重传的 SYN 可能在另一个 CPU 上以 SYN-ACK 应答,在 RCU 下读取这些选项,而与此同时子套接字被关闭,inet_sock_destruct() 用普通的 kfree() 释放它们:造成释放后使用。请求套接字迁移在 tcp_v4_reqsk_destructor() 中也有同样的问题。修复方案是用 kfree_rcu() 释放这两个指针。
两个发行版都尚未发布该修复:2026-10-27 时,AlmaLinux 和 Rocky Linux 8、9 和 10 的最新内核均未在其变更日志中提及该 CVE,且 4.18.0-305.3.1.el8_4、4.18.0-553.179.1.el8_10、5.14.0-687.61.1.el9_8 和 6.12.0-211.68.1.el10_2 的源码仍用 kfree() 释放这两个指针。
较早修复,各发行版分别由 nsrg-fmlorg/kpatch-alma-cve-2026-99999 和 nsrg-fmlorg/kpatch-rocky-cve-2026-99999 处理。两个发行版现在都发布包含该修复的内核,从 4.18.0-553.177.1.el8_10(AlmaLinux)或 553.178.1.el8_10(Rocky)、 5.14.0-687.59.1.el9_8 和 6.12.0-211.67.1.el10_2 起。若某内核缺少该修复,本仓库的模块会携带与先前模块相同的更改,并替换已加载的先前模块(在上述每个拥有先前模块的 665 个内核上均已测试)。
| 路径 | 说明 |
|---|---|
build.sh | 在发行版的容器内为单个内核构建模块 |
tools/kernels.tsv | CI 构建的内核:发行版、次版本、内核版本 |
tools/select-kernels.py | 一次 CI 运行选取其中哪些 |
tools/mkdiffs.sh | 为某个次版本的所有内核生成移植,并对照 tools/ref/ 检查 |
tools/prep.py | 在移植前,像 %prep 那样将 SRPM 自带的补丁应用到其 tarball |
tools/port.py | 更改本身,应用于内核树 |
tools/kpatchify.py | 将移植转换为送入 kpatch-build 的形式 |
tools/klp-overlay.sh、tools/klp-overlay-lds.py、tools/klp-overlay/ | 将 10.2 的 klp-build 借给 10.0 和 10.1 |
tools/klpsymcheck.py | 对照已发布内核检查 klp-build 模块的符号 |
tools/loadtest.sh、tools/loadtest-guest.sh、tools/loadtest-bootprep.sh、tools/loadtest-bootinfo.sh | 在 VM 中启动已发布内核,并应用、检查、移除模块 |
tools/csum-probe.sh、tools/csum-inject.py | 在前后探测 CVE-2026-99999 |
tools/tcpopt.py | 在存在 IP 选项的情况下,驱动 CVE-2026-98432 更改的两个释放路径 |
tools/doccheck.py | 当某文件未在两个 README 中同时列出,或链接失效时失败 |
scripts/livepatch.sh | 在主机上应用、检查并移除已发布的模块 |
scripts/build-local.sh | 在你自己的机器上构建并负载测试单个内核的模块 |
.github/workflows/diffs.yml | 为两个发行版的每个次版本运行 tools/mkdiffs.sh |
.github/workflows/build.yml | 构建并负载测试模块 |
.github/workflows/docs.yml | 运行 tools/doccheck.py |