build-patched-kernel.sh 用于构建包含 CVE-2026-98432 上游修复的 Ubuntu 内核 .deb 软件包:
e3f33b0a1d89 "ipv4: free inet_opt and ireq_opt after an RCU grace period"
该漏洞是 ip_options_build() 中的一处释放后使用(use-after-free)。一个 CPU 可能仍在发送 SYNACK,而另一个 CPU 却释放了某个 TCP 套接字的 IPv4 选项。该修复将 net/ipv4/af_inet.c 和 net/ipv4/tcp_ipv4.c 中的两处 kfree() 调用替换为 kfree_rcu()。
uname -r 获取(例如 6.8.0-45-generic)。deb-src 软件源,并安装编译器与构建工具。apt-get source 下载构建该内核的 Ubuntu 源码包。如果软件仓库中已不再包含该版本,则回退到 Launchpad 的 pull-lp-source。随后安装构建依赖。kfree_rcu() 不接受 NULL),它会添加一个 NULL 检查。+cve202698432.1,使新软件包能够以相同的 ABI 升级软件仓库中的软件包。debian/rules 进行构建,并将 .deb 文件复制到 ./debs-<version>/。再次运行该脚本会复用已下载的源码,并且不会重复打补丁。
在 Ubuntu 机器本身上(以 root 或使用 sudo 运行):
./build-patched-kernel.sh # kernel from uname -r
./build-patched-kernel.sh 6.8.0-45-generic # a specific kernel
在 Docker 中,请使用与内核匹配的 Ubuntu 发行版(6.8 对应 noble,5.15 对应 jammy)。请显式传入版本,因为容器内的 uname -r 显示的是宿主机的内核:
docker run --rm -v "$PWD":/work -w /work -e WORKDIR=/build ubuntu:24.04 \
./build-patched-kernel.sh 6.8.0-45-generic
WORKDIR=/build 会将内核源码保留在容器内。当挂载的目录不区分大小写时(例如在 macOS 上),你需要这样做。其他设置(OUTDIR、LOCAL_SUFFIX、SRC_PACKAGE/SRC_VERSION、JOBS)在脚本顶部有说明。
sudo apt install ./debs-<version>/linux-image-unsigned-<version>_*.deb \
./debs-<version>/linux-modules-<version>_*.deb \
./debs-<version>/linux-modules-extra-<version>_*.deb \
./debs-<version>/linux-headers-*.deb
sudo reboot
该内核镜像是未签名的,并会替换已签名的 linux-image-<version> 软件包。如果启用了 Secure Boot,请使用你自己的 MOK 密钥对镜像签名,或者关闭 Secure Boot。