
IPv4のuse-after-free脆弱性CVE-2026-98432に対するアップストリームのkfree_rcu修正を含む、パッチ適用済みのUbuntuカーネル.debパッケージをビルドするシェルスクリプト。
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 内の 2 か所の kfree() 呼び出しを kfree_rcu() に置き換えます。
uname -r から取得します (例: 6.8.0-45-generic)。deb-src リポジトリを有効化し、コンパイラとビルドツールをインストールします。apt-get source を使用して、このカーネルをビルドした Ubuntu ソースパッケージをダウンロードします。アーカイブにそのバージョンがもう存在しない場合は、Launchpad の pull-lp-source にフォールバックします。その後、ビルド依存関係をインストールします。kfree_rcu() が NULL を受け付けない 5.7 より古いカーネルでは、NULL チェックを追加します。+cve202698432.1 を付加します。これにより、新しいパッケージは同じ ABI を持つアーカイブのパッケージをアップグレードします。debian/rules を使用してビルドし、.deb ファイルを ./debs-<version>/ にコピーします。スクリプトを再度実行すると、ダウンロード済みのソースが再利用され、二重にパッチが適用されることはありません。
Ubuntu マシン上で直接 (root または sudo で実行):
./build-patched-kernel.sh # uname -r のカーネル
./build-patched-kernel.sh 6.8.0-45-generic # 特定のカーネル
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 を無効にしてください。