
CVE-2019-9511 (Data Dribble) および CVE-2019-9513 (Priority Churn) のDoSベクターを許可された環境で制御検証するための軽量なHTTP/2プローブ。
CVE CVE-2019-9511 および CVE-2019-9513 に関連する動作を軽量に検証するためのスクリプトリポジトリです。両CVEはHTTP/2実装におけるサービス拒否ベクトルに関連しています。
これらのスクリプトは、許可された環境での技術的な検証を支援するために作成されました。サーバーがHTTP/2をネゴシエートし、Data Dribble や Priority Churn に関連する特定のパターンに応答するかどうかを、サービス拒否攻撃を実行せずに観察できます。
軽量かつ安全にベクトルを確認することを目的としており、少数のリクエストで環境をダウンさせる意図はありません。
| CVE | 名称 | スクリプト | 説明 |
|---|---|---|---|
CVE-2019-9511 | HTTP/2 Data Dribble | data_dribble_probe.py | 少量のデータを制御された方法で解放し、HTTP/2フロー制御の動作を検証します。 |
CVE-2019-9513 | HTTP/2 Priority Churn / Resource Loop | priority_churn_probe.py | 低強度で PRIORITY フレームの処理動作を検証します。 |
CVE-2019-9511(別名 HTTP/2 Data Dribble)は、フローウィンドウの操作とデータの段階的配信を効率的に処理しない一部のHTTP/2実装に影響を与えます。
このシナリオでは、攻撃者がサーバーにデータを要求し、フロー制御を操作して応答を開いたままにし、1バイトのパケットのような小さなブロックでデータを配信させることができます。実装によっては、この動作によりCPU、メモリ、または接続リソースが過剰に消費され、サービス拒否のリスクが生じる可能性があります。
このリポジトリでは、関連するスクリプトは次のとおりです。
data_dribble_probe.py
このスクリプトの目的は、攻撃的な負荷をかけず、サービス停止を引き起こそうとせずに、軽量に動作を検証することです。
参照:
CVE-2019-9513(別名 HTTP/2 Priority Churn または Resource Loop)は、ストリームの優先順位ツリーに対する継続的な変更をコストのかかる方法で処理する一部のHTTP/2実装に影響を与えます。
このシナリオでは、攻撃者が複数のストリームを作成し、それらの優先順位を繰り返し変更して、優先順位ツリーにチャーンを引き起こす可能性があります。実装によっては、この動作によりCPUが過剰に消費され、サービス拒否につながる可能性があります。
このリポジトリでは、関連するスクリプトは次のとおりです。
priority_churn_probe.py
このスクリプトの目的は、サーバーが PRIORITY フレームを受け入れて処理するかどうかを、低強度でDoS攻撃を実行せずに検証することです。
参照:
CVE-2019-9511 および CVE-2019-9513 は、nginx、Apache、Tomcatなどの単一の特定のバージョンのWebサーバーに関連付けられているわけではありません。
これらは、さまざまな製品、ライブラリ、プロキシ、ロードバランサー、サーバーにおける特定のHTTP/2実装に影響を与えます。したがって、検証では、分析対象の環境でHTTP/2をネゴシエートして処理しているコンポーネントを考慮する必要があります。
関与する可能性のあるコンポーネントの例:
nginx
Apache HTTP Server
Envoy
HAProxy
Tomcat
Jetty
Node.js
Go net/http2
nghttp2
CDN
WAF
ロードバランサー
Ingress Controller Kubernetes
最初の技術的な基準は、サービスがALPNを介してHTTP/2をネゴシエートするかどうかを確認することです。サービスが h2 をネゴシエートしない場合、これらのスクリプトは適用できません。
バージョンによる脆弱性の確認は、特定されたコンポーネントの製造元の公式アドバイザリに基づいて行う必要があります。
スクリプトを実行する前に、ターゲットがALPNを介してHTTP/2をネゴシエートするかどうかを検証します。
コマンドには https:// を含めず、ドメインのみを使用してください。
openssl s_client -alpn h2 -connect exemplo.com.br:443 </dev/null 2>/dev/null | grep -i "ALPN"
プレースホルダーを使用することもできます。
openssl s_client -alpn h2 -connect <HOST>:443 </dev/null 2>/dev/null | grep -i "ALPN"
期待される出力:
ALPN protocol: h2
出力が h2 を示している場合、サービスはHTTP/2をネゴシエートしており、スクリプトが適用可能である可能性があります。
出力がない場合、またはネゴシエートされたプロトコルが http/1.1 など別のものである場合、そのエンドポイントにはスクリプトは適用できません。
| スクリプト | 関連CVE | 目的 | 使用時 |
|---|---|---|---|
data_dribble_probe.py | CVE-2019-9511 | ウィンドウ制御を使用して小さなデータブロックを解放するData Dribbleに関連する動作を検証します | サーバーがHTTP/2をサポートし、縮小されたウィンドウでDATAフレームの配信動作を確認する必要がある場合。 |
priority_churn_probe.py | CVE-2019-9513 | 低強度でPRIORITYフレームを使用してPriority Churnに関連する動作を検証します | サーバーがHTTP/2をサポートし、ストリームの優先順位変更を処理するかどうかを確認する必要がある場合。 |
スクリプトを使用する最も論理的な順序は次のとおりです。
1. openssl による HTTP/2 事前検証
↓
2. priority_churn_probe.py
↓
3. data_dribble_probe.py
まず、openssl コマンドを使用して、ターゲットがHTTP/2をネゴシエートするかどうかを確認します。次に、priority_churn_probe.py を使用して、サーバーが優先順位フレームを受け入れて処理するかどうかを検証します。その後、data_dribble_probe.py を使用して、縮小されたフローウィンドウに対してサーバーがどのように動作し、制御された方法で少量のデータを解放するかを観察します。
どちらのスクリプトも軽量なプローブです。それらはサービス停止を引き起こすことを目的としておらず、観察された動作の技術的証拠を生成することを目的としています。
priority_churn_probe.py は、CVE-2019-9513(別名 HTTP/2 Priority Churn)に関連する動作を検証するための軽量なPoCです。
このスクリプトは、TLSを介してHTTP/2接続を確立し、小さなHTTPストリームを開き、PRIORITY フレームを介して優先順位の変更を送信します。次に、これらのフレームを送信する前後のレイテンシを測定し、処理に変動があるかどうかを観察します。
PING を使用して初期レイテンシを測定します;PRIORITY フレームを送信します;このスクリプトは、HTTP/2サーバーが Priority Churn ベクトルに関連する優先順位フレームを受け入れて処理するかどうかを、攻撃的なDoSテストを実行せずに検証する必要がある場合に使用します。
ペネトレーションテストでの制御された検証、HTTP/2露出分析、脆弱性または潜在的に敏感な動作の技術的確認に適しています。
スクリプトはコマンドライン引数で値を受け取ります。
--host
--port
--paths
--shuffles
| パラメータ | 説明 |
|---|---|
--host | 許可されたターゲットのFQDN。https:// を含めないでください。 |
--port | HTTP/2サービスが利用可能なTLSポート。デフォルト: 443。 |
--paths | HTTP/2ストリームを開くための単純なパスのリスト。 |
--shuffles | 優先順位変更のサイクル数。安全なテストのために低く保ちます。 |
軽量で公開されており、影響の少ないパスを使用してください。例:
/
/robots.txt
/favicon.ico
/health
/login
バックエンドに負荷をかける可能性のある、重量級の操作、複雑なクエリ、レポート生成、アップロード、高度な検索、またはその他の機能を実行するパスは避けてください。
python3 priority_churn_probe.py --host exemplo.com.br --port 443 --paths / /robots.txt /favicon.ico --shuffles 10
出力例:
[OK] PING 前: 45.20 ms; チャーン後: 52.80 ms; shuffles=10
シグナル9513: PRIORITY フレームが受け入れられ処理されました; チャーン後のわずかな増加がベクトルを示しています(DoSは発生しません)。
スクリプトがHTTP/2をネゴシエートし、ストリームを開き、PRIORITY フレームを送信できた場合、サーバーがこの種の動作を処理していることを示します。
チャーン後にレイテンシがわずかに増加した場合、ベクトルが存在することの技術的証拠として使用できますが、それ単独で深刻な影響の証明として解釈されるべきではありません。最終的な分類は、コンテキスト、サーバーバージョン、アーキテクチャ、軽減策、WAF/CDN、HTTP/2設定に依存します。
data_dribble_probe.py は、CVE-2019-9511(別名 HTTP/2 Data Dribble)に関連する動作を検証するための軽量なPoCです。
このスクリプトは、TLSを介してHTTP/2接続を確立し、単一のストリームを開き、フロー制御ウィンドウを操作して少量のデータを解放し、DATAフレームの段階的な配信動作をシミュレートします。
このスクリプトは、HTTP/2サーバーが Data Dribble ベクトルに関連する縮小されたフロー制御パターンに応答するかどうかを、攻撃的な負荷をかけずに検証する必要がある場合に使用します。
自動化ツールが露出の可能性を指摘し、運用リスクを低減して手動で検証する必要がある場合の制御された技術的確認に適しています。
スクリプトはコマンドライン引数で値を受け取ります。
--host
--path
--port
--bytes
| パラメータ | 説明 |
|---|---|
--host | 許可されたターゲットのFQDN。https:// を含めないでください。 |
--path | テストでリクエストされるパス。 |
--port | HTTP/2サービスが利用可能なTLSポート。デフォルト: 443。 |
--bytes | テスト中に解放される総バイト数。安全な検証のために低く保ちます。 |
サーバーにとって負荷の低い、単純で静的なパスを使用してください。例:
/
/robots.txt
/favicon.ico
/health
/login
データベースクエリ、高負荷な認証、非同期処理、ドキュメント生成、内部システムへの呼び出しを行うエンドポイントは避けてください。
python3 data_dribble_probe.py --host exemplo.com.br --path / --port 443 --bytes 12
出力例:
[OK] HTTP/2 ネゴシエート; 受信DATAフレーム数: 12; 解放バイト数: 12; 時間(ms): 1450
シグナル9511: ウィンドウ=1 で複数の極小DATAが配信されました(ストレスなしでの'dribble'パスの証明)。
スクリプトがHTTP/2をネゴシエートし、フローウィンドウが解放されるにつれて小さなDATAフレームを受信した場合、サーバーがこのフロー制御パターンを処理していることを示します。
この動作はベクトルの技術的証拠として使用できますが、深刻度は、使用されているサーバー、バージョン、接続制限、ロードバランサー、CDN、WAF、タイムアウト、悪用防止策など、環境の実際のコンテキストを考慮する必要があります。
スクリプトにはPython 3と h2 ライブラリが必要です。
python3
pip
h2
ssl
socket
argparse
ssl、socket、time、argparse、select はPython標準ライブラリの一部です。
主な外部依存関係は次のとおりです。
h2
直接インストール:
python3 -m pip install h2
仮想環境を使用したインストール:
python3 -m venv venv
source venv/bin/activate
pip install h2
インストールの確認:
python3 -c "import h2; print('h2 が正常にインストールされました')"
スクリプトはALPNを介したHTTP/2ネゴシエーションに依存します。
実行前に、サーバーがHTTP/2をサポートしているかどうかを確認してください。
openssl s_client -alpn h2 -connect exemplo.com.br:443 </dev/null 2>/dev/null | grep -i "ALPN"
期待される出力:
ALPN protocol: h2
サーバーが h2 をネゴシエートしない場合、スクリプトは適用できません。
--host パラメータにはFQDNのみを使用--host パラメータに https:// を含めないでください。
正しい例:
--host exemplo.com.br
誤った例: