ディスク上のファイルは一切変わらない。チェックサム比較も通る。それでもシステムはroot権限を奪われる——CVE(Common Vulnerabilities and Exposures)-2026-31431「Copy Fail」はそういう脆弱性だ。Linuxカーネルの暗号API「AF_ALG」と、ゼロコピーシステムコールsplice()、そして2017年の性能最適化が交差する点に潜んでいたこの欠陥は、732バイトのPythonスクリプト1本で再現できる。AIコード解析ツール「Xint Code」が約1時間のスキャンで掘り起こした問題は、CVSS(Common Vulnerability Scoring System)7.8の高リスク評価で主要ディストリビューションに広く影響する。
732バイトのPoCが示したローカル権限昇格の危険度
Proof-of-Concept(概念実証、PoC)エクスプロイトは、Python標準ライブラリだけで書かれた732バイトのスクリプトだ。Theoriの報告によれば、このPoCはsetuidバイナリの一例である/usr/bin/suのページキャッシュを書き換え、root権限の取得に至る。CVE-2026-31431はリモートから単独で悪用する脆弱性ではなく、攻撃者が対象システムで何らかのローカル実行権限を持つ場面で成立する。ローカル権限昇格であっても、サーバー運用では侵入後の被害拡大に直結する。
検証済みの環境には、Ubuntu 24.04 LTSのカーネル6.17、Amazon Linux 2023のカーネル6.18、RHEL(Red Hat Enterprise Linux)10.1のカーネル6.12、SUSE 16のカーネル6.12が含まれる。Theoriは、2017年に入ったカーネル変更を起点として、近年の主要Linuxディストリビューションに広く影響すると説明している。RCE(Remote Code Execution、リモートコード実行)を持つWebアプリケーション、CI(Continuous Integration、継続的インテグレーション)runner、SSH(Secure Shell)で侵入済みの一般ユーザーアカウントは、この種のLPEと組み合わさると危険度が跳ね上がる。外部攻撃者にとっては、最初の足場をroot権限へ変換する部品になる。
AF_ALG、splice、authencesnが交差する4バイト書き込みの仕組み
AF_ALGは、Linuxカーネルの暗号APIをソケット経由でユーザー空間に公開する仕組みだ。splice()は、ユーザー空間を経由せずにファイル記述子間でデータを移すLinuxのゼロコピー系インターフェースである。2017年のalgif_aead.cへの変更、commit 72548b093ee3は、暗号処理で入力と出力を同じ場所に置くin-place最適化を追加した。この最適化により、AF_ALGとsplice()の組み合わせで新たな経路が生まれた。ページキャッシュ由来のページが、書き込み可能なscatterlist(散布リスト)に入り込む道筋だ。
ページキャッシュは、ディスク上のファイル内容をメモリに保持し、読み書きを高速化するカーネルの中核機構だ。通常、読み取り専用として扱うべきファイルのキャッシュページが、暗号処理の出力先として扱われてはならない。Copy Failでは、この境界がAF_ALG、splice()、in-place最適化の交点で崩れる。ファイルそのものを直接書き換えるのではなく、メモリ上のキャッシュ内容が攻撃対象になる点が厄介だ。
authencesnは、dst[assoclen + cryptlen]に4バイトの一時書き込みをする設計上の挙動を持つ。この4バイト書き込みが、書き込み可能なscatterlistに紛れ込んだページキャッシュへ到達すると、任意ファイルのキャッシュ内容を狙って改変できる。setuidバイナリのページキャッシュを書き換えれば、ディスク上の実体を変えずに実行時のコード経路だけを変えられる。オンディスクのチェックサム比較で検出できない理由は、改変がファイルシステム上の永続データではなくメモリ上のページに留まるためだ。
Dirty COWやDirty Pipeより扱いやすい攻撃条件
Dirty COWとDirty Pipeは、Linuxのページキャッシュや書き込み制御に関わる代表的なカーネル脆弱性として知られる。Copy Failは同じ系譜に見えるが、攻撃条件の性質は異なる。Theoriの説明では、レース条件に依存せず、主要ディストリビューション間で再現性が高い点が特徴になる。
| 項目 | Dirty COW | Dirty Pipe | Copy Fail |
|---|---|---|---|
| 主な発火点 | Copy-on-writeの競合 | pipe bufferの状態管理 | AF_ALG、splice()、authencesn |
| レース条件 | 必要 | 中核ではない | 不要 |
| 書き換え対象 | メモリ上のファイル写像 | ページキャッシュ | ページキャッシュ |
| 攻撃の狙い | 読み取り専用領域の改変 | 読み取り専用ファイルのキャッシュ改変 | setuidバイナリなどのキャッシュ改変 |
| 検出上の難点 | 成功タイミングのばらつき | ディスク実体との差分 | ディスク実体との差分 |
Copy Failは、条件競争に勝つ必要がないため、PoCのサイズと再現性が攻撃側に有利に働く。Dirty COW型の攻撃ではタイミング依存が運用環境での成功率を左右するが、Copy Failはカーネルの正規インターフェースを連結して4バイト書き込みへ進む。732バイトのPythonだけで成立した事実は、悪用コードの移植が比較的容易であることを示す。
Xint Codeが約1時間のスキャンで見つけたカーネル深部の欠陥
TheoriのTaeyang Lee氏は、同社のAI支援コード解析ツール「Xint Code」を活用してCopy Failを発見した。Theoriは韓国のオフェンシブセキュリティ企業で、Xint Codeは大規模コードベースから脆弱な経路を探すための社内ツールとして説明されている。報告では、Linuxカーネルに対する約1時間のスキャンが発見の起点になった。人間の監査者が見落としやすい複数サブシステムの接続部を、AI支援が候補として引き上げた形だ。
AI支援の重要点は、脆弱性を自動で完成させたという話ではなく、探索空間を狭めた点にある。AF_ALG、splice()、authencesnは、それぞれ別の文脈では正当な機能として存在する。脆弱性は、2017年の性能最適化と暗号コードの一時書き込みが重なった場所に潜んでいた。カーネル規模のコードでは、この種の組み合わせ探索が人手だけのレビューを圧迫する。
パッチ適用とalgif_aead無効化で優先すべき対応
2026年3月23日に報告されたCopy Failは、3月24日に確認され、4月1日にmainlineへパッチが取り込まれた。4月22日にCVEが割り当てられ、4月29日に公開開示された。修正commit a664bf3d603dは、algif_aead.cをout-of-place動作へ戻し、問題のin-place最適化を削除する。Debian、Ubuntu、SUSEはパッチを配布済みと報告され、Red Hatは延期方針から速やかな適用方針へ変更した。
管理者が最初に確認すべき対象は、稼働中カーネルのバージョンとディストリビューションのセキュリティアドバイザリだ。更新済みカーネルを適用した後は、再起動またはライブパッチの適用状態を確認し、古いカーネルで稼働し続けるノードを残さない。すぐにパッチを適用できない環境では、影響範囲を確認した上でalgif_aeadモジュールの無効化が暫定緩和策になる。ディスク上のファイル整合性チェックだけではCopy Failの痕跡を拾えない。監視の焦点はカーネル更新状況、ローカル実行経路、権限昇格の兆候に置くべきだ。
コンテナ環境では、ページキャッシュが名前空間の境界をまたいで共有される場面がある。Theoriは、Copy FailがKubernetesノード脱出にも応用可能だと説明しており、この点は通常のLPEより運用上の影響を大きくする。今回の教訓は、ローカル権限昇格を「侵入後の二次被害」として後回しにしないことだ。次の焦点は、共有ページキャッシュがKubernetesノード脱出に変わる経路である。