
Rust製エクスプロイト CVE-2026-31431 用。AF_ALG splice を介した Linux カーネルのページキャッシュ書き込みプリミティブであり、/etc/passwd のパッチ適用やシェルコード実行による root への権限昇格を可能にします。
CVE-2026-31431(Copy Fail)のRust実装 — AF_ALG spliceを介したLinuxカーネルのページキャッシュ書き込みプリミティブ。
Linuxカーネルのalgif_aead実装では、権限のないユーザーがsplice()システムコールを介して、読み取り可能な任意のファイルのページキャッシュに任意のデータを書き込むことができます。authencesn AEADアルゴリズムは、seqno_lo(ユーザー制御のAADバイト4〜7)をオフセットassoclen + cryptlenの宛先scatterlistに書き込みます。これは、splice()を介してページキャッシュページに連結されると、任意の4バイト書き込みになります。ディスク上のコンテンツは変更されませんが、その後のすべての読み取り側は破損したページキャッシュデータを参照します。
影響を受けるカーネル: Linux < 6.12.23、< 6.13.11、< 6.14.2
| フラグ | 説明 |
|---|---|
--check | 安全な事前チェック: 解決されたsuターゲットを検査して終了 |
--escalate | ページキャッシュ内の/etc/passwdをパッチしてrootパスワードを削除し、su rootを実行 |
--set-password | 最初に権限昇格し、次にstdinから新しいrootパスワードを読み取り、chpasswdで適用 |
--uid | /etc/passwd内の現在のユーザーのUIDを0に変更し、su <username>を実行 |
--backup <path> | 上書き前にsuバイナリをバックアップ |
--exec <path> | 上書き後にrootとして特定のコマンドを実行 |
1. --uid — ページキャッシュ書き込みを介して/etc/passwd内の現在のユーザーのUIDフィールドを0000に変更します。パッチ適用後、自分のパスワードでsu <username>を実行するとrootシェルが得られます。このツールは、認証後かつシェル起動前にページキャッシュのクリアを試みるため、SSHがアカウントをUID 0として認識し続ける可能性を低減します。rootパスワードの変更は不要です。任意の4桁のUID(1000〜9999)で動作します。
2. --escalate — ページキャッシュ書き込みを介して/etc/passwdのroot行をパッチします: root:x:0:0:root:... → root::0:0:root :...。コメントフィールドは行の長さを同じに保つためにスペースで埋められます。パッチ適用後、su rootはパスワードなしで動作します。
3. --set-password — 最初に権限昇格(rootパスワードの削除)し、次にstdinから新しいパスワードを読み取り、chpasswdで適用します。
4. デフォルトモード(フラグなし) — suバイナリのページキャッシュをアーキテクチャ固有のシェルコードペイロード(x86_64、x86、aarch64)で上書きし、その後suを実行してrootシェルを取得します。
cargo build
cargo build --release
cargo test
cargo clippy
./copyfail-rs --check
./copyfail-rs --uid
./copyfail-rs --escalate
printf '%s\n' 'mypassword' | ./copyfail-rs --set-password
./copyfail-rs --backup /tmp/su.bak
./copyfail-rs --exec /bin/bash
ページキャッシュの変更は揮発性です — キャッシュをクリアすると元のディスク上のコンテンツが復元されます:
echo 3 > /proc/sys/vm/drop_caches
このプロジェクトは、認可されたセキュリティテストおよび教育目的のみで提供されます。
| OS | カーネル | 結果 |
|---|
| Ubuntu 22.04.2 LTS | 6.8.0-87-generic | --escalate 成功、--set-password 成功、--uid 成功 |
| Ubuntu 22.04.2 LTS | 6.8.0-107-generic | --escalate 成功、--uid 成功 |
| Ubuntu 25.10 | 6.17.0-5-generic | splice EINVAL、カーネルパッチ済み |
| Ubuntu 25.10 | 6.17.0-8-generic | --uid 成功 |
| Alpine Linux edge | 6.19.12 | エクスプロイトは実行されるが、ページキャッシュ書き込みはカーネル修正によりブロック |