
fragnesia(CVE-2026-46300)のGo実装
SA1つ。一度に1バイト。レースなし。
fragnesia(CVE-2026-46300)のGo移植版です。Dirty Frag脆弱性クラスの一員 - 別のバグ、同じ攻撃面、独自のパッチ。
このバグはLinux XFRM ESP-in-TCPサブシステムに存在します。ファイルからTCP受信キューへデータがsplice()された後、ソケットにTCP_ULP espintcpがインストールされると、カーネルはキュー内のデータをESP暗号文レコードとして扱い、その場で復号します。このデータのソースはページキャッシュ内のページです。復号処理はAES-GCMキーストリームをそのページに直接XORします。
その結果、任意の読み取り可能ファイルのページキャッシュに対して、制御可能な1バイト書き込みが発生します。
キーストリームテーブル
AES-GCM(RFC 4106)のカウンタブロック位置2は[salt(4) || IV(8) || 0x00000002]です。これをセッションキーで暗号化すると16バイトのキーストリームブロックが得られます。このブロックのバイト0が対象バイトにXORされます。IVノンスの下位32ビットを変化させることで、最初の65536個のノンス内で256通りすべてのキーストリームバイト値に到達できます。エクスプロイトは起動時にAF_ALG AES-ECB経由でこのルックアップテーブルを一度だけ構築します。
バイトフリップループ
ペイロードの各バイトについて:
needed_keystream = current XOR desired を計算します。TCP_ULPのインストールを遅延させます)。current XOR keystream = current XOR (current XOR desired) = desired。SAは1つ。最大192トリガー。決定的。
go build -o fragnesia-go .
./fragnesia-go
成功すると、新しいPTY経由でrootシェルに落ちます。ディスク上のバイナリは変更されません - ページキャッシュのみです。
echo 1 | tee /proc/sys/vm/drop_caches
esp6(トランスポートモード、IPv6ループバック)パッチ適用前のすべてのカーネル: https://lists.openwall.net/netdev/2026/05/13/79
dirtyfragと同じ範囲。
dirtyfragと同じ:
rmmod esp4 esp6
printf 'install esp4 /bin/false\ninstall esp6 /bin/false\n' \
> /etc/modprobe.d/fragnesia.conf
| dirtyfrag-go | fragnesia-go |
|---|
| CVEs | CVE-2026-43284 / CVE-2026-43500 | CVE-2026-46300 |
| トランスポート | ESP-in-UDP + RxRPC | ESP-in-TCP (ULP) |
| 書き込み粒度 | トリガーあたり4バイト | トリガーあたり1バイト |
| XFRM SAs | 48 | 1 |
| 暗号方式 | HMAC-SHA256 + CBC-AES | AES-128-GCM |
| IPファミリー | IPv4 | IPv6 |