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-54556

CVE-2026-54556: Heap Exhaustion and Denial of Service in http4s Ember HTTP/2 Backend via HPACK Bomb

Amit Schendel
Amit Schendel
Senior Security Researcher

Aug 27, 2026·6 min read·47 visits

Executive Summary (TL;DR)

The http4s Ember HTTP/2 backend is vulnerable to HPACK bomb attacks (CWE-409), allowing remote, unauthenticated attackers to trigger heap exhaustion and crash the server via highly compressed header payloads. This is addressed in versions 0.23.35 and 1.0.0-M47.

CVE-2026-54556 is a high-severity Denial of Service (DoS) vulnerability impacting the Ember HTTP/2 backend of http4s, a popular functional Scala interface for HTTP services. The vulnerability arises from an improper handling of highly compressed HPACK header blocks, which enables unauthenticated remote attackers to trigger severe memory amplification and crash the JVM runtime via an OutOfMemoryError.

Vulnerability Overview

The Ember HTTP/2 backend is a major component of the http4s ecosystem, which serves as a purely functional, type-safe HTTP interface for Scala applications. Security researchers and developers deploy Ember in highly concurrent production environments due to its lightweight design and integration with the Cats Effect runtime. Because the HTTP/2 protocol supports persistent multiplexed connections, exposing this port directly to the internet exposes a substantial attack surface.

The core vulnerability classified under CWE-409 (Improper Handling of Highly Compressed Data) manifests when the server attempts to parse HPACK-encoded HTTP/2 headers. Unauthenticated remote clients can exploit this process by delivering highly optimized compression payloads. The lack of proactive, size-based evaluation during the early stages of header expansion leads to significant data amplification.

By transmitting carefully structured compression blocks, an attacker forces the backend to expand minimal network frames into massive heap allocations. This uncontrolled expansion bypasses the standard header limit checks implemented at higher layers of the protocol stack. The final consequence of this execution flow is severe application-wide denial of service, rendering the Scala application unresponsive.

Root Cause Analysis

To understand the vulnerability, one must examine the mechanics of HPACK compression as defined in RFC 7541. HPACK reduces metadata overhead by utilizing both a static table of standard headers and a stateful dynamic table updated per connection. Rather than transmitting repetitive ASCII character sequences, HTTP/2 endpoints send lightweight integer indexes referencing previously declared strings.

Prior to the patch, the http4s Ember HPACK wrapper processed incoming header streams by calling Decoder.decode(is, listener) and storing the resulting name-value pairs directly in memory. The core defect lied in how the wrapper tracked the total payload size during decompression. It verified the physical frame size and literal string lengths, but it did not compute the decompressed footprint of indexed elements.

Furthermore, the original implementation failed to incorporate the mandatory 32-byte per-header overhead required by RFC 7540 and RFC 7541. This overhead represents the structural memory allocation required to track metadata fields within an operational HTTP/2 engine. Because the engine ignored both indexed string growth and structural overhead, an attacker could pack thousands of virtual headers into a few network bytes, leading to catastrophic heap allocation.

Code Analysis

The vulnerability was resolved in commit 6e8eccd64a6a74ab4811897881e95e0e1b3a818e by rewriting the decompression loop in Hpack.scala. The patched implementation now dynamically aggregates the total decompressed memory footprint inside the HeaderListener callback before assigning objects to the heap. If the running sum exceeds the configured maxHeaderListSize, the process terminates immediately and throws an error.

The following code comparison demonstrates the transition from vulnerable to secure tracking:

// Vulnerable Implementation (Implicitly trusting decoded data sizes)
val listener = new HeaderListener {
  def addHeader(name: Array[Byte], value: Array[Byte], sensitive: Boolean): Unit = {
    // Missing: Tracking of indexed sizes and structural overhead
    buffer.+=
      new String(name, StandardCharsets.ISO_8859_1) -> new String(value, StandardCharsets.ISO_8859_1)
  }
}
 
// Patched Implementation (Active tracking and inline enforcement)
var decodedSize = 0L
val listener = new HeaderListener {
  def addHeader(name: Array[Byte], value: Array[Byte], sensitive: Boolean): Unit = {
    // Enforce RFC 7541 32-byte overhead per entry to prevent amplification
    decodedSize += name.length + value.length + 32
    if (decodedSize > maxHeaderListSize) {
      throw EmberException.MessageTooLong(maxHeaderListSize.toInt)
    }
    buffer.+=
      new String(name, StandardCharsets.ISO_8859_1) -> new String(value, StandardCharsets.ISO_8859_1)
  }
}

