
CVE-2026-31431(LinuxカーネルのAF_ALG AEAD脆弱性)を分析し、安全な検出器、実験室内LPEエクスプロイト、検証用のQEMUベースA/Bカーネルラボを提供します。
algif_aead「Copy Fail」: 分析CVE-2026-31431(CVSS 3.1 7.8 HIGH、
AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H)に関するセキュリティ研究:
AF_ALG AEADインターフェースチェーンにおける3つの合成可能な設計上の
欠陥が、決定的でレースフリーな4バイトのページキャッシュ書き込みを、
読み取り可能な任意のファイルの任意のオフセットに対して引き起こします —
ディスクコピーはクリーンなままなので、オンディスクチェックサムは何も検知しません。
公開エクスプロイト(「Copy Fail」、Theori/Xint)は、732バイトのPythonで
ローカルルート(LPE)に昇格させます。このバグは2017年から2026年までの
すべてのカーネルに存在していました。
72548b093ee3(2017年)により、_aead_recvmsg は インプレースで 復号するようになり、
リクエストのタグページを書き込み可能な宛先SGLにチェーンしました。splice(file → pipe → socket) は、それらのタグスロットに
読み取り可能な任意のファイルのページキャッシュページ(ゼロコピー)を供給します。authencesn は、その4バイトのESNスクラッチ — 値はsendmsgペイロードの
AAD[4..8) に乗っています — を正確に
dst[assoclen + cryptlen]、すなわち最初のタグバイト(選択したファイルオフセット)に
書き込みます。これはタグ検証 発生するため、
リクエストでも書き込みが実行されます。-EBADMSG| 主張 | 証拠 |
|---|---|
| 根本原因はブログではなく修正コミットとカーネルソースから導出 | finding-sheet |
| 公開PoCのデコードがシステムコールシーケンスに対してエンドツーエンドで検証済み | finding-sheet |
| デルタが正確に修正コミットであるラボA/Bカーネル、両方とも起動 | lab/scripts/build.sh + lab/out/ab-diffstat.txt |
脆弱性カーネルがAF_ALG経由で authencesn AEAD復号を実行(スモーク) | lab/scripts/run.sh vuln → SMOKE=ok |
コンパニオンなしのリバートが crypto_authenc_esn_decrypt でパニック(当初の発見) | lab/scripts/run.sh patched → NULL deref、再現可能 |
| 安全な検出器: vulnではVULNERABLE(EBADMSGにもかかわらず書き込みが発生、ディスクはCLEANのまま)、完全修正ではNOT-DETECTED | poc/detector.c をラボで実行 → DETECTOR-RESULT 行 |
| ラボ内LPE完了: uid 1000がSUIDバイナリの4バイトのページキャッシュをパッチし、root専用フラグを読み取り。ディスクコピーはブロックレベルdebugfs読み取りで完全無傷と証明 | poc/lpe.c + lab/rootfs/tools/secretgate.c → LPE-RESULT: ROOT-FLAG-CAPTURED、DISKCLEAN=ok |
| 公開ページキャッシュ書き込みを固定ラボで帰属付きで再現 | 上記の検出器出力 + lab README |
| SGLストレス: 両カーネルで5形状 — クラッシュなし、カーネルハングなし(正直なネガティブ結果)+ 文書化された2つのAF_ALG契約の癖 | poc/sgl-stress.c をラボで実行 → SGL-STRESS 行 |
# 3つのカーネル + ツール + プローブディスクをDockerでビルド(初回約15分)
lab/scripts/build.sh
# A/B/Cオラクルを起動(Docker内QEMU、KVM利用可能なら使用)
lab/scripts/run.sh vuln # DETECTOR VULNERABLE + LPE ROOT-FLAG-CAPTURED + DISKCLEAN=ok
lab/scripts/run.sh patchedfull # DETECTOR NOT-DETECTED + LPE NOT-VULNERABLE
lab/scripts/run.sh patched # authencesn NULL deref(コンパニオン修正ギャップ)
完成したページキャッシュ書き込みチェーンは、Theori / Xint Code
(「Copy Fail」、クレジットされた報告者)の公開アプローチに
帰属付きで従っています — finding-sheet の
先行研究セクションを参照してください。このリポジトリでの独自の作業:
修正コミットに固定されたメカニズムマップ、不完全な修正シリーズの発見
(コンパニオンなしリバートのauthencesnパニックとその安定版リリースウィンドウ)、
所有していないファイルに一切触れない安全なページキャッシュ対ディスク差分検出器、
専用に構築されたSUIDターゲット(secretgate — 実際のバイナリは決して標的にされません)に対する
ラボ内LPE完了、SGLエッジ探索(正直なネガティブ結果と文書化された2つのAF_ALG契約の癖)、
および全8つの修正コミットの検証済みブランチ帰属。
| ドキュメント | 内容 |
|---|---|
| docs/finding-sheet.md | 1ページのデータシート: バージョン、CVSS、根本原因、修正コミット、攻撃対象領域 |
| docs/report-ptes.md | PTES構造のレポート(7フェーズ)、ラボ証拠付き |
| docs/research-writeup.md | 調査の物語 — 方法論、行き詰まり、移植可能な教訓、先行研究との比較 |
docs/ finding sheet · PTESレポート · 研究ライトアップ
poc/ detector.c(安全なオラクル)· lpe.c(ラボ内LPE)· sgl-stress.c(SGL探索)
lab/ QEMUカーネルラボ: 5.15.203 ± 修正(A/B)+ コンパニオン後 5.15.y(C)
lab/rootfs/ secretgate.c — 専用に構築されたSUIDターゲット(攻撃される唯一の対象)
72548b093ee3 "crypto: algif_aead - copy AAD from src to dst"(2017年)a664bf3d603d "crypto: algif_aead - Revert to operating out-of-place"
(+ 8つの安定版バックポート — finding-sheet を参照)教育目的の研究アーティファクト。所有しているシステム、または明示的に テストを許可されたシステムに対してのみ実行してください。この脆弱性は修正済みです — 2026年の安定版ブランチ以降の最新カーネルを実行してください。