
CVE-2026-31431(Copy Fail)新規エクスプロイト:ページキャッシュを介したライブコード破壊。MAP_PRIVATEページ共有を通じてlibcのexit()コードを上書き — 実行中の全プロセスに影響。
Linuxカーネルのページキャッシュを通じて実行中プロセスの実行可能コードを破壊し、root権限昇格を達成する、CVE-2026-31431(「Copy Fail」)の新しい悪用手法です。
このCVEの公開済みエクスプロイトはすべてデータファイルを破壊するもの — /etc/passwdを変更してrootのUIDを書き換えたり、ディスク上のsetuidバイナリにパッチを当てたりします。このエクスプロイトは根本的に異なることを行います:カーネルのページキャッシュ機構を通じて、メモリ内のライブ実行可能コードを破壊します。
| 公開済みエクスプロイト | 本エクスプロイト | |
|---|---|---|
| ターゲット | データファイル(/etc/passwd、/usr/bin/su) | 実行可能コード(libc .text セクション) |
| メカニズム | プログラムが解析するファイル内容 | CPUが直接実行するコードページ |
| 影響範囲 | 単一ファイル | libcをマッピングする全プロセス |
| ディスク変更 | あり(ファイル内容が変更される) | なし(メモリ内のページキャッシュのみ) |
| 検出 | ファイル整合性監視 | ファイルシステム検査では不可視 |
LinuxがMAP_PRIVATEで共有ライブラリをマッピングするとき、ファイルページを即座にコピーしません。代わりに、プロセスのページテーブルエントリはページキャッシュの物理ページを直接指します。コピーは書き込み時(コピーオンライト)にのみ発生します。コードページ(.text)の場合、プロセスはそれらに書き込むことはありません — そのため、ページキャッシュと永久に共有されたままになります。
Process A (bash) Process B (su) Page Cache (libc)
┌──────┐ ┌──────┐ ┌──────────┐
│ PTE │───────────>│ │ │ exit(): │
│ │ │ PTE │───────────>│ endbr64 │
└──────┘ └──────┘ │ push rax │
MAP_PRIVATE MAP_PRIVATE │ ... │
(clean page) (clean page) └──────────┘
↑
Copy Fail writes here!
CVE-2026-31431により、読み取り可能な任意のファイルのページキャッシュへの制御された4バイト書き込みが可能になります。libcのコードページを破壊することで、すべてのプロセスが実行する命令を変更します。
on_exit()関数の場所に書き込む — 4バイトずつ10回の書き込みexit()をパッチしてシェルコードにジャンプさせる — 4バイトの書き込み1回exit()を呼び出す任意のプログラム(事実上すべてのプログラム)がシェルコードを実行シェルコードはsetuid(0) → setgid(0) → execve("/bin/sh")を実行し、rootシェルを取得します。
crypto/algif_aead.cの論理エラー — 2017年のインプレース最適化(72548b093ee3)により、splice()がページキャッシュページをAEAD復号に供給できるようになりました。authencesnアルゴリズムのESN再配置が4バイトのスクラッチデータをソースscatterlistに書き戻し、スプライスされたファイルのページキャッシュを破壊します。# コンパイル
gcc -o exploit exploit.c
# 非特権ユーザーとして実行
./exploit /lib/x86_64-linux-gnu/libc-2.31.so
# トリガー — 任意のプログラムを実行(exit()を呼び出します)
su -c id
# uid=0(root) gid=0(root) groups=0(root)
process 'id' launched '/bin/sh'exploit.c — シェルコード注入を含む完全なエクスプロイトcopyfail_test.c — プリミティブ検証(4バイト書き込みのテスト)72548b093ee3)このツールは、許可されたセキュリティ研究および教育目的のみで提供されています。所有していない、または明示的なテスト許可がないシステムに対して使用しないでください。
Dirty Fragは、同じバグクラスのページキャッシュ書き込みバリアントをさらに2つ公開しました:
esp4/esp6): Copy Failと同じauthencesnシンク。IPsec ESP-in-UDP経由で到達。ユーザー名前空間が必要。4バイト書き込み。rxrpc/rxkad): スプライス固定ページ上のpcbc(fcrypt)インプレース復号。名前空間は不要。8バイト書き込み。このリポジトリのライブコード破壊手法は、これらのページキャッシュ書き込みプリミティブのいずれでも動作します — write4()関数をESPまたはRxRPCトリガーに置き換えるだけです。この手法はプリミティブ非依存です。