Skip to main content

brace-expansion EUVDEUVD-2026-88551

| CVE-2026-102277 MEDIUM
Uncontrolled Resource Consumption (CWE-400)
2026-09-28 GitHub_M GHSA-q2hr-2g5m-vwhr
5.3
CVSS 3.1 · Vendor: GitHub_M
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Identify input path reaching brace-expansion
  2. Delivery
    Craft {a},b} pattern with many trailing braces
  3. Exploit
    Submit pattern to expand()
  4. Execution
    Quadratic rescans block Node.js event loop
  5. Impact
    Temporary service unavailability (recovers)

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A06:2025 - Insecure Design
ASVS 5.0
V2 - Validation and Business Logic Resource consumption limits
MITRE ATT&CK

1 technique across 1 tactic: Impact

The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up.

Exploitation Conditions

Exploitation requires that the application pass attacker-controlled input to brace-expansion's expand() function - either directly or transitively via consumers like minimatch/glob - and that this input reach the expander unbounded. The specific trigger is a {a},b}-shaped pattern with a large number of trailing closing braces (e.g. '{a}' + '}'.repeat(n) + ',z}'); the parser restarts its full scan once per trailing brace, producing quadratic CPU and memory cost. Limiting factors: many applications never feed untrusted data into brace expansion (patterns are usually developer-supplied globs), the DoS is recoverable rather than permanent, and vanilla output-size guards (max/maxLength) do NOT bound it because the cost is entirely in parsing before output. Node.js runtime only.

Impact

This is a genuine but low-severity issue. The CVSS 3.1 vector (AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L, base 5.3) is internally consistent with the description: network-reachable, no privileges, no user interaction, but only a limited availability impact (A:L) because the description explicitly states the process 'eventually recovers' - this is a recoverable CPU/memory denial of service, not a crash or resource-exhaustion kill. I agree with the 5.3 and A:L rating. There is no EPSS score, no CISA KEV listing, and no public exploit code provided (the advisory ships regression tests, not a weaponized POC), so exploitation status is 'no public exploit identified at time of analysis.' The signals are not conflicting: a moderate CVSS with only availability impact and no exploitation evidence points to a low real-world priority. The mitigating reality is that the trigger is narrow - an attacker must be able to feed a specifically-shaped {a},b} pattern with many trailing closing braces into brace-expansion, which most applications never expose to untrusted input.

Exploit ScenarioDerived

An application passes untrusted, attacker-controlled input to brace-expansion (directly or via a dependent such as minimatch/glob) and expands it. The attacker submits a pattern shaped like '{a}' + '}'.repeat(128000) + ',z}'; the parser restarts its full scan once per trailing brace over a working string that grows each pass, consuming quadratic CPU/memory - the advisory measured ~27 seconds of blocked event loop for a 128KB payload. No public exploit code exists, only regression tests demonstrating the timing.

This Month Plan within 30 days. Why: MEDIUM severity (CVSS 4.0-6.9).
Patch available 0.3% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Sep 28, 2026

Quadratic-time CPU exhaustion in the brace-expansion npm library (all releases prior to 1.1.21, 2.1.7, 3.0.9, and 5.0.12) lets unauthenticated remote attackers stall the Node.js event loop by supplying a crafted brace pattern shaped like '{a},b}' with a very large number of trailing closing braces. Parsing such input forces successive full-string rescans with growing working strings, so ~128 KB of the payload has been measured to block the event loop for tens of seconds; the process recovers afterward, making this a recoverable denial-of-service rather than a persistent crash, which is why it is rated only 5.3 (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L). Exploitation requires that an application pass attacker-controlled input into expand() - directly or transitively through consumers such as minimatch/glob - and it affects Node.js runtimes only; no public exploit code has been identified at time of analysis and the issue is not in CISA KEV.

RemediationAI

