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

CVE-2026-49754: Denial of Service via Unbounded HTTP/2 CONTINUATION Frame Accumulation in Elixir Mint

Amit Schendel
Amit Schendel
Senior Security Researcher

Jul 10, 2026·6 min read·14 visits

Executive Summary (TL;DR)

An unauthenticated, remote attacker can crash any Elixir application utilizing the Mint client library to establish HTTP/2 connections by hosting a malicious server that streams an infinite series of HTTP/2 CONTINUATION frames.

An allocation of resources without limits or throttling vulnerability in Elixir Mint allows an attacker-controlled HTTP/2 server to exhaust memory in a Mint client. The vulnerability is exploited by sending a HEADERS frame without the END_HEADERS flag followed by an infinite stream of CONTINUATION frames. Because the client lacks limits on the incoming header-block accumulator, the client continuously consumes memory until an out-of-memory crash occurs.

Vulnerability Overview

The Mint library is an HTTP/1 and HTTP/2 client for Elixir, widely used within the Erlang Ecosystem for low-level protocol management. During HTTP/2 processing, Mint relies on a state machine to parse incoming streams. One of the core mechanics of HTTP/2 is frame-based multiplexing, which includes dividing large header sets across multiple frames using the CONTINUATION frame format.

Under normal execution, if a HEADERS or PUSH_PROMISE frame exceeds the maximum allowed payload size, the server clears the END_HEADERS flag and transmits the remaining block inside successive CONTINUATION frames. The client is obligated to buffer these unparsed fragments until it receives a CONTINUATION frame containing the END_HEADERS flag. This design introduces an attack surface where a peer can send frames indefinitely without closing the sequence.

In vulnerable versions of Mint (versions 0.1.0 up to 1.9.0), the parser did not enforce boundaries on the size or count of incoming CONTINUATION frames. This omission allows an attacker-controlled server to trigger a denial of service (DoS). A single connection to an attacker-controlled HTTP/2 endpoint is sufficient to exhaust the memory of the client host, causing a crash of the entire Erlang Virtual Machine.

Root Cause Analysis

The root cause of CVE-2026-49754 is classified under CWE-770 (Allocation of Resources Without Limits or Throttling). When the Mint HTTP/2 engine processes a HEADERS frame without the END_HEADERS flag, it initiates a holding structure in the connection state. The unparsed fragment is saved in the conn.headers_being_processed tuple, awaiting the completion of the header block.

For each subsequent CONTINUATION frame received on that stream, Mint appends the new raw binary data to an accumulator list (iolist). The state machine relies on the default value of the :max_header_list_size configuration to define processing boundaries. In vulnerable releases, this configuration defaulted to :infinity for the receive path, and validation was only performed on outbound requests rather than inbound header blocks.

Because the receiver lacks an upper bound checking mechanism during accumulation, an attacker can stream an endless sequence of CONTINUATION frames. Each frame can contain up to the maximum negotiated payload size, typically 16 KiB. As the client process structures these pieces into an internal nested list, the memory consumption of the host Erlang VM process grows linearly with each frame, eventually triggering a kernel-level out-of-memory (OOM) termination.

Code-Level Analysis

The vulnerability manifests in how the receive state machine updates the state when receiving consecutive chunks. The original, vulnerable parsing implementation dynamically grew the connection state list without computing size limits.

# Vulnerable code structure in Mint.HTTP2
{^stream_id, hbf_acc, callback} = conn.headers_being_processed
 
if flag_set?(flags, :continuation, :end_headers) do
  hbf = IO.iodata_to_binary([hbf_acc, hbf_chunk])
  conn = put_in(conn.headers_being_processed, nil)
  callback.(conn, responses, hbf, stream)
else
  # Vulnerability: Unbounded accumulation of chunks into the connection state
  conn = put_in(conn.headers_being_processed, {stream_id, [hbf_acc, hbf_chunk], callback})
  {conn, responses}
end

The patched version introduces a tuple containing four elements: {stream_id, hbf_acc, callback, acc_size}. The implementation now explicitly calculates the cumulative byte size in $O(1)$ time complexity for every incoming frame chunk.

# Patched code structure in Mint.HTTP2
{^stream_id, hbf_acc, callback, acc_size} = conn.headers_being_processed
 
