Wysoka

async-http-client: Cookie header not stripped on cross-origin redirect

  • Ujawniono: 18.05.2026
  • Aktualizacja: 11.10.2026 13:20

Summary

async-http-client leaks Cookie headers to cross-origin redirect targets. When following a redirect across a security boundary (different origin, or HTTPS→HTTP downgrade), the propagatedHeaders() method in Redirect30xInterceptor.java strips Authorization and Proxy-Authorization headers but does not strip Cookie, so session cookies and other sensitive cookie values are forwarded to the redirect target — which may be attacker-controlled.

Details

The vulnerability is in client/src/main/java/org/asynchttpclient/netty/handler/intercept/Redirect30xInterceptor.java.

The caller computes stripAuth on each redirect:

java
boolean sameBase    = request.getUri().isSameBase(newUri);
boolean stripAuth   = !sameBase || schemeDowngrade || stripAuthorizationOnRedirect;
// ...
requestBuilder.setHeaders(propagatedHeaders(request, realm, keepBody, stripAuth));

stripAuth is true whenever the redirect crosses an origin, downgrades the scheme, or the caller opted in via AsyncHttpClientConfig#isStripAuthorizationOnRedirect().

In the vulnerable version, propagatedHeaders() only removes Authorization and Proxy-Authorization in that branch — Cookie is left untouched:

java
private static HttpHeaders propagatedHeaders(Request request, Realm realm, boolean keepBody, boolean stripAuthorization) {
    HttpHeaders headers = request.getHeaders()
            .remove(HOST)
            .remove(CONTENT_LENGTH);

    if (!keepBody) {
        headers.remove(CONTENT_TYPE);
    }

    if (stripAuthorization || (realm != null && (realm.getScheme() == AuthScheme.NTLM
            || realm.getScheme() == AuthScheme.SCRAM_SHA_256))) {
        headers.remove(AUTHORIZATION)
                .remove(PROXY_AUTHORIZATION);
        // BUG: COOKIE is not removed here, so cookies leak across the security boundary.
    }
    return headers;
}

The companion test class RedirectCredentialSecurityTest covers Authorization / Proxy-Authorization stripping on cross-origin redirects and scheme downgrades, but has no coverage for Cookie, which is why the regression went unnoticed.

Proof of concept

java
import org.asynchttpclient.*;

AsyncHttpClient client = asyncHttpClient();

// trusted-api.com responds 302 -> https://evil.com
Request request = new RequestBuilder("GET")
        .setUrl("https://trusted-api.com/endpoint")
        .setHeader("Cookie", "session=abc123; csrf=xyz789; api_key=secret")
        .setHeader("Authorization", "Bearer token123")
        .build();

client.executeRequest(request).get();

// Request seen by evil.com after the redirect:
//   Authorization: <stripped>
//   Cookie:        session=abc123; csrf=xyz789; api_key=secret   <-- leaked

Impact

  • Session hijacking — leaked session cookies allow impersonation.
  • CSRF token theft — CSRF tokens carried in cookies are disclosed.
  • API key theft — API keys stored in cookies are disclosed.
  • Privacy — tracking identifiers leak to third-party origins.

Realistic attack paths:

  • Open-redirect in a trusted API endpoint.
  • Compromised CDN or API gateway injecting redirects.
  • MITM on a plaintext hop in the redirect chain.

Fix

Add COOKIE to the headers removed alongside AUTHORIZATION / PROXY_AUTHORIZATION on the security-boundary branch:

java
if (stripAuthorization) {
    headers.remove(AUTHORIZATION)
            .remove(PROXY_AUTHORIZATION)
            .remove(COOKIE);
} else if (realm != null && (realm.getScheme() == AuthScheme.NTLM
        || realm.getScheme() == AuthScheme.SCRAM_SHA_256)) {
    headers.remove(AUTHORIZATION)
            .remove(PROXY_AUTHORIZATION);
}

Note that the URI-scoped CookieStore will re-add any cookies that legitimately match the new target after propagatedHeaders returns, so legitimate cross-origin sessions tracked by the client are not broken.

