CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-69216

CVE-2026-69216: HTTP Request/Response Smuggling in http4s Ember Parser

Amit Schendel
Amit Schendel
Senior Security Researcher

Sep 16, 2026·5 min read·16 visits

Executive Summary (TL;DR)

A lenient HTTP chunk decoder in the http4s Ember server allows TE.TE request and response smuggling attacks when combined with strict upstream reverse proxies.

An HTTP Request/Response Smuggling vulnerability (CVE-2026-69216) was identified in the Ember chunked transfer encoding decoder of the http4s Scala library. Due to parser leniency accepting sign prefixes, surrounding whitespace, and missing trailing CRLFs, attackers can bypass proxy security boundaries, poison shared caches, or hijack request queues.

Vulnerability Overview

CVE-2026-69216 defines a protocol parsing vulnerability within the Ember HTTP server and client components of http4s, a modular, functional Scala interface for HTTP services. The vulnerability lies within the chunked transfer encoding parsing engine, which handles data streams with the Transfer-Encoding: chunked header. This implementation is packaged within the http4s-ember-core library.\n\nThe issue stems from a structural divergence between how Ember handles chunked transport boundaries and how front-end proxies enforce the RFC 9112 specification. An unauthenticated remote attacker can exploit this discrepancy to construct HTTP Request Smuggling (specifically TE.TE request smuggling) or Response Smuggling attacks.\n\nWhen an intermediary reverse proxy is configured to route traffic to an http4s backend, the differences in parsing behavior allow an attacker to desynchronize the connection state. This desynchronization can be leveraged to execute unauthorized operations, poison web application caches, or capture sensitive user requests.

Root Cause Analysis

The RFC 9112 specification defines strict parsing requirements for chunked transfer coding. Specifically, Section 7.1 dictates that the chunk-size token must consist exclusively of one or more hexadecimal digits, without any signs or leading/trailing whitespace. Furthermore, each segment of chunked data must be immediately followed by a carriage return line feed (CRLF) sequence.\n\nThe vulnerable Ember implementation in ChunkedEncoding.scala failed to meet these specifications in three ways. First, the parser extracted the chunk size substring and applied the .trim operation to it, stripping all surrounding whitespace. Second, the trimmed string was passed to Java's java.lang.Long.parseLong(..., 16), which natively tolerates leading plus (+) or minus (-) symbols.\n\nThird, the decoder failed to strictly validate that a CRLF sequence directly followed the parsed chunk data. Instead, the implementation relied on a lenient leading-CRLF strip when commencing the parsing of the subsequent chunk header. This allowed missing or duplicated delimiters to go unnoticed by the backend while stricter proxies parsed them differently.

Code Analysis

In the vulnerable version of ChunkedEncoding.scala, chunk headers were decoded using the readChunkedHeader function, which processed incoming byte vectors as shown below:\n\nscala\n// VULNERABLE CODE\nprivate def readChunkedHeader(hdr: ByteVector): Option[Long] =\n hdr.decodeUtf8.toOption.flatMap { s =>\n val parts = s.split(';') // Ignore extensions\n if (parts.isEmpty) None\n else\n try Some(java.lang.Long.parseLong(parts(0).trim, 16))\n catch { case NonFatal(_) => None }\n }\n\n\nThe patch implemented in commit d78612a5abd5a2547487598d3342be05573e16f0 addresses these weaknesses by enforcing explicit hex validations. It discards the unsafe .trim and Java's default sign parsing behavior, and instead checks every character against a strict hex predicate:\n\nscala\n// PATCHED CODE\nprivate def readChunkedHeader(hdr: ByteVector): Option[Long] =\n hdr.decodeUtf8.toOption.flatMap { s =>\n val size = s.takeWhile(_ != ';') // Ignore any chunk-ext\n if (size.nonEmpty && size.forall(CharPredicate.HexDigit))\n try Some(java.lang.Long.parseLong(size, 16))\n catch { case NonFatal(_) => None }\n else None\n }\n\n\nFurthermore, the patch introduces a requireCrlf check to enforce that the trailing CRLF delimiter is present immediately after the chunk data, preventing the parser from skipping missing delimiters:\n\nscala\n// ENFORCED TRAILING CRLF IN PATCH\ndef requireCrlf(buf: ByteVector): Pull[F, Byte, Unit] =\n if (buf.size < crlf.size)\n Pull.eval(read).flatMap {\n case None => Pull.raiseError[F](EmberException.ReachedEndOfStream())\n case Some(c) => requireCrlf(buf ++ c.toByteVector)\n }\n else if (buf.startsWith(crlf))\n go(Left(ByteVector.empty), buf.drop(crlf.size))\n else\n Pull.raiseError[F](\n EmberException.ChunkedEncodingError(\"Expected CRLF after chunk data\")\n )\n