if flag_set?(flags, :continuation, :end_headers) do
  hbf = IO.iodata_to_binary([hbf_acc, hbf_chunk])
  conn = put_in(conn.headers_being_processed, nil)
  callback.(conn, responses, hbf, stream)
else
  new_size = acc_size + byte_size(hbf_chunk)
  # Validation is enforced immediately on each chunk arrival
  conn = assert_header_block_within_max_size(conn, new_size)
 
  conn = put_in(
    conn.headers_being_processed,
    {stream_id, [hbf_acc, hbf_chunk], callback, new_size}
  )
  {conn, responses}
end

The check evaluates the current accumulator size against the locally defined max_header_list_size value. By default, this value has been changed from :infinity to 256 KB. If the total byte size exceeds this threshold, the connection terminates with a protocol error, preventing memory exhaustion.

Exploitation Methodology

Exploiting CVE-2026-49754 requires that a vulnerable Mint client establish an outbound HTTP/2 connection to an attacker-controlled endpoint. No administrative credentials or previous authentications are required. The attack succeeds purely based on protocol-level frame delivery.

Once the client initiates a request, the malicious server responds by sending a HEADERS frame without the END_HEADERS flag set. The server then streams a continuous loop of standard HTTP/2 CONTINUATION frames. Each frame contains maximum payload data, typically formatted as arbitrary or structured bytes. The server purposely avoids transmitting the END_HEADERS flag inside any subsequent frames.

Because the victim's client parser accumulates all payloads into the heap of the active connection process, memory exhaustion occurs rapidly. Laboratory replication reveals that sending approximately 64,000 frames (each containing 16 KiB of dummy payload) consumes over 1 GiB of RAM within seconds. The high rate of frame generation allows an attacker to quickly exhaust system memory and crash the client process.

Security Impact Assessment

The impact of CVE-2026-49754 is a complete loss of client availability. Because the Erlang Runtime System (BEAM) executes multiple concurrent applications and supervisors on a single VM, a crash in the low-level HTTP client process can propagate, leading to the termination of the entire system.

The vulnerability is highly critical for Elixir systems that query untrusted third-party services, perform web scraping, or parse outbound webhooks. An adversary can trigger a crash across an entire cluster of microservices by returning a crafted response to an outbound API call.

There is no risk to data integrity or confidentiality, as the bug does not allow arbitrary code execution, file disclosure, or privilege escalation. The CVSS 4.0 score of 8.2 reflects this high impact on availability, combined with low attack complexity.

Remediation and Mitigation

To resolve the vulnerability, developers must upgrade the mint dependency in their Mix configuration to version 1.9.0 or later. This version enforces strict bounds checking and changes the default maximum header block size from :infinity to 256 KB.

If upgrading is not immediately possible, applications can work around the vulnerability by forcing connections to use HTTP/1.1 when talking to untrusted servers. The HTTP/1.1 parsing engine in Mint does not use the vulnerable multi-frame accumulation logic. This is achieved by passing the :protocols option explicitly.

# Workaround: Restrict connections to HTTP/1.1
Mint.HTTP.connect(:https, "untrusted-api.com", 443, protocols: [:http1])

Security teams can deploy intrusion detection system (IDS) rules at the network perimeter to identify sessions with abnormal ratio balances of HTTP/2 CONTINUATION frames. Additionally, reverse proxies or web application firewalls (WAFs) can be placed in front of client outbound traffic to enforce strict HTTP/2 frame validation.

Official Patches

elixir-mintCommit fixing unbounded header list accumulation by introducing size tracking parameters.

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
EPSS Probability
0.38%
Top 70% most exploited

Affected Systems

Applications utilizing the Elixir Mint HTTP client library for outbound HTTP/2 connections.

Affected Versions Detail

Product
Affected Versions
Fixed Version
mint
elixir-mint
>= 0.1.0, < 1.9.01.9.0
AttributeDetail
CWE IDCWE-770
Attack VectorNetwork
CVSS v4.0 Score8.2 (High)
Exploit MaturityProof-of-Concept (PoC)
EPSS Score0.00384
CISA KEV StatusNot Listed

MITRE ATT&CK Mapping

T1499Endpoint Denial of Service
Impact
CWE-770
Allocation of Resources Without Limits or Throttling

