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

CVE-2026-54892: Algorithmic Complexity Denial of Service in Plug Query Decoder

Alon Barad
Alon Barad
Software Engineer

Sep 23, 2026·6 min read·7 visits

Executive Summary (TL;DR)

Unauthenticated remote attackers can exhaust Erlang VM schedulers and cause a Denial of Service via deeply nested parameter keys in URL-encoded requests.

An algorithmic complexity vulnerability (CWE-407) in the query decoder of the Elixir Plug library (CVE-2026-54892) allows unauthenticated remote attackers to trigger scheduler starvation and denial of service by transmitting deeply nested brackets in query parameters or URL-encoded post bodies.

Vulnerability Overview

The vulnerability CVE-2026-54892 represents an algorithmic complexity flaw within the Plug library, the fundamental middleware stack powering web applications built in Elixir, including those on the Phoenix Framework. Within the Elixir ecosystem, Plug defines the specification for web application connection pipelines, managing everything from request parsing to route dispatching.

At the core of the issue is the processing of nested request parameters inside Plug.Conn.Query.decode/4 and Plug.Conn.Query.decode_each/2. These components are responsible for parsing incoming query strings from URLs as well as processing application/x-www-form-urlencoded payloads commonly sent via HTTP POST requests.

Because this parsing stage executes during the initial phases of the Plug connection lifecycle, it acts as a critical entry point on the application's attack surface. An attacker does not require authentication or route authorization to trigger the vulnerable code pathways, exposing the application to unauthenticated remote exploitation.

This security advisory details how a lack of depth limits in the parameter decoder leads to a quadratic-time $O(N^2)$ workload, which can be leveraged by a remote adversary to completely saturate Erlang VM schedulers, thereby inducing a persistent and resource-efficient Denial of Service (DoS).

Root Cause Analysis

The root cause of CVE-2026-54892 lies in the key splitting and nested dictionary construction algorithms implemented within lib/plug/conn/query.ex. The library employs a recursive parser to handle bracketed query parameter hierarchies such as user[profile][address][city]=value.

When Plug encounters a nested parameter structure, it recursively splits the key binary at bracket boundaries. To optimize performance, a previous patch utilized binary slicing to track path hierarchies. However, as the nested depth $N$ grows, the algorithm recursively extracts prefixes of the key binary to lookup and insert indices in the BEAM virtual machine's map structures.

Specifically, for each nested depth step $i$, the algorithm computes the binary prefix of length $L_i \approx 3i$. When inserting these keys into the tracking map, the BEAM VM must compute the hash of this growing binary prefix. Hashing a binary key requires a linear scan of its content, translating to an $O(L_i)$ computational cost. Summing this cost over $N$ nested levels yields an overall time complexity of $O(N^2)$ relative to the nesting depth.

Under default configurations, Plug.Parsers.URLENCODED allows up to 1,000,000 bytes of data. An attacker can construct a payload containing 333,000 levels of nesting. The BEAM VM attempting to parse this payload will undergo a massive hashing workload of approximately $166$ gigabytes of processed binary data, completely locking the corresponding Erlang process and its OS thread.

Code Analysis

Below is a comparison of the vulnerable implementation versus the mitigation implemented in the security patch. The original, optimized code did not track recursion depth, allowing unbounded recursion and nested key allocation.

In the vulnerable version of lib/plug/conn/query.ex, the split_keys/6 function recursively parses brackets without keeping track of recursion depth limit:

defp split_keys(<<?], ?[, rest::binary>>, binary, current_pos, start_pos, level, acc) do
  value = split_key(binary, current_pos, start_pos)
  next_level = binary_part(binary, 0, current_pos + 1)
  split_keys(rest, binary, current_pos + 2, current_pos + 2, next_level, [{level, value} | acc])
end

The security patch restricts recursion nesting to a maximum of 32 depth steps. A counter parameter is added to split_keys/7, which triggers an exception when exceeded:

@max_nesting 32
 
defp split_keys(<<?], ?[, rest::binary>>, binary, current_pos, start_pos, level, acc, count) do
  count = count + 1
  check_nesting!(count)
 
  value = split_key(binary, current_pos, start_pos)
  next_level = binary_part(binary, 0, current_pos + 1)
  current_pos = current_pos + 2
  acc = [{level, value} | acc]
  split_keys(rest, binary, current_pos, current_pos, next_level, acc, count)
end
 
defp check_nesting!(count) when count > @max_nesting do
  message = "maximum query nesting is #{@max_nesting}, got a query with #{count} keys"
  raise Plug.Conn.InvalidQueryError, message: message
end

This counter limits the worst-case time complexity of the parser by throwing a Plug.Conn.InvalidQueryError if the parameter depth exceeds the safe threshold of 32 nesting levels. This ensures the parsing load remains linear and safe.

Exploitation Methodology

Exploitation is accomplished by transmitting an HTTP request containing a single key with an extreme nesting depth to the target application. This attack targets the initial request ingestion stage, which executes before application routing occurs.

An attacker can construct a payload consisting of a variable name followed by nested sub-keys: x[x][x]...[x]=1. Because the default body limit for Plug.Parsers.URLENCODED is 1,000,000 bytes, a payload can reach over 330,000 nesting levels within a single request. When parsed, this structure causes the BEAM virtual machine to exhaustively perform binary partitioning and map hashing, consuming billions of processor cycles.

Because the Erlang VM runs cooperative schedulers pinned to individual CPU cores, processing such a payload freezes that scheduler thread. Flooding the target application with a small quantity of such requests saturates all available schedulers, stopping the handling of other network traffic and leading to a complete Denial of Service. The exploit does not require active socket monitoring or established sessions; it functions entirely statelessly.

Impact Assessment

The security impact of CVE-2026-54892 is scored as High with a CVSS v4.0 base score of 8.7. The primary threat vector is the complete loss of service availability across the affected application node.

Since body parsers generally run at the entry point of the middleware stack, the payload is parsed before any routing or authentication logic is evaluated. Consequently, even requests targeting nonexistent paths or static asset directories can trigger the resource exhaustion bug. This exposes all public-facing HTTP endpoints as potential target vectors.

No confidentiality or integrity impacts are present, but the ease of execution and low network bandwidth requirements make this vulnerability a highly reliable Denial of Service vector against unpatched Elixir and Phoenix systems. Systems deployed without external load balancing, rate limiting, or reverse-proxy request buffering are particularly vulnerable to immediate starvation of CPU resources.

Remediation and Mitigation

The recommended remediation is to upgrade the plug library in the application's dependencies to one of the patched releases:

  • plug version 1.15.5
  • plug version 1.16.4
  • plug version 1.17.2
  • plug version 1.18.3
  • plug version 1.19.3

If upgrading immediately is not possible, you can mitigate the vulnerability by restricting incoming request body size limits in endpoint.ex:

plug Plug.Parsers,
  parsers: [:urlencoded, :multipart, :json],
  pass: ["*/*"],
  json_decoder: Phoenix.json_library(),
  length: [urlencoded: 50000]

Additionally, Web Application Firewalls (WAF) can be configured to block request strings or post bodies that match a nested bracket regex pattern of more than 32 nested components, e.g., (\\[[^\\]]*\\]){32,}. These protective steps shield the underlying application from handling the malicious, oversized queries.

Official Patches

elixir-plugFix commit for main branch
elixir-plugOfficial security advisory

Fix Analysis (1)

Technical Appendix

CVSS Score
8.7/ 10
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N
EPSS Probability
0.95%
Top 40% most exploited

Affected Systems

Elixir Web ApplicationsPhoenix Framework Applications using Plug < 1.15.5, 1.16.4, 1.17.2, 1.18.3, or 1.19.3

Affected Versions Detail

Product
Affected Versions
Fixed Version
plug
elixir-plug
>= 1.15.0, < 1.15.51.15.5
plug
elixir-plug
>= 1.16.0, < 1.16.41.16.4
plug
elixir-plug
>= 1.17.0, < 1.17.21.17.2
plug
elixir-plug
>= 1.18.0, < 1.18.31.18.3
plug
elixir-plug
>= 1.19.0, < 1.19.31.19.3
AttributeDetail
CWE IDCWE-407
Attack VectorNetwork
CVSS v4.0 Score8.7
Affected ComponentPlug.Conn.Query.decode/4
Exploit Statuspoc
Remediation StatusPatched

MITRE ATT&CK Mapping

T1499Endpoint Denial of Service
Impact
T1499.004Endpoint DoS: Application Exhaustion Flood
Impact
CWE-407
Inefficient Algorithmic Complexity

The execution time of the query decoder increases quadratically relative to the depth of bracket-nested query parameter keys, enabling resource exhaustion attacks.

Vulnerability Timeline

Core library optimization commit introduced
2023-03-30
Vulnerability identified and reported to EEF security team
2026-06-15
Security advisory published and CVE-2026-54892 assigned
2026-06-23
Patched versions of Plug released
2026-06-23

References & Sources

  • [1]GHSA-j43x-5hjq-rgxf Security Advisory
  • [2]NVD CVE-2026-54892 Details
  • [3]Erlang Ecosystem Foundation Advisory

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

•35 minutes ago•CVE-2026-73858
5.3

CVE-2026-73858: Server-Side Twig Template Injection in Solspace Freeform for Craft CMS

A technical analysis of CVE-2026-73858 / GHSA-gxrg-x694-283w, a server-side template injection vulnerability in the Solspace Freeform plugin for Craft CMS. The vulnerability permits unauthenticated users to trigger dynamic Twig evaluation of input fields during form validation re-rendering, causing local directory path disclosure and PHP runtime information exposure.

Alon Barad
Alon Barad
5 views•6 min read
•about 3 hours ago•CVE-2026-83801
5.4

CVE-2026-83801: Stored Cross-Site Scripting via Form Help Text in Nautobot

CVE-2026-83801 is a stored Cross-Site Scripting (XSS) vulnerability in Nautobot. The vulnerability arises because the application interpolates user-controlled database properties—specifically Relationship descriptions and Module Family names—directly into the help_text parameter of Django form fields. These fields are rendered using Django's |safe filter, bypassing HTML escaping and enabling persistent injection. When an administrative user accesses the affected forms, the payload executes contextually in their browser. This allows attackers to hijack active sessions and perform unauthorized operations. Nautobot versions prior to v2.4.37 and v3.1.8 are affected by this vulnerability. The issue has been patched by implementing contextual HTML escaping and strict markdown sanitization.

Alon Barad
Alon Barad
5 views•5 min read
•about 4 hours ago•CVE-2026-83805
6.4

CVE-2026-83805: Authorization Bypass and Privilege Escalation in Nautobot Approval Workflows

An authorization bypass vulnerability exists in Nautobot's REST API endpoints handling approval workflows. Due to an architectural inconsistency, a standalone, generic REST API endpoint for creating approval responses was exposed without propagating the required business-logic validations. This allows low-privileged authenticated users to submit forged, self-approved votes, bypassing approval thresholds and triggering unauthorized server-side automated jobs.

Amit Schendel
Amit Schendel
5 views•7 min read
•about 5 hours ago•CVE-2026-85709
5.3

CVE-2026-85709: Sensitive Information Exposure in LightRAG API Server

CVE-2026-85709 is a sensitive information exposure vulnerability in HKUDS LightRAG prior to version 1.5.5. The vulnerability allows remote, unauthenticated clients to trigger server-side errors and receive raw Python exception details, including local filesystem paths, database connection strings, credentials, and internal system configurations.

Amit Schendel
Amit Schendel
5 views•6 min read
•about 6 hours ago•CVE-2026-85725
5.9

CVE-2026-85725: Observable Timing Side-Channel Vulnerability in HKUDS LightRAG

HKUDS LightRAG prior to version 1.5.5 is vulnerable to multiple timing side-channels (CWE-208) in its API authentication layer. The password verification logic in `lightrag/api/passwords.py` compares plaintext administrative credentials using Python's short-circuiting equality operator (`==`). Additionally, `lightrag/api/auth.py` terminates authentication early on non-existent usernames, creating an observable latency difference compared to computationally expensive bcrypt comparisons on valid accounts. Together, these allow remote unauthenticated attackers with low-latency network access to enumerate valid usernames and extract plaintext passwords character by character.

Amit Schendel
Amit Schendel
4 views•5 min read
•about 7 hours ago•CVE-2026-85734
9.1

CVE-2026-85734: Brute-Force and CPU-Exhaustion DoS in LightRAG API /login Endpoint

LightRAG prior to version 1.5.5 does not implement rate limiting, lockout mechanisms, or throttling on its `/login` authentication endpoint. This allows unauthenticated remote attackers to perform rapid brute-force attacks to crack passwords and hijack active sessions. Furthermore, because the endpoint processed synchronous bcrypt verifications inside an asynchronous event loop, concurrent brute-force requests can easily exhaust server CPU resources, triggering an unauthenticated Denial of Service (DoS).

Alon Barad
Alon Barad
5 views•5 min read