
Golangで書き直されたCopy Fail(CVE-2026-31431)ローカル権限昇格エクスプロイト。ページキャッシュを破壊してLinuxシステム上でroot権限を取得します。
主要Linuxディストリビューションすべてで732バイトでroot権限を取得
CVE-2026-31431(Copy Fail)は、Linuxカーネルのauthencesn暗号テンプレートにおける論理バグです。権限のないローカルユーザーが、システム上の任意の読み取り可能なファイルのページキャッシュに対して、決定的かつ制御された4バイト書き込みを引き起こすことができます。
CONFIG_CRYPTO_AUTHENCを有効にしたLinuxカーネル(2017年以降の実質すべての主要ディストリビューション)このバグは2つの動作を連鎖させます:
AF_ALG + splice: splice()はページキャッシュページを参照によってAF_ALGソケットのscatterlistに転送します。AEAD復号のインプレースモードでは、タグページ(対象ファイルのページキャッシュ由来)がsg_chain()を介して出力scatterlistに連結されたままになります。
authencesnスクラッチ書き込み: crypto_authenc_esn_decrypt()はdst[assoclen + cryptlen](タグを越えてページキャッシュページ内)をESNシーケンス番号再配置のスクラッチ領域として使用し、攻撃者が制御する4バイトを書き込んで復元しません。
破損したページはダーティとしてマークされることはありません。そのため、ディスク上のファイルは変更されません。しかし、メモリ内のページキャッシュが実際に読み取られるものであるため、破損はシステム全体に即座に表示されます。
このエクスプロイトは、/usr/bin/su(または任意のsetuidバイナリ)のページキャッシュを、小さなシェルコードペイロードで一度に4バイトずつ破損させます。すべての反復が完了すると、suを実行するとペイロードが実行され、rootシェルに落ちます。
python3 exp.py
go run exp.go
go build -ldflags "-w -s" -trimpath -o exp exp.go
tinygo build -o exp exp.go
| 機能 | 詳細 |
|---|---|
| 移植性 | 同じスクリプトがUbuntu、Amazon Linux、RHEL、SUSEなどで動作 — ディストリビューションごとのオフセット不要 |
| 超小型 | Pythonエクスプロイトは約732バイト |
このリポジトリは教育および防御的研究目的のみで公開されています。所有していない、または明示的なテスト許可を得ていないシステムでこのコードを使用しないでください。
| ステルス性 | VFS書き込みパスをバイパス。ページはダーティとしてマークされず、ディスク上のチェックサムも変更されない |
| コンテナ横断 | ページキャッシュはコンテナ間で共有される — コンテナエスケープベクター(パート2参照) |