CVE-2026-88975
nicheUnauthenticated HTTP/2 Memory-Exhaustion DoS in http4s Ember
http4s Ember's HTTP/2 implementation buffers a frame's entire declared payload — up to 16 MiB, bounded only by the protocol's 24-bit length field — into contiguous memory before checking it against the advertised SETTINGS_MAX_FRAME_SIZE (16 KiB), because the validation in processFrame cannot run until the frame is fully assembled. An unauthenticated attacker triggers it simply by opening an HTTP/2 connection and declaring an oversized frame; no request, stream association, or credentials are required, and dribbling the payload without finishing evades rejection entirely since incomplete frames never reach validation. The result is uncontrolled resource consumption and remote denial of service by memory exhaustion — roughly 16 GiB of heap within reach at the default 1024 maxConnections — and the client side is symmetric because ember-client's readLoop shares the same code path. Only deployments explicitly built with .withHttp2 on ember-server or ember-client are affected; HTTP/2 is off by default on both builders. No public PoC exists, the CVE is not in CISA's KEV, and no exploitation in the wild is known.
What to do: Upgrade to a patched http4s release as soon as one is published (track http4s security advisories for CVE-2026-88975), since the flaw sits in ember-core's H2Frame/H2Connection read loop and cannot be fixed in application code. Until then, disable HTTP/2 on Ember (it is off by default) or terminate HTTP/2 at a reverse proxy that enforces frame-size limits and speak HTTP/1.1 to the backend. Note that lowering SETTINGS_MAX_FRAME_SIZE or setting withIdleTimeout provides no mitigation — the check runs only after buffering and dribbled frames make steady read progress — so also monitor heap usage on any HTTP/2 listeners you cannot yet disable.
| http4s ember-server | — |
| http4s ember-client | — |
Order-of-magnitude estimate by the model from install counts, market share and public scan data it knows; verify before quoting.
Http4s is a Scala interface for HTTP services. Prior to 0.23.37 and 1.0.0-M48, Ember’s HTTP/2 read loop parses a frame’s 24-bit declared length but waits to buffer the entire payload before comparing it with SETTINGS_MAX_FRAME_SIZE. An unauthenticated peer can declare a payload near 16 MiB on a connection where Ember advertised 16 KiB and either complete or slowly stream it, causing up to 1024-fold memory amplification per connection before processFrame can reject the frame. The shared H2Connection.readLoop affects withHttp2 servers and clients, while HTTP/2-disabled configurations are unaffected, and the patch rejects oversized frames before buffering their payloads. This issue is fixed in versions 0.23.37 and 1.0.0-M48.
- Ecosystems
- maven
- Weakness
- CWE-400
- Vector
- CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
- GHSA
- GHSA-gq9p-f254-h286 (high)
In the news0 stories
No ingested article mentions this CVE yet.