Fixed in 3.0.10 and 2.15.0 by commit 3b0e3e9e.

Czego dotyczy

Kliknij technologię, aby zobaczyć wszystkie dotyczące jej podatności.

PlatformaPaczkaPodatne wersjePoprawka w wersji
Java / Kotlin (Maven) org.asynchttpclient:async-http-client >= 3.0.0.Beta1, < 3.0.10, >= 2.0.0, < 2.15.0 3.0.10, 2.15.0

Odnośniki

Ocena CVSS 7.4/10
Wektor CVSS
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:N/A:N
Słabość (CWE)
CWE-200
Platforma
Java / Kotlin (Maven)
Paczka
org.asynchttpclient:async-http-client
Ujawniono
18.05.2026
Aktualizacja
11.10.2026 13:20

Źródła i licencje

OSV / GitHub Advisory Database - GHSA-fmxf-pm6p-7xgm - CC BY 4.0

Historia podatności: org.asynchttpclient:async-http-client

Wszystkie opisane podatności tej paczki (Java / Kotlin (Maven)), od najnowszej. Widać, czy to jednorazowa wpadka, czy paczka, której trzeba pilnować.

Wszystkie (18) w archiwum
Wszystkich wpisów
18
Pierwsza → ostatnia
10.2018 10.2026
Bez poprawki
0
Wykorzystywana w atakach
0

Rozkład istotności

  • Krytyczna 2
  • Wysoka 6
  • Średnia 8
  • Niska 2

Ujawnienia w latach

  1. 2018: 1
  2. 2019: 0
  3. 2020: 0
  4. 2021: 0
  5. 2022: 0
  6. 2023: 0
  7. 2024: 1
  8. 2025: 0
  9. 2026: 16
Istotność:
  1. Wysoka · 7.4 CVE-2026-107230 >= 3.0.0, < 3.0.14, >= 2.0.0, <= 2.16.1 3.0.14
  2. Krytyczna CVE-2026-107282 >= 3.0.0, < 3.0.13, >= 2.0.0, < 2.16.1 3.0.13, 2.16.1
  3. Wysoka CVE-2026-107231 >= 3.0.0.Beta1, < 3.0.13, >= 2.0.0, < 2.16.1 3.0.13, 2.16.1
  4. Wysoka · 7.5 CVE-2026-85721 >= 3.0.0, < 3.0.12, >= 2.0.0, < 2.16.1 3.0.12, 2.16.1
  5. async-http-client: Cookie header not stripped on cross-origin redirect ten wpis
    Wysoka · 7.4 CVE-2026-45300 >= 3.0.0.Beta1, < 3.0.10, >= 2.0.0, < 2.15.0 3.0.10, 2.15.0
  6. Krytyczna CVE-2024-53990 >= 2.1.0, < 2.12.4, >= 3.0.0.Beta1, < 3.0.1 2.12.4, 3.0.1
  7. Wysoka · 7.5 CVE-2017-14063 < 2.0.35 2.0.35

Dowiedz się, które podatności dotyczą Twojej aplikacji

Po podłączeniu integracji DockRay i włączeniu raportowania oprogramowania DockRay porównuje zgłoszone wersje komponentów ze znanymi podatnościami i powiadamia o potwierdzonych dopasowaniach. Zakres zależy od obsługiwanej technologii i dostępnych biuletynów.

Podłącz swoją aplikację
Newsletter DockRay

Bezpieczeństwo aplikacji w Twojej skrzynce

Najważniejsze podatności, konkretne zalecenia i praktyczne wskazówki dla Twoich aplikacji. Wybierz technologie i śledź to, co ma znaczenie dla Twojego projektu.

  • Codzienne zestawienie nowych podatności, także krytycznych.
  • Powiadomienia o ważnych aktualizacjach.
  • Praktyczne porady o bezpieczeństwie i monitoringu aplikacji.

Pozostaw puste, aby otrzymywać informacje o wszystkich technologiach.

Zapis jest bezpłatny. Wypiszesz się jednym kliknięciem w wiadomości.