The patch is technically complete because it combines early inline validation with structural byte tracking. By aborting execution inside the callback, the engine prevents the JVM from allocating massive heap objects for malicious payloads. Furthermore, complementary changes in H2Connection.scala establish connection timeouts to mitigate slow-rate continuation frame attacks.

Exploitation Methodology

Exploitation requires no special privileges and can be achieved on any exposed Ember HTTP/2 endpoint. The adversary must first establish an HTTP/2 session and perform the standard handshakes, negotiation, and setting exchanges. The target connection must remain open during the priming phase.

During the priming phase, the attacker sends multiple legitimate requests containing long, custom headers filled with randomized data. The server processes these requests and stores the massive strings inside the stateful HPACK dynamic table associated with that specific connection. Once the dynamic table is filled to capacity, the server is primed for the amplification phase.

Finally, the attacker transmits a single HTTP/2 HEADERS frame, followed by multiple CONTINUATION frames, consisting solely of index references to the newly stored large values. Upon receiving these frames, the server's HPACK engine dereferences the compact integer values, multiplying the memory requirements exponentially. The JVM immediately attempts to allocate gigabytes of raw strings, exhausting the garbage collector and halting the application.

Impact Assessment

The security impact of CVE-2026-54556 is classified as high-severity denial of service with a CVSS score of 8.2. An OutOfMemoryError in a JVM environment is an exceptionally destructive condition because it corrupts the stability of the entire process. Active worker threads crash, shared lock structures fail, and the runtime environment frequently enters an unrecoverable state.

In containerized deployments, such as Kubernetes clusters, an OOM event can cause the container to freeze without releasing its network ports. This state prevents active liveness probes from diagnosing the failure, leading to prolonged outages before automatic recovery processes can kick in. This vulnerability represents an efficient weapon for distributed or single-source denial of service attacks.

The CVSS v4.0 vector highlights the remote, low-complexity nature of this threat. While confidentiality and integrity remain unaffected, system availability is completely compromised. Given the simplicity of generating HPACK bomb payloads, exposed servers face severe operational risk if left unpatched.

Remediation & Defensive Design

Remediation requires upgrading the http4s dependency to version 0.23.35 or 1.0.0-M47. These versions integrate the patched Hpack.scala logic, establishing a reliable defense against memory amplification. Development teams should audit their build configuration files (such as build.sbt) to ensure transitive dependencies are fully resolved to the secure versions.

In scenarios where immediate dependency upgrades are not feasible, temporary workarounds can mitigate the risk. Administrators should disable HTTP/2 support on the Ember backend, forcing clients to negotiate HTTP/1.1 connections which do not rely on HPACK. Alternatively, deploying a hardier reverse proxy, such as Nginx or HAProxy, in front of the application can filter out malformed or overly large header sequences.

Furthermore, JVM-level flags should be tuned to handle heap exhaustion events gracefully. Specifying -XX:+CrashOnOutOfMemoryError or -XX:+ExitOnOutOfMemoryError ensures that the JVM process terminates cleanly when heap exhaustion occurs, enabling automated orchestrators to deploy fresh, healthy instances immediately.

Official Patches

http4sFix commit implementing active HPACK size decoding checks and timeouts.
http4sOfficial release release page containing the fix in 0.23.x.
http4sOfficial release release page containing the fix in 1.0.x.

Fix Analysis (1)

Technical Appendix

CVSS Score
8.2/ 10
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N

Affected Systems

http4s-ember-core_2.12http4s-ember-core_2.13http4s-ember-core_3

Affected Versions Detail

Product
Affected Versions
Fixed Version
http4s-ember-core
org.http4s
< 0.23.350.23.35
http4s-ember-core
org.http4s
>= 1.0.0-M1, < 1.0.0-M471.0.0-M47
AttributeDetail
CWE IDCWE-409 (Data Amplification)
Attack VectorNetwork (Remote, Unauthenticated)
CVSS Score8.2 (High)
Exploit StatusNone (No public PoC or active exploitation)
CISA KEV StatusNot Listed
Primary ImpactDenial of Service (JVM Heap Exhaustion via OOM)
Affected ComponentsEmber HTTP/2 backend in http4s-ember-core

