Your RSA-2048 keys break in 2030. Find every one of them before attackers do.
☕
☕ Maven
Not in CISA KEV
MEDIUM severity

Eclipse Jetty: HTTP Authority/Host mismatchGHSA-7p3p-8qv8-m2vh

MEDIUMFix: jetty/jetty.project#14871

GHSA-7p3p-8qv8-m2vh is a medium-severity (CVSS 5.3) Improper Input Validation vulnerability in org.eclipse.jetty:jetty-server. A fix is available for org.eclipse.jetty:jetty-server — see the affected versions and patch details below.

Also known asCVE-2026-6790
Published
Updated
Affected
5 pkgs
Patched
2 / 5
Exploits
None indexed
Exploitation data as of Oct 23, 2026 · OSV.dev, NVD, FIRST.org (EPSS)

Exploitation Status

No confirmed exploitation observed yet

  • CISA assesses this as automatable — exploitation doesn’t require manual, per-target effort, which raises the odds of mass scanning and opportunistic attacks.
  • CISA’s own triage has not observed active exploitation or public proof-of-concept code for this CVE as of its last assessment.

Exploitation and automatability from CISA’s SSVC triage for GHSA-7p3p-8qv8-m2vh.

EPSS Exploitation Probability

via FIRST.org ↗
0.3%probability of exploitation in next 30 days
Lower Risk0.00%
Lower risk than most CVEs23th percentile — riskier than 23% of all scored CVEsHighest risk
0.00%0.27%0.54%0.81%0.2%0.3%0.3%0.3%Aug 26Oct 26Oct 26

Probability of exploitation in the next 30 days, from FIRST.org EPSS.

How urgent is this, really

GHSA-7p3p-8qv8-m2vh by exploitation likelihood (EPSS) against impact (CVSS). Outside the shaded patch-first corner.

Where this sits among everything scored

Of 395,249 CVEs with a current EPSS score, this one falls in the < 10% band (highlighted). Counts from FIRST.org, log-scaled.

Real-World Exposure

5 pkgs affected
☕org.eclipse.jetty:jetty-server☕org.eclipse.jetty:jetty-server☕org.eclipse.jetty:jetty-server☕org.eclipse.jetty:jetty-server☕org.eclipse.jetty:jetty-server

Real-time download stats are indexed for npm and PyPI packages. This vulnerability affects Maven packages — download data is not available via public APIs for these ecosystems.

Description

Summary

Jetty currently accepts HTTP/2 and HTTP/3 requests where the regular Host header and the pseudo-header :authority do not match. As a result, the same request can carry two different host identities through Jetty:

  • logic based on HttpURI / Request.getServerName(request) uses :authority
  • logic based on raw request headers continues to use Host

This creates a host/authority confusion condition that can break security assumptions in higher layers.

Jetty already performs an explicit authority/Host consistency check on the HTTP/1.1 path, but equivalent validation is missing on the HTTP/2 and HTTP/3 paths.

Security Impact

This issue is not inherently remote code execution, but it can become security-relevant in deployments that rely on the request host for security-sensitive decisions, including:

  • host-based access control
  • virtual host isolation
  • multi-tenant routing by hostname
  • login/logout/callback URL construction
  • reverse proxy and forwarded-header trust chains
  • auditing, cache keys, and absolute URL generation

Potential consequences include:

  • bypass of host-based ACLs
  • virtual host or tenant isolation failures
  • incorrect or attacker-influenced redirect/callback targets
  • inconsistent proxy/downstream interpretation of the original target host
  • misleading logs and audit records

Technical Root Cause

  1. On the HTTP/2 and HTTP/3 metadata builder paths:
  • :authority is parsed separately into authority/URI state
  • Host is preserved as a normal request header
  • the two values are not compared for consistency
  1. On the HTTP/2 and HTTP/3 server entry paths:
  • Jetty calls ComplianceUtils.verify(httpCompliance, requestMetaData, listener)
  • this verification does not enforce MISMATCHED_AUTHORITY
  1. On the HTTP/1.1 path:
  • Jetty explicitly checks whether authority and Host match
  • mismatches are rejected by default

Relevant Code Locations

HTTP/2 metadata builder:

  • jetty-core/jetty-http2/jetty-http2-hpack/src/main/java/org/eclipse/jetty/http2/hpack/internal/MetaDataBuilder.java

HTTP/3 metadata builder:

  • jetty-core/jetty-http3/jetty-http3-qpack/src/main/java/org/eclipse/jetty/http3/qpack/internal/metadata/MetaDataBuilder.java

HTTP/2 server entry:

  • jetty-core/jetty-http2/jetty-http2-server/src/main/java/org/eclipse/jetty/http2/server/internal/HttpStreamOverHTTP2.java

HTTP/3 server entry:

  • jetty-core/jetty-http3/jetty-http3-server/src/main/java/org/eclipse/jetty/http3/server/internal/HttpStreamOverHTTP3.java

Shared HTTP compliance verification:

  • jetty-core/jetty-http/src/main/java/org/eclipse/jetty/http/ComplianceUtils.java

HTTP/1.1 authority/Host consistency check:

  • jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/internal/HttpConnection.java

Defined but not enforced on H2/H3:

  • jetty-core/jetty-http/src/main/java/org/eclipse/jetty/http/HttpCompliance.java
  • violation: MISMATCHED_AUTHORITY

