CVE-2026-69210
Infinite-loop DoS in http4s Ember WebSocket decoder via negative payload length
http4s, a functional HTTP toolkit for Scala, contains a denial-of-service flaw in its WebSocket FrameTranscoder.bodyLength logic in versions prior to 0.23.35 and 1.0.0-M47. The decoder rejects extended payload lengths above Integer.MAX_VALUE but fails to validate negative 64-bit lengths, so a remote client that completes a WebSocket handshake against an http4s Ember server can send such a frame, causing the decoder to return an empty frame without consuming input. The decode loop then spins indefinitely, pinning a worker at full CPU and growing an ArrayBuffer without bound until the process is exhausted. Any service built on an affected http4s version that exposes Ember WebSocket endpoints to untrusted clients is vulnerable; no authentication or user interaction is required. The issue is fixed in 0.23.35 and 1.0.0-M47, and no public proof of concept or exploitation in the wild is known.
What to do: Upgrade to http4s 0.23.35 on the 0.23.x line or 1.0.0-M47 on the 1.0 milestone line. If upgrading is not immediately feasible, disable WebSocket endpoints on Ember servers or block WebSocket upgrade requests at the reverse proxy or load balancer. Monitor for workers pinned at 100% CPU or unbounded heap growth immediately following WebSocket handshakes from untrusted clients.
| http4s (Ember server / WebSocket FrameTranscoder) | all versions prior to 0.23.35 |
| http4s (Ember server / WebSocket FrameTranscoder) | 1.0.0 milestone versions prior to 1.0.0-M47 |
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.35 and 1.0.0-M47, WebSocket FrameTranscoder.bodyLength rejects extended payload lengths above Integer.MAX_VALUE but permits negative 64-bit lengths. A remote client that completes a WebSocket handshake through an Ember server can send such a frame, causing the decoder to return an empty frame without advancing its input. The decode loop then runs indefinitely, pins a worker at full CPU, and grows an ArrayBuffer without bound, resulting in denial of service. This issue is fixed in versions 0.23.35 and 1.0.0-M47.
- Weakness
- CWE-835, CWE-1284
- Vector
- CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
In the news0 stories
No ingested article mentions this CVE yet.