Copy Fail という Linux Kernel ゼロデイの正体:2017年以降の全ディストロで root 昇格を許す

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 シェルの不正取得が確認された:

DistributionKernel Version
Ubuntu 24.04 LTS6.17.0-1007-aws
Amazon Linux 20236.18.8-9.213.amzn2023
RHEL 14.36.12.0-124.45.1.el10_1
SUSE 166.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日に公開された。

システム管理者に対して強く推奨されるのは、カーネル・アップデートを直ちに適用することだ。