GHSA-3wp9-xfwm-rjjf: Medium severity maven/org.asynchttpclient:async-http-client vulnerability
Impact When a ws:// request is routed through an HTTP proxy with proxy authentication configured, the client tunnels the connection with an HTTP CONNECT, the same as it does for https://. Once the tunnel is open, the WebSocket upgrade request that follows is sent through the tunnel directly to the origin server, not to the proxy. The proxy-auth gate and the companion request-target selection keyed only on whether the URI was secured, which is false for ws://, so the tunnelled upgrade request incorrectly carried the proxy's Proxy-Authorization header and an absolute-form request target meant for the proxy. Any origin server reached over a proxied ws:// connection, or anyone positioned on the origin side of the wire, could recover the proxy credentials: directly for Basic, or as a replayable and offline-crackable response for Digest.
Affected versions 3.x: up to and including 3.0.11 2.x: up to and including 2.16.0
Patches Fixed in 3.0.12 on the 3.x line and in 2.16.1 on the 2.x line. The preemptive Proxy-Authorization header and the absolute-form request target are no longer attached to a tunnelled ws:// upgrade; a ws:// request is now treated like wss://.
Workarounds Do not use proxy authentication together with ws:// requests through an HTTP proxy, or use wss:// instead.
Details The proxy-auth gate in NettyRequestFactory#newNettyRequest and the sibling branch in requestUri() did not exclude WebSocket URIs, even though the CONNECT-tunnelling check in NettyRequestSender already tunnels ws:// through CONNECT exactly like https://.
Note that 3.0.12 is itself affected by a separate issue, GHSA-rqf5-2wxv-rjf4, where a Digest challenge the client cannot read downgrades to Basic and sends the password in cleartext. Upgrade to 3.0.13 to pick up both fixes.
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Upgrade
Upgrade
maven/org.asynchttpclient:async-http-clientto a version that resolves this vulnerability.Fixed in 2.16.1 - Upgrade
Upgrade
maven/org.asynchttpclient:async-http-clientto a version that resolves this vulnerability.Fixed in 3.0.12 - Upgrade
Upgrade to a fixed release to a version that resolves this vulnerability.
Fixed in 3.0.13 - Upgrade
Upgrade to a fixed release to a version that resolves this vulnerability.
Fixed in 2.16.1 - Compensating control
Do not use proxy authentication with ws:// requests through an HTTP proxy; use wss:// instead.
Event History
Frequently Asked Questions
Which deployments are exposed?
Deployments are exposed when AsyncHttpClient sends ws:// WebSocket requests through an HTTP proxy configured with proxy authentication. The issue affects connections that create an HTTP CONNECT tunnel before sending the WebSocket upgrade request.
What could an attacker obtain?
The origin server, or a party positioned on the origin side of the tunneled connection, could recover proxy credentials. Basic credentials could be recovered directly, while Digest responses could be replayed or cracked offline.
Which versions need to be upgraded?
Affected releases are AsyncHttpClient 3.x through 3.0.11 and 2.x through 2.16.0. Upgrade to 3.0.12 on the 3.x line or 2.16.1 on the 2.x line.
What changes after applying the fix?
Tunnelled ws:// upgrade requests no longer include the preemptive Proxy-Authorization header or the absolute-form request target intended for the proxy. ws:// requests are treated like wss:// requests for this behavior.