
NGINX HTTP/3 (ngx_http_v3_module) 向けの非破壊的な脆弱性スキャナーです。安全なプローブのみを実行します。HTTP/3 (QUIC) 接続を開き、単一の HEAD リクエストを送信し、`Server` 応答ヘッダーを検査します。QPACK エンコーダーストリームを再開したり、use-after-free をトリガーしようとは決してしません。
NGINX HTTP/3 (QUIC) use-after-free に対する非破壊的マススキャナー
バグを引き起こすことなく、どのホストが露出しているかを把握します。
このツールは許可されたセキュリティテスト専用です。自身のインフラストラクチャ、または明示的な書面による許可を得たシステムにのみ使用してください。読み取り専用のフィンガープリントを実行し、脆弱性を悪用しません。スコープ内にとどまり、適用される法律と責任ある開示の原則を遵守する責任はあなたにあります。著者は誤用に対する一切の責任を負いません。
CVE-2026-42530 は、NGINX の ngx_http_v3_module における use-after-free (CWE-416) です。NGINX が HTTP/3 を提供するように設定されている場合、リモートの認証されていない攻撃者が細工された HTTP/3 セッション内で QPACK エンコーダストリームを再開し、ワーカープロセスが解放済みメモリを参照する原因となる可能性があります。直接的な影響はワーカーのクラッシュ/再起動(サービス拒否)です。ASLR が無効化またはバイパス可能なホストでは、リモートコード実行にエスカレートする可能性があります。
重要ポイント: この欠陥は HTTP/3 (QUIC) が有効な場合のみ 到達可能です。デフォルトでは有効ではありません。TCP 上で HTTP/1.1 または HTTP/2 のみを提供するホストは、この特定のベクターの影響を受けません。
| ブランチ | 状態 |
|---|---|
| NGINX Open Source 1.31.0 – 1.31.1 | ❌ 脆弱 |
| NGINX Open Source 1.31.2+ | ✅ 修正済み |
| NGINX Plus | ベンダーのアドバイザリ (R36 P6 / 37.0.2.1) を適用 |
実際の HTTP/3 接続を開き、単一の HEAD / リクエストを送信し、Server ヘッダーを読み取ります。それに基づいて各ターゲットを分類します。重要なのは、到達可能だがバージョンが隠されている ホストを偽の「クリーン」ではなく 手動レビューが必要 として扱うことです。なぜなら、QUIC が到達可能であることが CVE の前提条件だからです。
Python 3.11+ が必要(asyncio.timeout を使用)。
git clone https://github.com/renzi25031469/CVE-2026-42530-scanner.git
cd CVE-2026-42530-scanner
pip install aioquic
ヒント: 仮想環境を使用する —
python3 -m venv .venv && source .venv/bin/activate。
# 単一ホスト
python3 cve-2026-42530-scanner.py example.com
# ファイルから複数ホスト、100同時、CSV保存
python3 cve-2026-42530-scanner.py -f targets.txt -c 100 --csv results.csv
# 標準入力からターゲットをパイプ、JSON出力
cat hosts.txt | python3 cve-2026-42530-scanner.py -f - --json results.json
# カスタムポートとタイムアウト
python3 cve-2026-42530-scanner.py target.internal -p 8443 -t 5
1行に1ホスト。ポート、スキーム、パス、コメントは自動的に処理されます。
# production edge
edge01.example.com
edge02.example.com:8443
https://api.example.com/
# staging
10.0.5.21
[*] CVE-2026-42530 safe-check — 4 target(s), concurrency=100, timeout=10s
======================================================================
CVE-2026-42530 SAFE-CHECK RESULTS
======================================================================
[VULNERABLE ] edge01.example.com:443 (Server: nginx/1.31.1)
-> Vulnerable NGINX version over HTTP/3. Upgrade to nginx/1.31.2 or later.
[HTTP3_VERSION_HIDDEN ] api.example.com:443
-> HTTP/3 reachable but Server header is masked. Verify the NGINX version manually.
[LIKELY_PATCHED ] edge02.example.com:8443 (Server: nginx/1.31.2)
[NO_HTTP3 ] 10.0.5.21:443
----------------------------------------------------------------------
Summary: VULNERABLE=1 | HTTP3_VERSION_HIDDEN=1 | LIKELY_PATCHED=1 | NO_HTTP3=1
[!] 1 host(s) appear VULNERABLE. Mitigation: upgrade to nginx/1.31.2 or later,
or remove 'quic' from all 'listen' directives.
======================================================================
listen ディレクティブから quic パラメータを削除し、http3 on; を削除して HTTP/3 を無効にし、NGINX をリロードします。これにより脆弱なコードパスが完全に除去されます。/proc/sys/kernel/randomize_va_space = 2)。これは強化レイヤーとして扱い、パッチの代わりにはなりません。aioquic は非同期であるため、このスキャナーは OS スレッドではなく asyncio.Semaphore を使用します。ネットワーク I/O バウンドの作業(数百の QUIC ハンドシェイクがワイヤ上で待機している)では、単一のイベントループはスレッドプールよりもはるかに低いオーバーヘッドで拡張でき、同じ「一度に多数のホストをスキャン」動作を実現します。-c でバウンドを調整します。
元の開示でクレジットされた研究者の皆様の協調的な報告に感謝します。
MIT ライセンスの下で公開されています。LICENSE を参照してください。
防御者と許可されたレッドチームのために作られました。責任を持ってスキャンしてください。🔐
| CVE | CVE-2026-42530 |
| コンポーネント | ngx_http_v3_module (HTTP/3 / QUIC) |
| クラス | Use-After-Free (CWE-416) |
| CVSS | 9.2 (v4) · 8.1 (v3.1) |
| 影響 | ワーカークラッシュ / DoS、ASLR なしで RCE の可能性 |
| ベクター | ネットワーク、認証不要、ユーザー操作不要 |
| ステータス | 意味 |
|---|
VULNERABLE | NGINX 1.31.0 / 1.31.1 が HTTP/3 経由で提供 |
HTTP3_VERSION_HIDDEN | HTTP/3 は到達可能だが Server が隠蔽 (server_tokens off) — 手動でバージョン確認 |
LIKELY_PATCHED | HTTP/3 経由の NGINX、影響範囲外のバージョン |
NOT_NGINX | HTTP/3 到達可能だがサーバーが NGINX ではない |
NO_HTTP3 | HTTP/3 / QUIC リスナーが到達不能(このベクターでは露出なし) |
ERROR | プローブが別の理由で失敗 |
| フラグ | 説明 | デフォルト |
|---|
host | 単一ターゲット(位置引数) | — |
-f, --file | ターゲットリストファイル(- は標準入力) | — |
-p, --port | デフォルトのQUIC/UDPポート | 443 |
-t, --timeout | ホストごとのタイムアウト(秒) | 10 |
-c, --concurrency | 最大同時スキャン数 | 50 |
--csv | 結果をCSVに書き出し | — |
--json | 結果をJSONに書き出し | — |