Reproduction

I reproduced this on local Jetty 12.1.9-SNAPSHOT source.

Minimal reproduction steps:

  1. Start a Jetty HTTP/2 or HTTP/3 test server.
  2. Send a request with:
    • :authority = localhost:<port>
    • Host = evil.example:<port>
  3. In the request handler, inspect both:
    • Request.getServerName(request)
    • request.getHeaders().get(HttpHeader.HOST)
  4. Observe whether Jetty rejects the request or allows both values to remain visible. Observed result:
    • HTTP/2: request is accepted and returns 200
    • HTTP/3: request is accepted and returns 200
    • the server can observe both:
      • serverName=localhost
      • hostHeader=evil.example:<port>

This shows that a single attacker-controlled request can preserve two conflicting host interpretations inside Jetty.

Tests Used

HTTP/2 rejection test:

  • org.eclipse.jetty.http2.tests.HTTP2Test#testRejectMismatchedHostHeaderAndAuthority

HTTP/2 exploitability test:

  • org.eclipse.jetty.http2.tests.HTTP2Test#testMismatchedHostHeaderAndAuthoritySplitsAuthorityFromHostHeader

HTTP/3 rejection test:

  • org.eclipse.jetty.http3.tests.HandlerClientServerTest#testRejectMismatchedHostHeaderAndAuthority

HTTP/3 exploitability test:

  • org.eclipse.jetty.http3.tests.HandlerClientServerTest#testMismatchedHostHeaderAndAuthoritySplitsAuthorityFromHostHeader

Observed behavior:

  • both rejection tests fail because Jetty returns 200 instead of 400
  • both exploitability tests pass, confirming that Jetty exposes different host values to different layers

Project-Internal Evidence of Real Impact

Examples:

  • jetty-openid uses Request.getServerName(request) to construct redirect URLs
  • jetty-ee11-proxy uses the raw Host header when building Forwarded

This indicates that the issue is not merely theoretical: Jetty’s own ecosystem already contains code paths where different host sources are used for different purposes.

Affected Version

Confirmed affected version:

  • 12.1.9-SNAPSHOT

Other versions may also be affected if they share the same HTTP/2 / HTTP/3 request construction and compliance-validation logic. I have not yet completed a historical version matrix and would recommend confirming exact affected ranges from Jetty’s branch history.

Suggested Fix

Recommend adding HTTP/2 and HTTP/3 validation equivalent to the existing HTTP/1.1 authority/Host consistency check:

  • if both :authority and regular Host are present
    • normalize and compare them
    • if they do not match, reject the request with 400 Bad Request
    • route the failure through the existing MISMATCHED_AUTHORITY compliance mechanism

Also adding explicit HTTP/2 and HTTP/3 regression coverage for this case.

Disclosure Status

  • not publicly disclosed
  • no public issue filed
  • shared only privately with the Jetty security contacts

Affected Packages

5 total 2 fixed
EcosystemPackageVulnerable rangeFix
☕Mavenorg.eclipse.jetty:jetty-server≥ 9.4.0.v20161208No fix
☕Mavenorg.eclipse.jetty:jetty-server≥ 10.0.0No fix
☕Mavenorg.eclipse.jetty:jetty-server≥ 11.0.0No fix
☕Mavenorg.eclipse.jetty:jetty-server≥ 12.0.0&&< 12.0.3512.0.35org.eclipse.jetty:jetty-server:12.0.35
☕Mavenorg.eclipse.jetty:jetty-server≥ 12.1.0&&< 12.1.912.1.9org.eclipse.jetty:jetty-server:12.1.9

Affected Products

1 product · 5 configurations
Application
jettyeclipse
≥ 12.1.0 && < 12.1.9
range

Detection & mitigation playbook

Open-source dependency
  1. Detect

    Scan your dependency tree (package-lock.json, pnpm-lock.yaml, requirements.txt, go.sum, etc.) for org.eclipse.jetty:jetty-server, including transitive dependencies — a direct dependency you never call can still pull in a vulnerable version.

  2. Fix

    No patched version of org.eclipse.jetty:jetty-server has shipped for GHSA-7p3p-8qv8-m2vh yet. Where your build allows, override or pin the dependency away from the vulnerable range, and apply any maintainer-recommended mitigation.

  3. Workarounds

    Put an independent control in front of the weakness: restrict the affected endpoint or interface to trusted networks, require an additional authentication factor or proxy-level check, and invalidate existing sessions and credentials in case the flaw has already been used.

Frequently Asked Questions

#### Summary Jetty currently accepts HTTP/2 and HTTP/3 requests where the regular Host header and the pseudo-header :authority do not match. As a result, the same request can carry two different host identities through Jetty: - logic based on `HttpURI` / `Request.getServerName(request)` uses `:authority` - logic based on raw request headers continues to use `Host` This creates a host/authority confusion condition that can break security assumptions in higher layers. Jetty already performs an explicit authority/Host consistency check on the HTTP/1.1 path, but equivalent validation is missin
O3 Security · Impact-Aware SCA

Is GHSA-7p3p-8qv8-m2vh in your dependencies?

Find it across Maven, including transitive dependencies.

Eclipse Jetty: HTTP Authority/Host mismatch (Medium 5.3)