CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-71554

CVE-2026-71554: HTTP Request Smuggling via Duplicate Host Headers in h2 Protocol Stack

Alon Barad
Alon Barad
Software Engineer

Aug 6, 2026·5 min read·77 visits

Executive Summary (TL;DR)

The 'h2' Python library fails to reject HTTP/2 streams containing multiple 'Host' headers. If an intermediary proxy downgrades these streams to HTTP/1.1, the duplicate headers are forwarded, triggering HTTP Request Smuggling.

A protocol-parsing vulnerability in the pure-Python HTTP/2 library 'h2' (versions <= 4.4.0) allows unauthenticated remote attackers to perform HTTP Request Smuggling (CWE-444). The vulnerability exists because the library does not validate the uniqueness of 'Host' headers in incoming HTTP/2 request streams. When an upstream gateway parses such requests and downgrades them to HTTP/1.1 for internal backend servers, the resulting stream contains duplicate Host headers, which leads to parsing inconsistency and potential bypass of security filters.

Vulnerability Overview

The pure-Python HTTP/2 protocol implementation library h2 is widely deployed as a core dependency in Python web applications, ASGI servers, and microservice proxy frameworks. The library is responsible for parsing low-level HTTP/2 frames, including HEADERS frames, and ensuring compliance with HTTP/2 and generic HTTP standards. Under standard configurations, the library acts as the front-line parser for incoming external network traffic before passing structured requests to upper-layer applications.

The vulnerability is classified under CWE-444: Inconsistent Interpretation of HTTP Requests ('HTTP Request/Response Smuggling'). The flaw lies in the handling of HTTP/2 headers that map directly to HTTP/1.1 connection concepts. Because HTTP/2 mandates lower-case header names and relies primarily on pseudo-headers like :authority for routing, standard HTTP/1.1 header validation rules are sometimes overlooked or improperly implemented during transition phases.

When a downstream proxy downgrades incoming HTTP/2 connections to HTTP/1.1 to route them to legacy backends, the absence of duplicate Host header validation in h2 causes both headers to be serialized. The downstream systems then receive conflicting metadata regarding the target host, exposing the deployment to request smuggling vectors.

Root Cause Analysis

The root cause of this vulnerability is located within the _validate_host_authority_header generator function in src/h2/utilities.py. In an HTTP/2 context, request authorities are primarily defined by the :authority pseudo-header. However, for backward compatibility and transition purposes, RFC 9110 specifies that clients may also supply a standard host header. According to HTTP semantics, any individual request must contain at most a single host identifier.

Prior to version 4.4.1, h2 did not track whether a host header had already been processed when parsing incoming headers in a loop. The utility generator processed and yielded every b"host" byte-string identifier encountered. The parser updated a local variable host_header_val to the last value parsed, discarding earlier values without raising any protocol exception.

Because the parser allowed multiple instances of the host key to pass validation, an attacker could include multiple conflicting host headers within a single HEADERS frame. The state machine continued tracking the connection successfully, eventually yielding all the headers directly to the application layer.

Code-Level Analysis and Patch Verification

To understand the implementation flaw, observe the original validation loop inside src/h2/utilities.py before the patch:

# Vulnerable implementation in h2 <= 4.4.0
def _validate_host_authority_header(headers: Iterable[Header]) -> Generator[Header, None, None]:
    # ... initialization of variables ...
    for header in headers:
        if header[0] == b":authority":
            authority_header_val = header[1]
        elif header[0] == b"host":
            # Missing: Verification that host_header_val is None
            host_header_val = header[1] 
 
        yield header

The patch introduced in version 4.4.1 (commit 292a40829feefda98c8509dcdbbb4a57af9bd6a6) inserts a explicit check to verify that host_header_val is unassigned before recording a new b"host" value:

# Patched implementation in h2 4.4.1
def _validate_host_authority_header(headers: Iterable[Header]) -> Generator[Header, None, None]:
    # ... initialization of variables ...
    for header in headers:
        if header[0] == b":authority":
            authority_header_val = header[1]
        elif header[0] == b"host":
            if host_header_val is not None:
                msg = "Request header block has multiple Host headers."
                raise ProtocolError(msg)
            host_header_val = header[1]
 
        yield header

This modification ensures that if a duplicate b"host" header is encountered, h2 immediately raises a ProtocolError exception, shutting down the stream. This prevents the request from reaching the application layer or downstream servers.

The fix is complete because HTTP/2 mandates that header names must be entirely lowercase. The byte-string comparison header[0] == b"host" is sufficient to catch all validly formatted host headers. Any mixed-case variants (e.g., Host or HOST) are rejected at an earlier stage by the HTTP/2 frame decoder, preventing bypasses utilizing header name capitalization.

Exploitation Methodology

An attacker seeking to exploit this vulnerability must target an environment that uses a vulnerable h2 gateway downstream of an HTTP/1.1 backend infrastructure. The attack is structured as follows:

  1. Request Crafting: The attacker sends an HTTP/2 request containing standard pseudo-headers and appends duplicate host headers. For instance:

    • :authority: valid-target.com
    • host: valid-target.com
    • host: restricted-internal-target.com
  2. Proxy Processing: The front-end proxy uses the vulnerable h2 library to parse the request. Since h2 does not reject the duplicate headers, the request is passed through to the proxy's routing logic.

  3. Connection Downgrading: The proxy converts the HTTP/2 stream to HTTP/1.1 to forward it to the backend server, serializing the headers as:

    GET /admin HTTP/1.1
    Host: valid-target.com
    Host: restricted-internal-target.com
  4. Inconsistent Interpretation: If the front-end proxy validated the request path /admin against valid-target.com (which is permitted), but the backend server prioritizes the second Host header (restricted-internal-target.com), the attacker successfully accesses restricted backend functions. This discrepancy allows bypass of host-based routing restrictions, web cache poisoning, or credential access.