MITRE ATT&CK Mapping

T1499.003Endpoint Denial of Service: Application Exhaustion
Impact
T1499.004Endpoint Denial of Service: Application Complexity Exploitation
Impact
CWE-409
Improper Handling of Highly Compressed Data (Data Amplification)

The product receives compressed input data and decompresses it, but it does not adequately limit the size of the decompressed output, allowing an attacker to consume excessive system resources (such as memory) by sending highly compressed payloads (amplification).

Vulnerability Timeline

Release preparation for the 1.0.0-M46 release branch begins.
2025-10-02
Vulnerability fix authored and committed by Justin Reardon.
2026-06-29
CVE-2026-54556 is officially published and GHSA-vmm3-xgcx-67hm is publicly disclosed.
2026-08-26

References & Sources

  • [1]GitHub Security Advisory GHSA-vmm3-xgcx-67hm
  • [2]Vulnerability Patch Commit
  • [3]Release Tag v0.23.35
  • [4]Release Tag v1.0.0-M47
  • [5]Official CVE Record (CVE.org)
  • [6]National Vulnerability Database (NVD)

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

•14 minutes ago•CVE-2026-114132
6.3

CVE-2026-114132: Case-Sensitivity Route Rule Bypass in Nuxt Framework

Nuxt versions prior to 4.6.2 suffer from a route rule bypass vulnerability caused by an architectural mismatch in case-sensitivity handling between the Nitro server runtime and the Vue page router. An unauthenticated remote attacker can bypass server-enforced route directives—such as redirects, security headers, and SSR controls—by altering character casing in HTTP request paths.

Amit Schendel
Amit Schendel
1 views•6 min read
•about 1 hour ago•GHSA-78G4-XQWV-Q3G8
7.5

GHSA-78G4-XQWV-Q3G8: Heap-Based Buffer Overflow in Pillow (libopenjp2)

A heap-based buffer overflow vulnerability in Pillow PyPI binary wheels (versions 11.1.0 to 12.x) allows remote code execution or application crash via crafted JPEG 2000 files processed by the bundled libopenjp2 library.

Alon Barad
Alon Barad
13 views•4 min read
•about 2 hours ago•CVE-2026-109618
9.8

CVE-2026-109618: Remote Code Execution in PHP Core via Out-of-Memory longjmp() Uninitialized Memory Access

CVE-2026-109618 (dubbed PHP2Shell) is a critical vulnerability in the PHP engine core resulting from improper out-of-memory exception handling via longjmp(). When request allocation fails mid-processing, non-local control flow bypasses cleanup procedures, leaving memory structures uninitialized or in a use-after-free state during request shutdown.

Amit Schendel
Amit Schendel
9 views•5 min read
•about 2 hours ago•CVE-2026-109619
9.2

CVE-2026-109619: Remote Code Execution in PHP Core via Stale Global State Memory Corruption (PHP2Shell)

CVE-2026-109619 (PHP2Shell) is a critical Use-After-Free vulnerability in the core PHP engine caused by improper global state cleanup during out-of-memory exception handling across persistent worker requests.

Alon Barad
Alon Barad
10 views•6 min read
•about 2 hours ago•CVE-2026-113721
4.5

CVE-2026-113721: Unsafe Link Resolution in virtualenv File Generation

In Python virtualenv prior to version 21.14.9, activation script generators and configuration writers use Path.exists() before writing files. Because Path.exists() resolves symbolic links, it returns False for dangling symlinks. Consequently, virtualenv skips unlinking pre-planted symbolic links or hard links, writing data directly to target locations outside the intended virtual environment directory.

Amit Schendel
Amit Schendel
3 views•5 min read
•10 days ago•CVE-2026-87697
8.8

CVE-2026-87697: Untrusted Deserialization in .NET PresentationCore Clipboard Handling

A remote code execution vulnerability exists in Microsoft .NET due to untrusted data deserialization within the PresentationCore component. The flaw stems from implicit auto-conversion flags during clipboard data retrieval operations.

Alon Barad
Alon Barad
31 views•5 min read