Linux Kernel 0-Day “Copy Fail” Roots Every Major Distribution Since 2017
2026/04/30 CyberSecurityNews — 2017年以降に出荷された、大半の主要 Linux ディストリビューションのカーネルに、深刻なゼロデイ脆弱性が存在することが判明した。この脆弱性 CVE-2026-31431 を悪用する非特権ローカル・ユーザーは、root 権限の取得が可能になる。この脆弱性は、Theori の研究者 Taeyang Lee により発見され、Copy Fail と命名された。その後に、Xint Code Research Team が、AI 支援される解析を行ったことで完全なエクスプロイト・チェーンへと拡張された。

Copy Fail は、Linux カーネルの authencesn 暗号テンプレートに存在する単純な論理バグであり、競合状態を指すものではない。AF_ALG ソケット・インターフェイスと splice() システムコールの組み合わせにより、悪用が可能な脆弱性である。
Dirty Cow (CVE-2016-5195) や Dirty Pipe (CVE-2022-0847) といった前例とは異なり、この脆弱性の悪用において、競合状態での勝利/カーネルバージョン・オフセット/再コンパイル/コンパイル済みペイロードなどは不要である。
Linux カーネル・ゼロデイ:Copy Fail
標準ライブラリのみを悪用する、わずか 732 バイトの単一 Python スクリプトにより、root 権限の取得が可能になる。これまでに検証された、すべてのディストリビューションおよびアーキテクチャで、深刻な状況が確認されている。
このエクスプロイトは、ファイルのメモリ内表現である、カーネルの “page cache” を標的とするものであり、攻撃者が読み取り可能な任意のファイルに属する “page cache” に対して、制御された 4 バイト書き込みを引き起こす。
Linux カーネルは、破損したページを “writeback” 対象として扱い “dirty” マークしないため、ディスク上のファイルは変更されず、チェックサム・ベースのファイル整合性ツールでは検出されない。
そのため攻撃者は、”/usr/bin/su” のような setuid バイナリの破損したバージョンをメモリ内で実行し、root シェルの取得を達成する。
この脆弱性は、2017年に “algif_aead.c” (commit 72548b093ee3) に対して導入された、インプレース最適化に起因する。ユーザーがファイルをパイプに接続して AF_ALG ソケットに受け渡すと、AEAD 入力スキャッターリストはコピーではなく、当該ファイルのカーネル物理 “page cache” ページへの直接参照を保持する。
AEAD 復号処理における “algif_aead.c” は req->src = req->dst を設定するため、ソースとデスティネーションが同一の結合スキャッターリストを指すようになる。
これにより、書き込み可能なデスティネーション・スキャッターリストに、”page cache” ページが配置される。IPsec における 64-Bit Extended Sequence Number (ESN) サポートに使用される “authencesn” アルゴリズムは、呼び出し元のデスティネーション・バッファを作業領域として使用し、宣言された出力境界を “assoclen + cryptlen” オフセットで 4 バイト分だけ上書きし、連結されるディスティネーション “page cache” に対して直接的な影響を与える。
2011年/2015年/2017年に追加された、それぞれの妥当なコード変更が相互作用することで、このような悪用が可能な状態が形成されたが、その交差が認識されるまでに約 10 年を要した。
以下 4 つの主要プラットフォームにおいて、 同一のエクスプロイト・スクリプト (未変更) により、root シェルの不正取得が確認された:
| Distribution | Kernel Version |
|---|---|
| Ubuntu 24.04 LTS | 6.17.0-1007-aws |
| Amazon Linux 2023 | 6.18.8-9.213.amzn2023 |
| RHEL 14.3 | 6.12.0-124.45.1.el10_1 |
| SUSE 16 | 6.12.0-160000.9-default |
この脆弱性はカーネル 4.14 で混入し、それ以降におけるすべての未修正の系統に影響を及ぼす。
Copy Fail の影響は、ローカルの権限昇格に留まらず、Kubernetes コンテナ・エスケープのプリミティブとしても機能する。
“page cache” は、ホスト上の全プロセス間で共有されるため、コンテナ境界を跨いで共有されることになる。したがって、他のコンテナやホスト・カーネルから参照可能な setuid バイナリは、侵害されたコンテナにより破壊することが可能となる。
Xint Code のシリーズ第 2 部では、Kubernetes ノードの完全侵害が解説されている。
パッチ公開
公式修正 (commit a664bf3d603d) では、”algif_aead.c” がアウトオブ・プレース AEAD 処理に戻され、TX scatterlist (page cache ページを含み得る) と RX scatterlist (ユーザー出力バッファ) が恒久的に分離された。
これにより、”page cache” ページを書き込み可能なデスティネーションへ連結していた、sg_chain() メカニズムが排除される。
- カーネル・アップデート適用までの即時的な緩和策:ディストリビューションの更新チャネルを通じて、アップストリーム・カーネルパッチを適用する。
- 攻撃面を排除するために algif_aead カーネルモジュールを無効化する:bash
echo “install algif_aead /bin/false” > /etc/modprobe.d/disable-algif-aead.conf
rmmod algif_aead 2>/dev/null
この脆弱性は、2026年3月23日に Linux カーネル・セキュリティ・チームへ報告された。その後の 2026年4月1日に、メインラインに対してパッチがコミットされ、2026年4月22日に CVE が割り当てられ、2026年4月29日に公開された。
システム管理者に対して強く推奨されるのは、カーネル・アップデートを直ちに適用することだ。
訳者後書:脆弱性 CVE-2026-31431 (Copy Fail) は、多くの Linux カーネルに長年潜んでいた深刻な問題です。問題の核心は、カーネル内の暗号処理における効率化のための最適化が、意図せずメモリ上の重要なデータ (ページキャッシュ) を書き換え可能な状態にしてしまった点にあります。具体的には、ファイルの読み取り専用データと、暗号計算の結果を書き込む領域が同じ場所を参照してしまい、本来は書き換わってはいけないファイルが、計算過程で溢れた 4 バイトのデータにより、メモリ上で汚染されるという状況が発生していました。ご利用のチームは、ご注意ください。よろしければ、Linux Kernel での検索結果も、ご参照ください。
You must be logged in to post a comment.