Vendor-released patch: upgrade to the fixed release for your major line - 1.1.21, 2.1.7, 3.0.9, or 5.0.12 - as described in the advisory at https://github.com/juliangruber/brace-expansion/security/advisories/GHSA-q2hr-2g5m-vwhr; because the package is usually pulled in transitively, run 'npm ls brace-expansion' (or the equivalent) and force resolution with an override/resolutions entry if a stale copy remains under minimatch or glob. Note that the upstream fixes are commits referenced in the advisory, so re-verify after updating that the resolved version is one of the tagged patched releases rather than a commit-pinned build. If immediate upgrade is not possible, the most effective compensating control is to reject or truncate untrusted pattern strings before they reach expand() - specifically, treat any attacker-influenced input containing a brace group followed by a long run of closing braces as hostile and cap the total input length (the exploit relies on tens of thousands of trailing '}' characters, so a length ceiling in the low kilobytes removes the practical vector; trade-off: may reject legitimate but pathological globs). Additional controls: never pass raw user input to glob/minimatch pattern arguments (treat those as fixed developer-supplied globs and match user input against them instead); run the expansion in a Worker thread or child process with a hard wall-clock timeout so a stalled event loop does not take the main process down (trade-off: added IPC complexity and per-call overhead). Do not rely on the library's max or maxLength options as a mitigation - the cost is incurred during parsing before any output bound applies. Relying on request timeouts or rate limiting alone is insufficient because a single crafted request can occupy the event loop.

Affected VersionsENISA

brace-expansion < 1.1.21
brace-expansion 4.0.0, < 5.0.12
brace-expansion 3.0.0, < 3.0.9
brace-expansion 2.0.0, < 2.1.7

Affected Packages

npm brace-expansion fix: 1.1.21, 2.1.7, 3.0.9, 5.0.12

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 1 package in npm

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

brace-expansion is the JavaScript reimplementation of Bash-style brace expansion used across the npm ecosystem, most notably as a dependency of minimatch and glob, and therefore reaches a very large downstream surface (build tooling, linters, bundlers, test runners, CLI argument parsing). The affected logic is the parser's handling of the Bash compatibility quirk where a brace group followed by a comma set still expands, e.g. '{a},b}'. To emulate this, the parser rewrites the input string and restarts its scan, absorbing one closing brace per pass; with n trailing '}' characters it performs n complete passes over a string that also grows by one escape sentinel (escClose) each iteration. The result is O(n^2) CPU and memory amplification (the upstream commit notes a ~26x constant from the sentinel length), which maps to CWE-400 (Uncontrolled Resource Consumption). Critically, the amplification happens during parsing, before output is produced, so the library's existing output-size guards (max and maxLength) do not bound it - the upstream test demonstrates that '{a}' + '}'.repeat(128000) + ',z}' yields only a couple of results yet blocks the loop for roughly 27 seconds. The fix adds an EXPANSION_MAX_REWRITES bound (default 1000) that caps how many times the scan may restart; when exceeded, the remaining text is emitted literally instead of throwing, mirroring how max/maxLength truncate.

Know when Node.js gets its next vulnerability

  • Watch products and get an email when something new is published
  • Check this CVE against your own stack and servers
  • Exploit and PoC references, threat intelligence from 22 sources

No credit card · 7-day full trial

Severity by source

Vendor (GitHub_M) PRIMARY 5.3 MEDIUM
AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L
vuln.today AI 5.3 MEDIUM

Network-reachable untrusted pattern, no privileges or interaction; only a temporary, recoverable event-loop stall justifies A:L with no C/I impact.

3.1 AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L
4.0 AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N
Red Hat 5.3 MEDIUM

Primary rating from Vendor (GitHub_M).

CVSS VectorVendor: GitHub_M

Attack Vector
Network
Attack Complexity
Low
Privileges Required
None
User Interaction
None
Scope
Unchanged
Confidentiality
None
Integrity
None
Availability
Low

Lifecycle Timeline

2
Patch available
Sep 28, 2026 - 22:02 EUVD
CVE Published
Sep 28, 2026 - 20:54 cve.org
MEDIUM 5.3

DescriptionCVE.org

