信頼度ランク
| S | 公式ソース確認済み |
| A | 成功実績多数・失敗例少数 |
| B | 賛否両論 |
| C | 動作未確認・セキュリティリスク高 |
| Z | 個人所感 |
Copy Fail(CVE-2026-31431):2017年から潜伏していたLinuxカーネルのLPE——732バイトのPythonスクリプトで全主要ディストリビューションがroot権限を奪われる
Theoriが4月29日に開示したCVE-2026-31431(CVSS 7.8)はLinuxカーネルのalgif_aeadモジュールの論理バグで、非特権ユーザーがAF_ALG+spliceを組み合わせるだけでpage cacheに4バイト書き込みを行い、setuidバイナリを書き換えてroot取得できる。2017年以降のすべてのカーネル(4.14〜6.18.21)が対象。
一言結論
CVE-2026-31431「Copy Fail」はLinuxカーネル4.14以降のalgif_aeadの9年前の最適化から生じたLPEで、732バイトのPythonスクリプトでUbuntu・Amazon Linux・RHEL・SUSEのroot取得が可能。PoC公開済みのため即時対応が必要。algif_aeadモジュールをブラックリスト化してkernelパッチを待つことが現時点での現実解。
概要
2026年4月29日、Theoriのセキュリティ研究者Taeyang LeeがCVE-2026-31431(通称「Copy Fail」)を公開した。
Linuxカーネルのalgif_aeadモジュール——AF_ALGソケット経由でAEAD暗号化をユーザー空間から呼び出すためのインターフェース——に存在する論理バグで、非特権のローカルユーザーがsetuidバイナリのpage cacheに制御された4バイトを書き込み、数秒以内にroot権限を取得できる。
CVSS スコアは 7.8 HIGH。PoC(732バイトのPythonスクリプト)がすでに公開されており、Ubuntu 24.04・Amazon Linux 2023・RHEL 10.1・SUSE 16での動作が確認済みだ。
根本原因:3つの合理的な変更が組み合わさった9年間の時限爆弾
この脆弱性は1つのバグではなく、時期の異なる3つのカーネル変更の相互作用から生まれた。
| 時期 | 変更内容 |
|---|---|
| 2011年 | authencesn(IPsecで使うAEADラッパー)をカーネルに追加 |
| 2015年 | AF_ALGソケット経由でAEAD操作をユーザー空間に公開(algif_aead.c) |
| 2017年 | コミット72548b093ee3: インプレース最適化を追加し、送受信スキャッタリストをreq->src = req->dstで同一化 |
2017年の最適化が問題だ。splice()でファイルをパイプに流し込んでAF_ALGソケットに渡すと、カーネルの入力スキャッタリストにそのファイルのpage cacheページへの直接参照が入る。ところがインプレース最適化により同じリストが出力スキャッタリストにもなるため、AEAD処理がpage cacheページに直接書き込みを行う。
結果として、ファイルの所有者でなくても任意の読み取り可能なファイルのpage cache(カーネルのメモリ内キャッシュ)に4バイトを書き込める。ディスク上のファイル自体は変わらない——これがDirty CowやDirty Pipeと異なる点だ。
攻撃の流れ
1. 攻撃者が /usr/bin/su などのsetuidバイナリを open() で読み取り専用オープン
2. splice() でそのファイルをパイプに流し込む
3. AF_ALG ソケットを作成し、AEAD操作を要求
4. algif_aead がpage cacheページを書き込みスキャッタリストに配置
5. AEADの出力として setuid バイナリの4バイトを上書き
6. page cache上のバイナリが書き換わったことで su を実行するとroot shellが起動
PoC: 732バイトのPythonスクリプトがこのシーケンスを自動化し、レースコンディションなしに決定論的にroot取得する。
Dirty Cow(CVE-2016-5195)はレースコンディションを勝ち取る必要があったが、Copy Failはそれが不要だ。同じエクスプロイトコードが多数のシステムでそのまま動く。
影響範囲
影響あり: Linux kernel 4.14 〜 6.18.21 (2017年7月〜2026年4月)
影響なし: Linux kernel 6.18.22以降・6.19.12以降
- Ubuntu: 22.04 LTS・24.04 LTS・25.10が対象(Ubuntu 26.04 Resoluteは非対象)
- Amazon Linux 2023: 対象
- RHEL 10.1: 対象
- SUSE 16: 対象
- コンテナ: ホストカーネルが対象バージョンなら、コンテナ内からも悪用可能
前提条件はローカルコード実行のみ。リモートからは直接悪用できないが、Web RCE + 非特権サービスアカウント、SSH足がかり、CI/CDランナー上のmaliciousなPRと組み合わせることでリモートから実質的にroot取得に至る攻撃チェーンが成立する。
パッチと修正コミット
アップストリームの修正はコミットa664bf3d603d(およびfafe0fa2995a)で、2017年の最適化を元に戻し、TXスキャッタリスト(page cacheページを持つ可能性あり)とRXスキャッタリスト(ユーザーの出力バッファ)を完全に分離した。
| ディストリビューション | パッチ状況 |
|---|---|
| Ubuntu 22.04 / 24.04 | パッチリリース済み(ubuntu.com/security参照) |
| Amazon Linux 2023 | パッチリリース済み |
| RHEL 10.1 | パッチリリース済み |
| SUSE 16 | パッチリリース済み |
即時緩和策
パッチ適用前にalgif_aeadモジュールをブラックリスト化することでリスクを排除できる。
# algif_aead モジュールを永続的に無効化
echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif-aead.conf
# 現在ロードされていれば即時アンロード
sudo rmmod algif_aead 2>/dev/null || true
# 依存確認(何かがalgif_aeadを使っていないか)
lsmod | grep algif
この緩和策が影響しないもの:
- dm-crypt / LUKS(ディスク暗号化)
- kTLS(カーネルTLS)
- IPsec / XFRM
- OpenSSL・GnuTLS・NSS・SSH(ユーザー空間暗号化ライブラリ)
algif_aeadを必要とするのはAF_ALGソケット経由でAEAD操作を直接呼び出すアプリケーション(一般的なサーバーやWebアプリでは使用しない)だ。
検出:攻撃のトレース
Falcoなどを使っている場合、以下のシステムコールシーケンスが攻撃の指標になる。
# 参考: Falcoルール概念
- rule: CopyFail LPE Attempt
condition: >
syscall.type in (socket, bind, accept) and
proc.name in (python3, python) and
fd.sockfamily = AF_ALG and
ka.target.resource = "algif_aead"
output: "Possible CVE-2026-31431 exploit attempt (pid=%proc.pid)"
また/var/log/auth.logでsetuidバイナリ(su・sudo・passwd)の異常な起動パターンを監視することも有効だ。
落とし穴・注意点
- PoC公開済みのため「パッチリリースを待てばいい」ではなく即時緩和が必要
- コンテナ・KubernetesのワーカーノードもホストカーネルのCVEを継承する。コンテナランタイムのseccompデフォルトプロファイルがAF_ALGを許可しているかどうかを確認すること(Docker/containerdのデフォルトは許可)
- クラウドVM(EC2・GCE・Azure VM)は共有ホストでなくVM単位でカーネルを持つが、ゲストOS内に侵入されれば本CVEが使える
- algif_aeadのブラックリスト化後も、
modprobe algif_aeadできる権限(CAP_SYS_MODULE)を持つプロセスには注意
まとめ
Copy Failは「技術的に面白い脆弱性」である以上に、即時対応が必要なインシデントだ。PoCがすでに公開され、732バイトのPythonスクリプトがUbuntu・Amazon Linux・RHEL・SUSEでroot権限を決定論的に取得できる。
- 今すぐ:
algif_aeadをブラックリスト化 - 順次: 各ディストリビューションのセキュリティパッチを適用してカーネルを更新
- Kubernetes環境: ノードのカーネルバージョンを確認し、パッチ済みノードグループへのローリングアップデートを計画