fix(agentex): bump h2 4.3.0 -> 4.4.1 (CVE-2026-71554) - #397
Open
scale-prodsec[bot] wants to merge 1 commit into
Open
fix(agentex): bump h2 4.3.0 -> 4.4.1 (CVE-2026-71554)#397scale-prodsec[bot] wants to merge 1 commit into
scale-prodsec[bot] wants to merge 1 commit into
Conversation
h2 4.3.0 accepts request header blocks containing multiple Host headers and forwards them all to the consuming application. Where a consumer downgrades HTTP/2 to HTTP/1.1 the resulting request carries two Host header lines, a request smuggling primitive (CWE-444). h2 4.4.1 rejects duplicate Host headers with a ProtocolError on both the receive and send paths. Transitive via httpx[http2] (httpx 0.28.1 declares h2<5,>=3, so the target is inside the parent range). hpack 4.1.0 -> 4.2.0 comes along because h2 4.4.1 requires hpack<5,>=4.2.
|
No reviewable files after applying ignore patterns. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Bumps
h24.3.0 -> 4.4.1 in the workspaceuv.lockto remediate CVE-2026-71554.Linear: GFDVR-23782 (child: GFDVR-23783)
h2(python-pkg, transitive viahttpx[http2])uv.lock(root workspace lock consumed byagentex/Dockerfile)golden/agentex@sha256:d34c1ea2…The vulnerability
h2 <= 4.4.0 accepts request header blocks containing more than one
Hostheader and forwards every one to the consuming application. Where a consumer downgrades HTTP/2 to HTTP/1.1, the resulting request carries twoHostheader lines — a request-smuggling primitive (CWE-444). Fixed in 4.4.1 by292a408, which raisesProtocolErroron duplicateHostheaders on both the receive and send paths.Changes
uv.lockonly — 1 file, 6 insertions / 6 deletions:h24.3.0 -> 4.4.1hpack4.1.0 -> 4.2.0 — required closure member; h2 4.4.1 declareshpack<5,>=4.2(4.3.0 declared>=4.1)No manifest change:
h2is transitive and nopyproject.tomldeclares it. Re-locked with the package-targeteduv lock --upgrade-package h2; lockrevision = 3preserved (local uv 0.7.22 rewrites it to 2, souv@0.8.17was used). All resolved URLs remain onfiles.pythonhosted.org; no registry flip. No application code touched.Behavior-contract review
h2 4.4.0 carries backward-incompatible API changes, so both crossed versions were reviewed against the actual consumer (
httpcore1.0.9, pinned):Host->ProtocolError(the fix)httpcore/_async/http2.py:243-246stripsb"host"and maps it to:authoritybeforesend_headers, so a duplicate can't be constructed on this path.content-length->ProtocolErrorcontent-lengththrough to h2.Stream.end_stream()raisesNoSuchStreamError/StreamClosedErrorinstead ofKeyErrorKeyErroraroundend_stream; it only catchesNoAvailableStreamIDError.client.stream().requires-python = "==3.12.*".HTTP/2 is live here (
http2=Trueinadapters/http/adapter_httpx.pyandutils/cached_httpx_client.py), so this was verified by execution rather than inspection alone. Separately, both header-forwarding paths in this repo (agent_acp_service.pyHOP_BY_HOP_HEADERS,middleware_utils.pyDROP_HEADERS) already drophost, so noHostheader is ever forwarded downstream.Upstream tracker swept for
regression/breaking/4.4.0/4.4.1— no open issues against either release.Verification
bot.version_gate: h2 4.4.1 has zero known vulnerabilities.h2<5,>=3; target is inside it, no parent co-upgrade needed.uv lock --checkclean;revision = 3preserved.uv export --frozen --no-dev --no-emit-project --package agentex-backendresolvesh2==4.4.1,hpack==4.2.0.uv run --frozen --group test --package agentex-backendinstalls cleanly (189 packages).httpx.AsyncClient(http2=True)constructs; the httpcore-stylehost->:authoritysend path succeeds with noProtocolError; a genuine duplicate-Hostblock now raisesProtocolError: Request header block has multiple Host headers.— confirming the fix is present and enforced.pytest agentex/tests/unit: 518 passed / 187 errors, byte-identical to the untouched-baseline run on the same environment. All 187 errors are pre-existing testcontainers/Docker-daemon setup failures in this sandbox, unrelated to this change.