Impact Assessment

The impact of CVE-2026-71554 depends heavily on the architecture of the hosting environment. If the Python application is directly exposed to the internet and does not downgrade connection protocols, the impact is negligible.

However, in cloud-native configurations where an ASGI server (such as Uvicorn or Hypercorn) or a custom gateway relies on h2 and sits behind an external load balancer, the threat is elevated. The vulnerability scores 5.3 (Medium) under CVSS v3.1, reflecting low confidentiality and integrity impact if exploited to bypass access control measures.

Additionally, because HTTP Request Smuggling can affect upstream caches, an attacker could potentially poison shared web caches, mapping legitimate pages to administrative resources, affecting other active users of the platform.

Official Patches

python-hyperOfficial patch commit to address duplicate host header vulnerability
python-hyperGitHub Security Advisory (GHSA-6hr6-w5qg-qmwg)

Fix Analysis (1)

Technical Appendix

CVSS Score
5.3/ 10
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L

Affected Systems

Python environments utilizing the h2 (python-hyper) library version <= 4.4.0ASGI web servers and Python reverse proxies performing HTTP/2 to HTTP/1.1 translation

Affected Versions Detail

Product
Affected Versions
Fixed Version
h2
python-hyper
< 4.4.14.4.1
AttributeDetail
CWE IDCWE-444
Attack VectorNetwork (AV:N)
CVSS v3.1 Score5.3 (Medium)
ImpactLow Integrity & Availability (Potential HTTP Request Smuggling)
Exploit Statusnone (Theoretical / No public PoCs available)
KEV StatusNot Listed

MITRE ATT&CK Mapping

T1190Exploit Public-Facing Application
Initial Access
CWE-444
Inconsistent Interpretation of HTTP Requests ('HTTP Request/Response Smuggling')

The software receives an HTTP request and parses it in an inconsistent way compared to upstream or downstream servers, allowing actors to 'smuggle' a request to the recipient without the intermediary's knowledge.

Vulnerability Timeline

Official patch commit committed to python-hyper/h2 repository.
2026-08-03
GitHub Security Advisory GHSA-6hr6-w5qg-qmwg published.
2026-08-06
CVE-2026-71554 registered in National Vulnerability Database (NVD).
2026-08-06

References & Sources

  • [1]NVD Record for CVE-2026-71554
  • [2]GitHub Security Advisory GHSA-6hr6-w5qg-qmwg
  • [3]Vulnerability Fix Commit
  • [4]Python-Hyper h2 Repository

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•3 minutes ago•CVE-2026-107377
7.5

CVE-2026-107377: Arbitrary File Write and Overwrite via Protobuf Weak Import Path Traversal in datamodel-code-generator

A path traversal vulnerability in datamodel-code-generator allows remote attackers to write or overwrite arbitrary files on the local host filesystem via a manipulated Protobuf schema containing malicious weak import paths.

Amit Schendel
Amit Schendel
0 views•5 min read
•about 1 hour ago•CVE-2026-61431
6.8

CVE-2026-61431: Arbitrary Local File Read and Path Traversal in PraisonAI ContextGatherer

PraisonAI is vulnerable to an arbitrary local file read vulnerability prior to version 4.6.78. The flaw is in the ContextGatherer component, where validation checks are executed only after files are parsed and appended to the context bundle, bypassing security constraints.

Amit Schendel
Amit Schendel
4 views•6 min read
•about 2 hours ago•CVE-2026-107212
7.5

CVE-2026-107212: CPU Exhaustion Denial of Service via Look-Ahead Row Parsing in Excelize

An algorithmic complexity vulnerability (CWE-770) in the Excelize library allows remote attackers to cause resource exhaustion (100% CPU usage) via a crafted Microsoft Excel spreadsheet. This occurs because the look-ahead row index parsing in Rows.Columns() fails to enforce upper boundary limits, enabling an out-of-bounds row index to trigger an infinite seek loop inside the Rows iterator.

Alon Barad
Alon Barad
6 views•6 min read
•about 3 hours ago•CVE-2026-105647
4.0

CVE-2026-105647: Server-Side Request Forgery via Favicon Probing in Ghost CMS

An unauthenticated Server-Side Request Forgery (SSRF) vulnerability exists in Ghost CMS from version 6.54.1 to 6.65.0. The vulnerability stems from a validation bypass in the favicon resolution logic within the bookmark-fetching subsystem, which allows remote, unauthenticated attackers to trigger arbitrary HTTP requests to the local host and internal networks. This bypass circumvents the custom DNS-level IP blocklist controls configured globally in the application.

Alon Barad
Alon Barad
3 views•8 min read
•about 4 hours ago•CVE-2026-106450
5.3

CVE-2026-106450: Denial of Service via Eager Resource Allocation in lz4-java LZ4FrameInputStream

A resource allocation vulnerability (CWE-770) in lz4-java before version 1.11.4 allows an unauthenticated remote attacker to trigger CPU exhaustion and high garbage collection overhead by streaming empty concatenated LZ4 frames.

Alon Barad
Alon Barad
9 views•8 min read
•about 5 hours ago•CVE-2026-106449
3.7

CVE-2026-106449: Stack Overflow via Uncontrolled Recursion in yawkat lz4-java

A Denial of Service (DoS) vulnerability exists in the yawkat fork of lz4-java prior to version 1.11.4. Under specific non-default configurations (stopOnEmptyBlock = false), parsing crafted streams with a large sequence of contiguous empty LZ4 blocks triggers uncontrolled recursion inside the LZ4BlockInputStream.refill() method, causing stack exhaustion and thread termination.

Alon Barad
Alon Barad
6 views•6 min read