SJ blog
security
A

信頼度ランク

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バイナリ(susudopasswd)の異常な起動パターンを監視することも有効だ。


落とし穴・注意点

  • 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環境: ノードのカーネルバージョンを確認し、パッチ済みノードグループへのローリングアップデートを計画

参考リンク