
dirtyfrag(CVE-2026-43284 / CVE-2026-43500)の Go 実装
2つのバグ。1つのシェル。ディスク書き込みなし。
dirtyfrag(CVE-2026-43284 / CVE-2026-43500)のGo移植版です。
このバグクラスはLinuxカーネルのXFRMサブシステムに存在します。ファイルページがパイプにsplice()され、その後ESP暗号化ソケットに送られると、カーネルはESPペイロードをその場で復号化します - ソースファイルのページキャッシュページに直接書き込まれます。ファイルは読み取り専用です。しかしページキャッシュはそうではありません。
dirtyfragは、このプリミティブを悪用する2つの独立したバグを連鎖させます:
CVE-2026-43284 - ESP/XFRMパス
NETLINK_XFRM経由で48個のXFRMトランスポートモードSAをインストールします。各SAは、ESNリプレイ状態のseq_hiフィールドにシェルコードペイロードの4バイトをエンコードします。vmsplice + spliceチェーンは、各SAに対してESPのその場での復号化をトリガーし、その4バイトを/usr/bin/suのページキャッシュエントリに書き込みます。48回のトリガー、192バイトの書き込み、レースコンディションなし。
CVE-2026-43500 - RxRPC/rxkadパス
復号化した際に目的のバイト列を生成する3つのPCBC(fcrypt)セッションキーをオフラインで総当たりします。各キーに対してAF_RXRPCソケットトリガーを起動し、/etc/passwdのrootエントリをroot::0:0(nullok)にパッチします。その後、su -は空のパスワードを受け入れます。
両方のパスは、ホスト上でCAP_NET_ADMINを必要としないように、ユーザー名前空間+ネットワーク名前空間(CLONE_NEWUSER | CLONE_NEWNET)で実行されます。
go build -o dirtyfrag-go .
./dirtyfrag-go
# Force a specific path
./dirtyfrag-go --force-esp
./dirtyfrag-go --force-rxrpc
# Verbose output
./dirtyfrag-go -v
バイナリはまずESPパスを試行します。その後も/usr/bin/suがパッチされていない場合は、RxRPCパスにフォールバックします(最大3回の再試行)。成功すると、新しいPTYを介してrootシェルにドロップします。
このエクスプロイトはページキャッシュのみに触れます。ディスク上のバイナリと/etc/passwdは変更されません。再起動すればすべて元に戻ります。再起動せずにすぐに追い出すには:
echo 1 | tee /proc/sys/vm/drop_caches
esp4、esp6(ESPパス)、および/またはrxrpc(RxRPCパス)パッチ適用前のすべてのカーネル:
rmmod esp4 esp6 rxrpc
printf 'install esp4 /bin/false\ninstall esp6 /bin/false\ninstall rxrpc /bin/false\n' \
> /etc/modprobe.d/dirtyfrag.conf
Goのランタイムは最初からマルチスレッドであるため、unshare(CLONE_NEWUSER)は許可されていません。Go移植版は、SysProcAttr.Cloneflagsを設定した子プロセスとして自身を再実行します。これにより、Goランタイムが初期化される前にclone()が呼び出されます。
| C(オリジナル) | Go |
|---|
| 外部依存 | なし | なし |
| 単一ファイル | いいえ | いいえ |
| 静的バイナリ | はい | はい |
| RxRPCパス | はい | はい |
| ESPパス | はい | はい |
| 名前空間の分離 | unshare() | Cloneflagsによる再実行 |