The brace-expansion library generates arbitrary strings containing a common prefix and suffix. Prior to 1.1.21, 2.1.7, 3.0.9, and 5.0.12, the expand function handles untrusted {a},b}-shaped patterns with many trailing closing braces by restarting its scan once for each trailing closing brace. The successive full-input rescans with linear working-string growth cause quadratic CPU time and memory pressure that can block the Node.js event loop. The process eventually recovers, making the impact a recoverable CPU denial of service. This issue is fixed in versions 1.1.21, 2.1.7, 3.0.9, and 5.0.12.

Blast Radius

ecosystem impact
† from your stack dependencies † transitive graph · vuln.today resolves 4-path depth
  • 2,867 npm packages depend on brace-expansion (65 direct, 2,826 indirect)

Ecosystem-wide dependent count for version 4.0.0.

Threat Intelligence Overview

EPSS Score
0.3%
Top 79% exploitable
Prevalence
Ubiquitous
core npm library, transitive dependency of minimatch/glob in most Node projects
Threat Intel
1
1 sources
Exploit
POC
Public exploit code exists
Data Quality
7 sources
Confidence: High
EUVD NVD CVE.org EPSS Vulnrichment GHSA MSRC Vendor GitHub

How this decision was reached

The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.

SignalValue
Severity MEDIUM
CISA KEV No
Public POC Yes
EPSS 0.3%
Patch available Yes
Active threat No
Deciding rule
MEDIUM severity (CVSS 4.0-6.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation
None
System Exposure· derived
Open
Automatable
Yes
Human Impact· derived
High
Technical Impact
Partial

Priority Score

46
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +26
PoC: +20
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Denial of Service attacks render applications or systems unavailable by overwhelming resources or triggering failure conditions.

CVE-2025-68613 HIGH POC
8.8 Dec 19

Remote code execution in n8n's workflow expression evaluation system allows an authenticated user with workflow creation

CVE-2024-41713 CRITICAL POC
9.1 Oct 21

A vulnerability in the NuPoint Unified Messaging (NPM) component of Mitel MiCollab through 9.8 SP1 FP2 (9.8.1.201) could

CVE-2024-55591 CRITICAL POC
9.8 Jan 14

FortiOS and FortiProxy contain an authentication bypass via the Node.js websocket module allowing unauthenticated remote

CVE-2023-44487 HIGH POC
7.5 Oct 10

Denial of service against HTTP/2 server implementations allows remote unauthenticated attackers to exhaust server resour

CVE-2014-7205 CRITICAL POC
10.0 Oct 08

Eval injection vulnerability in the internals.batch function in lib/batch.js in the bassmaster plugin before 1.5.2 for t

CVE-2025-59528 CRITICAL POC
10.0 Sep 22

Flowise version 3.0.5 contains a remote code execution vulnerability in the CustomMCP node. The mcpServerConfig paramete

CVE-2017-14849 HIGH POC
7.5 Sep 28

Node.js 8.5.0 before 8.6.0 allows remote attackers to access unintended files, because a change to ".." handling was inc

CVE-2017-5941 CRITICAL POC
9.8 Feb 09

An issue was discovered in the node-serialize package 0.0.4 for Node.js. Rated critical severity (CVSS 9.8), this vulner

CVE-2014-0224 HIGH POC
7.4 Jun 05

OpenSSL before 0.9.8za, 1.0.0 before 1.0.0m, and 1.0.1 before 1.0.1h does not properly restrict processing of ChangeCiph

CVE-2014-3744 HIGH POC
7.5 Oct 23

Directory traversal vulnerability in the st module before 0.2.5 for Node.js allows remote attackers to read arbitrary fi

CVE-2014-9566 HIGH POC
7.5 Mar 10

Multiple SQL injection vulnerabilities in the Manage Accounts page in the AccountManagement.asmx service in the Solarwin

CVE-2013-4660 MEDIUM POC
6.8 Jun 28

The JS-YAML module before 2.0.5 for Node.js parses input without properly considering the unsafe !!js/function tag, whic

Vendor StatusVendor

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy