■ 1. 脆弱性の概要
- 名称はCVE-2026-31431(通称「Copy Fail」)
- 2017年以降のほぼすべての主要Linuxディストリビューションに影響するローカル権限昇格の脆弱性
- 732バイトのPythonスクリプト一つでroot権限を取得可能
- 2017年のカーネルコミット導入から9年間発見されずに潜伏していた
■ 2. 技術的詳細
- 原因:
- Linuxカーネルのcryptoモジュール(algif_aead)に2017年追加された「in-place最適化」のロジックバグ
- 攻撃手法:
- AF_ALGソケットとsplice()を組み合わせ、任意の読み取り可能ファイルのpage cache(メモリ内キャッシュ)に4バイトを任意に書き換える
- /usr/bin/suなどのsetuidバイナリをメモリ内で書き換えることでroot権限を即座に取得する
- 特徴:
- ディスクへの書き込みが一切ないため再起動で自然に元の状態に戻る
- race conditionやアドレスリークが不要
- Ubuntu・RHEL・Amazon Linuxなど複数ディストリビューションで同一スクリプトが動作する
- リモートからの直接攻撃は不可だが他の脆弱性と組み合わせた場合に深刻化する
■ 3. 影響範囲
- 対象環境:
- 脆弱なコミット(72548b093ee3)導入以降の全主要Linuxカーネル(Ubuntu・Debian・RHEL・Fedora・Amazon Linux・SUSE・Archなど)
- 4.14以前の旧カーネルは対象外
- 脆弱なバージョン(系列別の上限):
- 5.10系列:5.10.254未満
- 5.15系列:5.15.204未満
- 6.1系列:6.1.170未満
- 6.6系列:6.6.137未満
- 6.12系列:6.12.85未満
- 6.18系列:6.18.22未満
- 6.19系列:6.19.12未満
- 特に危険な環境:
- 共有サーバー
- Kubernetesコンテナ(page cache共有によるホスト脱出が可能)
- CI/CDランナー(GitHub Actionsなど)
- クラウドのサンドボックス環境
■ 4. コミュニティの反応
- X(旧Twitter)での状況:
- 元投稿が数万ビューを超えvx-undergroundなど著名アカウントが拡散
- 「732バイトで全ディストリ即root」「9年間潜伏したバグが怖い」「AIが発見したのが衝撃」という声が多数
- 3000台規模での即時mitigation実施報告やコンテナ環境での危険性を指摘する実務報告が相次ぐ
- Reddit(r/linux・r/sysadmin・r/homelab・r/Proxmoxなど)での状況:
- Ubuntu 24.04でのPoC実行によりsuが実際に書き換わったという報告が殺到
- 共有ホスト・K8s・CI/CD環境での深刻性を指摘する声が目立つ
- CVSS 7.8に対するModerate評価の妥当性に疑問を呈する議論も発生
- algif_aead無効化コマンドのワークアラウンドが広く共有される
■ 5. 修正状況
- 修正コミット:a664bf3d603dc3bdcf9ae47cc21e0daec706d7a5(crypto: algif_aead - Revert to operating out-of-place)
- mainlineでは7.0-rc7以降に取り込み済み
- 各ディストリビューションで2026年4月29〜30日時点からバックポートが順次提供開始
■ 6. 対策
- 最優先:カーネル更新:
- パッチコミットa664bf3d603dが含まれるカーネルへ更新する
- Ubuntu/Debian系:
sudo apt update && sudo apt upgrade linux-image-$(uname -r)- RHEL/Fedora/Amazon Linux系:
sudo dnf update kernel- 更新後に再起動しuname -rでバージョンを確認する
- 緊急ワークアラウンド(パッチ未適用時):
- algif_aead モジュールを無効化する
echo "install algif_aead /bin/false" > /etc/modprobe.d/disable-algif.confrmmod algif_aead 2>/dev/null || true- dm-cryptやIPsecなどの通常利用への影響はほぼない
- 追加対策(コンテナ・CI環境推奨):
- seccompフィルタでAF_ALGソケット作成をブロックする
- unprivileged user namespaceを無効化する(
sysctl -w user.max_user_namespaces=0)