
Linuxカーネルのローカル権限昇格(CVE-2026-31431)を悪用し、ページキャッシュを破壊してrootを取得するエクスプロイトおよび検出ツール。緩和策のガイダンスも含む。
Linuxカーネルに存在する9年間の重大な脆弱性。数秒でroot権限を取得可能
| 属性 | 詳細 |
|---|---|
| CVE | CVE-2026-31431 |
| ニックネーム | Copy Fail |
| タイプ | ローカル権限昇格(LPE) |
| CVSS | 7.8(High) |
| 発見者 | Theori(Xint Code) |
| 公開日 | 2026年4月29日 |
| 対象コンポーネント | Linuxカーネルのalgif_aeadサブシステム |
2017年に導入された「インプレース(in-place)」最適化(commit 72548b093ee3)の欠陥。ローカルユーザーがカーネルのページキャッシュに対して4バイトの制御された書き込みを直接行える。
AF_ALGインターフェースを使用してカーネルの暗号アルゴリズムにアクセス/usr/bin/su)や機密ファイル(/etc/passwd)のメモリ上のバージョンを破壊これはメモリオーバーフローではなく、設計上の論理バグ。検出には暗号サブシステムの深い分析が必要だった。
# Ubuntu/Debian
sudo apt update
sudo apt upgrade
sudo reboot
# RHEL/AlmaLinux/Rocky
sudo dnf update kernel
sudo reboot
# カーネルバージョンの確認
uname -r
⚠️ 新しいカーネルを有効にするには再起動が必須です。
# 脆弱なモジュールのロードを無効化
echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/copyfail_mitigation.conf
# 使用中のモジュールをアンロード
sudo rmmod algif_aead
# モジュールは通常カーネルに組み込まれている
# 無効化するブートパラメータを追加
sudo grubby --update-kernel=ALL --args="initcall_blacklist=algif_aead_init"
# 変更を適用するために再起動
sudo reboot
# ページキャッシュをホットでパージ
sudo sysctl -w vm.drop_caches=3
⚠️ 注意: これはパッチの代替にはなりません。補助的な対策にすぎません。
| 日付 | イベント |
|---|---|
| 4月29日 | Theoriによる公開開示 |
| 5月1日 | 最初の活発なエクスプロイト試行を検出 |
| 5月2日 | CISAが米国連邦機関に対し5月15日までのパッチ適用を命令 |
# カーネルバージョンの取得
uname -r
# 脆弱な場合:
# - v4.14からv7.0-rc(2017年から2026年4月にリリース)
# - commit 72548b093ee3 を含む
# algif_aeadモジュールがロードされているか確認
lsmod | grep algif_aead
# リストに表示された場合、システムは脆弱
開発者が9年間見逃してきたこの欠陥を、AIが特定した。これは時代の転換点を示す:
# 1. 検出
python3 prueba.py
# exit 0 = 脆弱ではない、2 = 脆弱、1 = テストエラー
# 2. エクスプロイト(対話型 — suが自分のパスワードを要求します)
python3 exploit.py --shell
python3 prueba.py
機能:
AF_ALGとアルゴリズムauthencesn(hmac(sha256),cbc(aes))が
非特権プロセスからアクセス可能であることを確認します。
一時ディレクトリに4KiBのセンチネルファイルを作成し、ページ キャッシュを埋めます。
sendmsg+cmsgでseqno_loをPWNDマーカーに設定して8バイトのAADを
インラインで送信し、その後os.splice()でセンチネルのページキャッシュページから32バイトを
AF_ALG操作ソケットにコピーします。
recv()を呼び出して復号を開始します。認証チェックは
EBADMSGで失敗しますが、一時的な書き込みは実行されます。
ファイル(ディスクではなくページキャッシュ)を再度読み取り、マーカーを探します。
出力クラス:
前提条件が満たされていません: AF_ALGまたはauthencesnが利用できません。終了コード0。CVE-2026-31431に対して脆弱: PWNDマーカーが変更されたページに挿入されました。終了コード2。
ページキャッシュがインプレースAEAD挿入パスで変更されました: ページへの書き込みは
発生しましたが、マーカーが期待される位置に挿入されませんでした。
脆弱として扱います。終了コード2。ページキャッシュは無傷です: パッチ適用済み。終了コード0。検出器は/usr/bin/su、/etc/passwd、または作成した一時ディレクトリ外の
他のファイルを決して変更せず、そのファイルは終了時に削除されます。
出力。 ## LPEの使用方法
python3 exploit_cve_2026_31431.py # パッチのみ適用、次の手順を表示
python3 exploit_cve_2026_31431.py --shell # パッチを適用して`su <ユーザー>`を実行
機能:
/etc/passwdで実行中ユーザーのUID行を検索し、4文字のUIDフィールドの
バイトオフセットを見つけます。
そのオフセットに対してwrite4を実行し、UIDを
0000に置き換えます。
pwd.getpwnam(ユーザー)を呼び出して、libcがUID 0を報告することを確認します。
--shellを使用すると、execvp("su", ["su", ユーザー])を実行します。自分の
パスワードを入力してください。PAMは/etc/shadow(変更なし)に対して検証し、その後
setuid(getpwnam(user).pw_uid)が0に設定されます。
実行中のユーザーのUIDが4桁(1000〜9999)であること。1〜3桁のUIDは
複数回の書き込みが必要です。それに応じてwrite4を拡張してください。
NSSキャッシュデーモン(nscd、sssd、systemd-userdbd)が/etc/passwdの
読み取りをマスキングしていないこと。パッチ適用後にgetpwnamが実際のUIDを
返す場合は、再起動するかキャッシュを無視するか、別のユーザーを選択してください。
/etc/passwdページは、パッチ適用からsuの実行までの間、キャッシュに
残っている必要があります。実際には、通常のメモリプレッシャーのあるシステムでは
これは信頼できます。
ディスク上の/etc/passwdファイルは変更されません。
ドライラン(--shellなしのexploit_cve_2026_31431.py)は、終了時に
POSIX_FADV_DONTNEEDで破損したページを自動的に削除するため、UID → 名前の
ルックアップはすぐに正常に戻ります。
--shellを使用した後は、ページがクリアされるまで破損したままになります。
破損している間は、UID 1000 → 名前を解決する操作(例:ls、
ファイルマネージャー、scp/sftpの所有権チェック)は失敗するか、数値IDを表示します。クリアするには:
# 非特権:/etc/passwdのページキャッシュ削除を要求:
python3 -c "import os; fd=os.open('/etc/passwd', os.O_RDONLY); \
os.posix_fadvise(fd, 0, 0, os.POSIX_FADV_DONTNEED); os.close(fd)"
# rootコンソールから:
echo 3 > /proc/sys/vm/drop_caches
再起動でもクリアされます。
write4の仕組みsendmsg([8バイトのAAD], cmsg=[ALG_SET_OP=DECRYPT, ALG_SET_IV, ALG_SET_AEAD_ASSOCLEN=8],
flags=MSG_MORE)
splice(target_fd, pipe_w, 32, offset_src=file_offset)
splice(pipe_r, op_fd, 32)
recv(op_fd) # EBADMSG; 一時的な書き込みはすでに実行済み
AADの位置4〜7の4バイト(seqno_lo)は、authencesnによって
宛先のスキャッタリストに書き込まれます。このコードパスでは、
これはtarget_fdから抽出したページキャッシュページです。ページ内の着地オフセットは、
splice()に渡したoffset_srcに対応します。
パッチ適用済みカーネルがディストリビューションに届くまで:
sudo tee /etc/modprobe.d/disable-algif-aead.conf <<<'install algif_aead /bin/false'
sudo rmmod algif_aead 2>/dev/null
パッチ適用後、test_cve_2026_31431.pyは「前提条件が満たされていません」という
メッセージを表示し、終了コード0で終了するはずです。
元の修正は、AEADインプレース操作をアウトオブプレース操作に戻し、 ページキャッシュページを変更可能なスキャッタリストから遠ざけます。
algif_aeadを無効化する一時的な緩和策を適用algif_aeadモジュールのロード試行を確認最終更新: 2026年5月3日
ステータス: 🔴 重大 - 即時の対応が必要
| 5月3日 | Ubuntu、RHEL、AlmaLinux、Debianでパッチが利用可能に |
| ディストリビューション | ステータス | 参照 |
|---|
| Ubuntu | ✅ パッチ適用済み | USN-8226-1(20.04、22.04、24.04) |
| RHEL/AlmaLinux/Rocky | ✅ 利用可能 | 5月1日以降 |
| Debian | ✅ セキュリティリポジトリにあり | アップデート利用可能 |
| Android | ⏳ 近日公開 | 2026年6月のセキュリティ速報 |