The application allocates memory or other resources without checking or restricting the total size, allowing an attacker to exhaust system resources.

Known Exploits & Detection

GitHub Security AdvisoryOfficial replication details verified by Mint maintainers via integrated project unit tests, showing OOM crashes after approximately 64,000 continuous frames.

Vulnerability Timeline

Vulnerability identified and patch developed by maintainers
2026-06-02
Commit b662d127d3028b5426c88d4c9cc7fe430491a10b pushed to repository
2026-06-02
Security Advisory and CVE-2026-49754 published
2026-06-02

References & Sources

  • [1]GitHub Advisory: Allocation of Resources Without Limits or Throttling in elixir-mint
  • [2]Erlang Ecosystem Foundation Security Advisory
  • [3]Open Source Vulnerability Database Entry

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 1 hour ago•CVE-2026-53653
8.7

CVE-2026-53653: Unauthenticated Denial of Service via Unbounded Image Derivative Dimensions in Grav CMS

Grav CMS prior to version 1.7.53 and 2.0.0-rc.8 is vulnerable to an unauthenticated remote denial of service (DoS) vulnerability. By supplying crafted query parameters with extremely large dimensions to image assets, remote unauthenticated attackers can force the server to allocate massive amounts of system memory, leading to kernel Out-Of-Memory (OOM) termination of web worker processes.

Amit Schendel
Amit Schendel
3 views•7 min read
•about 2 hours ago•CVE-2026-53657
8.2

CVE-2026-53657: Privilege Escalation via Overly Permissive Unix Domain Socket in Lima Guest Agent

CVE-2026-53657 is a local privilege escalation vulnerability in Lima (lima-vm/lima) affecting versions prior to 2.1.3 when configured with the QEMU driver. The guest agent daemon, running as root, creates its communication socket `/run/lima-guestagent.sock` with world-writable permissions (0777). This allows unprivileged local users to command the agent to establish arbitrary tunnels, including to privileged local UNIX sockets (like D-Bus). Because the target daemon authenticates the incoming connection using the credentials of the root-owned guest agent (via SO_PEERCRED), unprivileged users can perform root operations, resulting in complete guest VM compromise.

Amit Schendel
Amit Schendel
3 views•9 min read
•about 3 hours ago•CVE-2026-10740
5.3

CVE-2026-10740: Denial of Service in s2n-quic CryptoStream Reassembly

An unauthenticated Denial of Service vulnerability exists in the s2n-quic library's CryptoStream reassembler due to a lack of buffer limits on out-of-order cryptographic frames. An attacker can transmit a crafted CRYPTO frame with an extremely high offset and nominal payload, forcing the receiver to execute unbounded memory allocations and causing service crashes.

Amit Schendel
Amit Schendel
3 views•7 min read
•about 4 hours ago•CVE-2026-55153
7.1

CVE-2026-55153: JNDI Injection and Deserialization Gadget Abuse in mchange-commons-java

A JNDI Injection and Deserialization Gadget vulnerability exists in mchange-commons-java prior to version 0.6.0. The com.mchange.v2.naming.JavaBeanObjectFactory component permits arbitrary class instantiation and setter invocation, allowing attackers to perform Server-Side Request Forgery (SSRF) and remote class loading.

Alon Barad
Alon Barad
6 views•5 min read
•about 5 hours ago•GHSA-8RW6-P7M8-63JP
6.5

GHSA-8RW6-P7M8-63JP: Array Element-Level SELECT Permissions Leak in SurrealDB

SurrealDB versions supporting element-level SELECT permissions on arrays are vulnerable to a logical authorization bypass. Due to an index-shifting error during array filtration, restricted elements can skip permission checks and leak to unauthorized record users.

Alon Barad
Alon Barad
5 views•6 min read
•1 day ago•CVE-2026-12243
7.5

CVE-2026-12243: Incomplete Path Traversal Validation and Percent-Encoding Bypass in NLTK

CVE-2026-12243 is a path traversal vulnerability in the Natural Language Toolkit (NLTK) version 3.9.4. The flaw exists because the input validation routine fails to account for percent-encoded directory traversal sequences like '..%2f' before passing them to urllib.request.url2pathname(), which decodes them into active traversal sequences.

Amit Schendel
Amit Schendel
5 views•8 min read