Media

Eclipse Jetty: HTTP Authority/Host mismatch

  • Publicada: 22.07.2026
  • Actualizado: 11.10.2026 13:20

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

Software afectado

Haz clic en una tecnología para ver todas sus vulnerabilidades.

PlataformaPaqueteVersiones vulnerablesCorregida en
Java / Kotlin (Maven) org.eclipse.jetty:jetty-server >= 9.4.0.v20161208, <= 9.4.58.v20250814, >= 10.0.0, <= 10.0.26, >= 11.0.0, <= 11.0.26, >= 12.0.0, < 12.0.35, >= 12.1.0, < 12.1.9 12.0.35, 12.1.9

Referencias

Puntuación CVSS 5.3/10
Vector CVSS
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N
Debilidad (CWE)
CWE-20
Plataforma
Java / Kotlin (Maven)
Paquete
org.eclipse.jetty:jetty-server
Publicada
22.07.2026
Actualizado
11.10.2026 13:20

Fuentes y licencias

OSV / GitHub Advisory Database - GHSA-7p3p-8qv8-m2vh - CC BY 4.0

Historial de vulnerabilidades: org.eclipse.jetty:jetty-server

Todas las vulnerabilidades publicadas de este paquete (Java / Kotlin (Maven)), de la más reciente a la más antigua. Muestra si es un fallo aislado o un paquete que hay que vigilar.

Todas (29) en el archivo
Entradas en total
29
Primera → última
10.2018 07.2026
Sin corrección
0
Explotada en ataques
0

Distribución por gravedad

  • Crítica 4
  • Alta 10
  • Media 13
  • Baja 2

Divulgaciones por año

  1. 2018: 8
  2. 2019: 5
  3. 2020: 2
  4. 2021: 3
  5. 2022: 3
  6. 2023: 2
  7. 2024: 1
  8. 2025: 1
  9. 2026: 4
Gravedad:
  1. Alta · 7.5 CVE-2024-7708 >= 10.0.7, < 10.0.23, >= 11.0.7, < 11.0.23 10.0.23, 11.0.23
  2. Eclipse Jetty: HTTP Authority/Host mismatch esta entrada
    Media · 5.3 CVE-2026-6790 >= 9.4.0.v20161208, <= 9.4.58.v20250814, >= 10.0.0, <= 10.0.26, >= 11.0.0, <= 11.0.26, >= 12.0.0, < 12.0.35, >= 12.1.0, < 12.1.9 12.0.35, 12.1.9
  3. Alta · 7.5 CVE-2026-1605 >= 12.1.0, < 12.1.6, >= 12.0.0, < 12.0.32 12.1.6, 12.0.32
  4. Alta · 7.5 CVE-2022-2191 >= 10.0.0, < 10.0.10, >= 11.0.0, < 11.0.10 10.0.10, 11.0.10
  5. Alta · 7.5 CVE-2021-28165 >= 7.2.2, < 9.4.39, >= 10.0.0, < 10.0.2, >= 11.0.0, < 11.0.2 9.4.39, 10.0.2, 11.0.2
  6. Crítica · 9.4 CVE-2019-17638 >= 9.4.27, < 9.4.30.v20200611 9.4.30.v20200611
  7. Alta · 7.5 CVE-2018-12545 >= 9.4.0, < 9.4.12.v20180830, >= 9.3.0, < 9.3.25.v20180904 9.4.12.v20180830, 9.3.25.v20180904
  8. Alta · 7.5 CVE-2015-2080 < 9.2.9.v20150224 9.2.9.v20150224
  9. Crítica · 9.8 CVE-2017-7658 < 9.2.25.v20180606, >= 9.3.0, < 9.3.24.v20180605, >= 9.4.0, < 9.4.11.v20180605 9.2.25.v20180606, 9.3.24.v20180605, 9.4.11.v20180605
  10. Alta · 7.5 CVE-2017-7656 < 9.3.24.v20180605, >= 9.4.0, < 9.4.11.v20180605 9.3.24.v20180605, 9.4.11.v20180605
  11. Alta · 7.5 CVE-2017-9735 >= 9.4.0, < 9.4.6.v20170531, >= 9.3.0, < 9.3.20.v20170531, < 9.2.22.v20170606 9.4.6.v20170531, 9.3.20.v20170531, 9.2.22.v20170606
  12. Crítica · 9.8 CVE-2017-7657 < 9.2.25.v20180606, >= 9.3.0, < 9.3.24.v20180605 9.2.25.v20180606, 9.3.24.v20180605
  13. Alta · 8.8 CVE-2018-12538 >= 9.4.0, < 9.4.11.v20180605 9.4.11.v20180605

Identifica las vulnerabilidades de tu aplicación

Con la integración de DockRay y el inventario de software activado, DockRay compara las versiones notificadas de los componentes con las vulnerabilidades conocidas y avisa de las coincidencias confirmadas. La cobertura depende de la tecnología compatible y de los avisos disponibles.

Conectar tu aplicación
Newsletter DockRay

La seguridad de tus aplicaciones en tu correo

Vulnerabilidades importantes, recomendaciones concretas y consejos prácticos para tus aplicaciones. Elige tus tecnologías y sigue lo que importa para tu proyecto.

  • Un resumen diario de nuevas vulnerabilidades, también las críticas.
  • Avisos sobre actualizaciones importantes.
  • Consejos prácticos sobre seguridad y monitorización de aplicaciones.

Déjalo vacío para recibir avisos de todas las tecnologías.

Suscripción gratuita. Date de baja con un clic en cualquier correo.