Exploitation Methodology

Exploitation of CVE-2026-69216 requires an environment where an intermediate proxy and an http4s backend communicate over persistent TCP connections. The attacker crafts a request with a Transfer-Encoding: chunked header containing syntactically malformed chunk-size fields that the proxy passes through but the backend accepts.\n\nmermaid\ngraph LR\n A[\"Attacker Client\"] -->|\"Malformed request with +5 or trailing spaces\"| B[\"Reverse Proxy\"]\n B -->|\"Forwarded TCP Stream\"| C[\"http4s Backend (Lenient Parser)\"]\n C -->|\"Parses +5 as 5, leaving residual stream\"| D[\"Socket Buffer (Smuggled Request)\"]\n\n\nFor instance, an attacker might submit a chunk size of +5 or 5 . A strict front-end proxy might not modify this boundary but simply forward the stream, or it may interpret the boundary size differently if it does not parse signs. The http4s backend, using Long.parseLong(\"+5\", 16), treats it as a decimal value of 5, reads the chunk data, and then fails to validate the trailing CRLF, leaving subsequent request data buffered on the connection.\n\nWhen a subsequent user transmits a normal request over the same shared connection, the http4s server prepends the leftover buffered bytes to that user's incoming request. The server then executes the combined request under the authority of the victim, leading to request queue hijacking or credential extraction.

Impact Assessment

The impact of this vulnerability is classified as medium severity with a CVSS v3.1 base score of 5.4. The attack vector is Network (AV:N), the attack complexity is High (AC:H), and privileges required are None (PR:N). Scope is changed (S:C) because exploitation modifies the state of downstream shared caches and proxy connections.\n\nA successful attack allows the bypass of security controls deployed at the proxy layer, such as route restrictions or WAF rules. Because smuggled requests bypass proxy validation, restricted endpoints can be accessed directly.\n\nAdditionally, this vulnerability facilitates web cache poisoning. By smuggling a request that triggers a specific response, an attacker can manipulate caching proxies to cache malicious content for legitimate URLs, distributing arbitrary scripts to other application users.

Remediation & Mitigation

The primary remediation strategy is to upgrade all http4s installations using the Ember component to secure versions. For the 0.23.x release line, the issue is resolved in 0.23.35. For the 1.0.0 milestone line, the issue is resolved in 1.0.0-M47.\n\nIf upgrading is not immediately feasible, operators should implement intermediate mitigations at the proxy or network level. Reverse proxies should be configured to re-encode or normalize chunked transfer encoding requests, which strips invalid trailing whitespace and signs prior to backend forwarding.\n\nAlternatively, migrating public-facing endpoints to HTTP/2 or HTTP/3 effectively neutralizes the issue. Because these modern protocols use binary framing to delimit length rather than character-based chunk separators, the parsing weaknesses present in the text-based chunked parser cannot be triggered.

Fix Analysis (1)

Technical Appendix

CVSS Score
5.4/ 10
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:C/C:L/I:L/A:N

Affected Systems

http4s Ember Corehttp4s Ember Serverhttp4s Ember Client

Affected Versions Detail

Product
Affected Versions
Fixed Version
http4s-ember-core
Typelevel
< 0.23.350.23.35
http4s-ember-core
Typelevel
>= 1.0.0-M1, < 1.0.0-M471.0.0-M47
AttributeDetail
CWE IDCWE-444
Attack VectorNetwork (AV:N)
CVSS Score5.4 (Medium)
EPSS ScoreNot yet calculated
ImpactRequest/Response Smuggling, Cache Poisoning, Bypass of Proxy Controls
Exploit StatusNone/PoC
KEV StatusNot Listed

MITRE ATT&CK Mapping

T1190Exploit Public-Facing Application
Initial Access
CWE-444
Inconsistent Interpretation of HTTP Requests ('HTTP Request/Response Smuggling')

The application does not properly parse or validate HTTP request headers, boundaries, or transfer encodings in a manner consistent with RFC standards, leading to discrepancies when parsed by upstream devices.

References & Sources

  • [1]GHSA-jrpm-956j-96jg: http4s-ember-core Request Smuggling
  • [2]Ember core fix commit d78612a5
  • [3]NVD - CVE-2026-69216
  • [4]http4s Release v0.23.35
  • [5]http4s Release v1.0.0-M47

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•about 2 hours ago•CVE-2026-119282
7.3

CVE-2026-119282: OS Command Injection via Plugin Options in Nx (@nx/maven and @nx/gradle)

An OS command injection and argument injection vulnerability exists in the Nx build system and its official Maven (@nx/maven) and Gradle (@nx/gradle) plugins. When constructing the project dependency graph, the plugins invoke underlying Java build wrappers via subshells while interpolating unsanitized plugin options directly from nx.json into the command arguments. An attacker who supplies a crafted nx.json file via a repository or pull request can execute arbitrary shell commands with the privileges of the user or CI/CD runner invoking any Nx command that computes the project graph.

Amit Schendel
Amit Schendel
4 views•10 min read
•about 3 hours ago•CVE-2026-59978
7.5

CVE-2026-59978: Persistent Denial of Service via Array Injection in AdminNeo

AdminNeo versions 4.6.2 through 5.4.1 contain an improper input validation vulnerability (CWE-20) in the version verification endpoint (?script=version). An unauthenticated remote attacker can submit a crafted HTTP POST request containing an array parameter for 'version', which is serialized into a shared server-side temporary cache file without type checking or authentication. On subsequent requests, the application deserializes this cached array and passes it to cookie() and rawurlencode(), triggering an uncaught fatal TypeError in PHP 8.x environments and causing a persistent 24-hour Denial of Service (DoS) for all users.

Amit Schendel
Amit Schendel
4 views•8 min read
•about 4 hours ago•GHSA-FGXM-5HVV-X4VH
5.3

GHSA-fgxm-5hvv-x4vh: Private Repository Enumeration via Go Module Discovery and HTTP Response Discrepancies in Soft Serve

Charmbracelet Soft Serve versions 0.5.0 through 0.12.2 contain an authorization bypass and observable response discrepancy vulnerability in the HTTP Git server. Remote attackers can determine the existence, exact names, and clone URLs of private repositories by issuing crafted Go remote import path discovery requests (?go-get=1) or by observing differential HTTP status codes across Git Smart HTTP, Dumb HTTP, and Git LFS endpoints.

Alon Barad
Alon Barad
5 views•12 min read
•about 5 hours ago•GHSA-F3FJ-9625-RV3M
5.9

GHSA-f3fj-9625-rv3m: Race Condition in Soft Serve Repository Cache Invalidation

A Time-of-Check to Time-of-Use (TOCTOU) race condition in Charmbracelet Soft Serve versions 0.6.0 through 0.12.2 allows unauthenticated users to retain read access to repositories after their visibility is changed from public to private. The flaw stems from premature cache invalidation in the SetPrivate method prior to committing the visibility update to the underlying database. Concurrent read requests arriving during the database transaction window repopulate the non-expiring in-memory LRU cache with stale public metadata, bypassing access controls across HTTP, SSH, and Git protocols until the server process is restarted.

Alon Barad
Alon Barad
4 views•10 min read
•about 6 hours ago•CVE-2026-119283
7.5

CVE-2026-119283: Unbounded JWE Recipients Array Causes CPU Exhaustion in Authlib joserfc

A resource consumption vulnerability exists in the Authlib joserfc Python library prior to version 1.7.5. When processing JSON Web Encryption (JWE) objects formatted using General JSON Serialization, the library fails to enforce an upper bound on the number of elements within the recipients array. An unauthenticated attacker can supply a JWE containing thousands of recipient entries targeting an RSA key management algorithm, forcing the server to perform an equivalent number of computationally expensive RSA private-key decryption operations per request and exhausting available CPU resources.

Alon Barad
Alon Barad
4 views•9 min read
•about 7 hours ago•CVE-2026-119284
6.9

CVE-2026-119284: Uncontrolled Resource Consumption in joserfc Compact Deserialization

CVE-2026-119284 (GHSA-9pg5-8c7x-5hfx) is an uncontrolled resource consumption vulnerability (CWE-400) in the compact serialization deserialization routines of joserfc prior to version 1.7.6. The library enforced individual segment size limits only after invoking Python's bytes.split(b'.') on untrusted input tokens. By sending oversized compact JWS or JWE tokens, an unauthenticated remote attacker can force the Python interpreter to duplicate and allocate memory for every segment before size validation executes, resulting in memory exhaustion and an Endpoint Denial of Service (DoS).

Amit Schendel
Amit Schendel
8 views•10 min read