HTTP Request Smuggling Vulnerability in http4s Ember
The http4s Ember HTTP/1.1 parser fails to reject messages containing both 'Transfer-Encoding' and 'Content-Length' headers, enabling CL.TE request smuggling attacks.
CVE search metadata
CVE search record: CVE-2026-69204. KEV: no. Product: http4s-ember-core (<= 0.23.34), http4s-ember-core (1.0.0-M1 - 1.0.0-M46), http4s-ember-core (<= 0.23.36), http4s-ember-core (1.0.0-M1 - 1.0.0-M47), http4s-ember-core (<= 0.23.34, >= 1.0.0-M1 and <= 1.0.0-M46), http4s-ember-core (>= 1.0.0-M1, <= 1.0.0-M46). Brief: HTTP Request Smuggling Vulnerability in http4s Ember. Brief link: https://feed.craftedsignal.io/briefs/2026-09-http4s-ember-smuggling/
What's new
- 1. added coverage for http4s-ember-core (<= 0.23.34) +1 products Sep 16, 01:06 via ghsa
- 2. added coverage for http4s-ember-core (<= 0.23.34) +1 products Sep 16, 01:06 via ghsa
- 3. added coverage for http4s-ember-core (<= 0.23.34, >= 1.0.0-M1 and <= 1.0.0-M46) Sep 16, 01:05 via ghsa
- 4. added coverage for http4s-ember-core (<= 0.23.36) +1 products Sep 16, 01:05 via ghsa
The http4s Ember HTTP/1.1 parser (CVE-2026-69204) fails to comply with RFC 9112 §6.1, which mandates that servers treat any HTTP/1.1 message containing both 'Transfer-Encoding' and 'Content-Length' headers as a framing error and close the connection. Because Ember accepts both, discrepancies arise when it is deployed behind an intermediary that frames the request based on 'Content-Length' while Ember frames based on 'Transfer-Encoding' (chunked). This desynchronization creates a CL.TE request smuggling condition. Attackers can exploit this to perform request smuggling, bypassing authentication filters, performing cross-user request hijacking, or poisoning backend caches. The vulnerability affects both 'ember-server' (origin) and 'ember-client' (response processing), with the latter vulnerable to desynchronization from a malicious upstream source.
Attack Chain
- Attacker crafts a malicious HTTP/1.1 request containing both 'Transfer-Encoding: chunked' and a 'Content-Length' header.
- Attacker sends the request to the intermediary load balancer or reverse proxy sitting in front of the target Ember server.
- The intermediary processes the 'Content-Length' header, framing the request body accordingly, and forwards the entire packet to the backend Ember server.
- The backend Ember server, ignoring the 'Content-Length' header in favor of 'Transfer-Encoding', parses the request as chunked.
- The Ember server interprets only the first chunk of the request, leaving the remainder of the payload in the socket buffer.
- The residual data in the socket buffer is interpreted by the Ember server as the prefix of the next legitimate user request sent over the same keep-alive connection.
- Ember processes the smuggled data as a separate request, achieving unauthorized execution or security bypass.
Impact
Successful exploitation allows for critical security impacts, including the bypassing of front-end security policies, unauthorized cross-user request hijacking, and HTTP cache poisoning. These impacts are most severe in architectures where Ember handles keep-alive backend connections from an intermediary that does not strictly sanitize request headers.
Recommendation
- Upgrade http4s-ember-core to a non-vulnerable version as soon as patches become available to address CVE-2026-69204.
- Configure upstream intermediaries to strictly reject HTTP/1.1 requests containing both 'Transfer-Encoding' and 'Content-Length' headers.
- Ensure intermediaries buffer and re-encode request bodies to normalize framing before sending them to the backend server.
- Disable keep-alive connections between the intermediary and the Ember backend if immediate patching is not possible.
- Implement web application firewall (WAF) rules to detect and drop HTTP requests containing duplicate or conflicting framing headers.
Immediate actions
Upgrade http4s-ember-core to 0.23.35 or later
Mitigations
Configure upstream intermediaries to reject conflicting Transfer-Encoding and Content-Length headers
CVE-2026-69204