
Ubuntu 24.04でNVIDIAを使用する際のCVE-2026-98432に対する安全なカーネルアップグレードと、そのバグの分析
これは、NVIDIA GPU を搭載した Ubuntu 24.04 マシンを、カーネルの IPv4 TCP コードにおける use-after-free である CVE-2026-98432 を修正したカーネルへ移行します。アップグレードが失敗した場合に到達できなくなる可能性があるマシン向けに作られています。起動が完了するまでは何も信頼されず、失敗したステップは壊れたホストを残すのではなく明示的に停止します。
修正が含まれているなら、Ubuntu の通常のアップデートを優先してください。 これが存在するのは、これが書かれた緊急時に、修正済みのカーネルが Canonical のステージングアーカイブにあるプレリリースビルドだけだったからです。最新の公開カーネル 7.0.0-42 にはまだバグが残っていました。
バージョン番号で判断しないでください。実行中のカーネル自身のコードを personal_server のゲートで読んでください:
sudo bash scripts/14_verify_kernel_fixes.sh
実行中のカーネルのマシンコードをライブメモリから読み取り、次にGRUBが起動するカーネルのマシンコードをそのイメージから読み取ります。修正済みカーネルでは、inet_sock_destruct と tcp_v4_reqsk_destructor は kvfree_call_rcu を呼び出します。脆弱なカーネルでは、これらは kfree を呼び出します。
失敗した場合は、まず通常のルートを試してください:
sudo apt-get update
sudo apt-get install --only-upgrade linux-generic-hwe-24.04
sudo systemctl reboot
このリポジトリは、固定カーネルをもたらさない場合にのみ使用してください。
このプロセスは実行中に監査証跡を Git に公開するため、独自のコピーが必要です。このリポジトリをフォークし、そのマシン上で:
git clone <your fork> && cd <it>
kernel-upgrade/install.sh
sudo systemctl reboot
再起動には約8分かかります。マシンはさらに2回自動的に再起動し、あなたの操作は必要ありません:
uname -r # must print 7.0.0-43-generic
python3 -I kernel-upgrade/upgrade.py status # must say complete
マシンに適合しない場合、インストーラーはその理由を伝え、何も変更しません。kernel-upgrade/PROCEDURE.mdには、ホストに必要なもの、すべての失敗とその対処方法、そしてクラッシュ境界が記載されています。
| ブート | 起動する主体 | カーネル | 何が起こるか |
|---|---|---|---|
| 1 | あなた | ここで動作することが確認されているカーネル | GRUBがこのディスクに書き込めることを証明するため、1回限りのブートが本当に1回限りであることが保証される |
| 2 | プロセスが1回だけ | -43、1回限り | カーネルメモリから修正を読み取り、ホストが以前持っていたすべてを確認する。パニックが発生すると、自動的に既知の正常なカーネルに戻る |
| 3 | プロセスが1回だけ | -43、標準のGRUB経由 | 標準のGRUBが復元され、他のすべてのカーネルが削除された最終状態を証明する |
保証されること:
completeは証明済みを意味する。 このステータスは、最終的なGRUBとカーネルの状態を経たブートの後にのみ到達し、最終レコードはステータスが保存される前にGitに到達する。lock.jsonは何をインストールするかを示し、どのマシンに関する情報も含まない。フォールバック、削除リスト、ヘルスベースラインはすべてホストから読み取られ、最初の変更前に公開される。PROCEDURE.mdに記載されたウィンドウを除く。次のブートは明示的に継続または停止する。kernel-upgrade/vm/final-run.shは、4 TBのエミュレートされたNVMeディスクを備えたUEFIテストマシンをゼロから構築し、その中で正確なインストーラーを実行します。test-report.jsonは合格したもののハッシュを記録し、install.shはコードがそのレポートと異なる場合、実行を拒否します。
24のシナリオは、パッケージ中、最終パージ中、最終レコード後の実際の停電、カーネルパニックとハング、各段階でのGitHubのダウン、そして拒否されるべきマシンをカバーしています。from-zeroは、実際のUbuntuアーカイブからpersonal_serverの実際のスクリプトでマシンを構築し、ゲートがそれを拒否するのを確認し、アップグレードし、ゲートが合格するのを確認します。from-zeroには、このリポジトリの隣にpersonal_serverのクローンが必要です。
VMでは示せないことはPROCEDURE.mdに記載されています。主なものは実際のファームウェアであり、これはブート1でマシン自体上でテストされます。
これは2026-11-02に、4 TBのNVMeディスクとRTX 5090を搭載したインターネットに公開されたサーバーで実行されました。そのマシンにはリモートコンソールがなく、ネットワーク上の電源スイッチのみがあります。標準のGRUBを経た最初のブートはすべてのチェックに合格し、7.0.0-43が唯一のカーネルであり、修正はライブカーネルメモリ内で確認されました。
このプロセスの最初のバージョンはそこで動作しましたが、正しいものではありませんでした。systemdは最後のミリ秒でそれを強制終了しました。なぜなら、実行中に自身のユニットファイルを削除したからです。また、標準のGRUBがブートする前に自身をcompleteと呼び、そのマシンの詳細が組み込まれていました。このリポジトリはその再構築です。その後、独立したレビューにより、再度実行される前にさらなる実際の欠陥が見つかりました。これには、パッケージが変更された後にすべての実際のNVMeホストを停止させてしまうであろうチェックが含まれています。
├── ANALYSIS.md what the bug is, what MPTCP changes, and the limits of that
├── upstream-fix.diff the two-line upstream fix
├── filter/ an interim packet filter. It reduces exposure and isn't a fix
└── kernel-upgrade/
├── PROCEDURE.md the full procedure, failure table and crash boundary
├── install.sh the entry point
├── upgrade.py the controller and the audit publisher
├── lock.json what to install, with hashes
├── cuda-probe.c a real GPU allocation, for the health check
├── test_upgrade.py logic tests against a real Git remote
├── test-report.json what passed, and the exact bytes it covered
├── test-evidence/ the journal of each VM scenario
└── vm/ the VM test harness
コードは Unlicense の下で公開されています。各パッケージはそれぞれ独自のライセンスを保持しています。release には Canonical のカーネルパッケージと dkms が含まれています。これはステージングアーカイブが古いビルドを削除するためです。NVIDIA のパッケージはここでは再配布されていません。これらはお使いの Ubuntu アーカイブから取得されます。