Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessIdentify input path reaching brace-expansion
-
DeliveryCraft {a},b} pattern with many trailing braces
-
ExploitSubmit pattern to expand()
-
ExecutionQuadratic rescans block Node.js event loop
-
ImpactTemporary 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 |
| 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 |
| 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 |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – 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
Affected Packages
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
AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L
Network-reachable untrusted pattern, no privileges or interaction; only a temporary, recoverable event-loop stall justifies A:L with no C/I impact.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
2DescriptionCVE.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- 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
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.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Denial of Service attacks render applications or systems unavailable by overwhelming resources or triggering failure conditions.
Remote code execution in n8n's workflow expression evaluation system allows an authenticated user with workflow creation
A vulnerability in the NuPoint Unified Messaging (NPM) component of Mitel MiCollab through 9.8 SP1 FP2 (9.8.1.201) could
FortiOS and FortiProxy contain an authentication bypass via the Node.js websocket module allowing unauthenticated remote
Denial of service against HTTP/2 server implementations allows remote unauthenticated attackers to exhaust server resour
Eval injection vulnerability in the internals.batch function in lib/batch.js in the bassmaster plugin before 1.5.2 for t
Flowise version 3.0.5 contains a remote code execution vulnerability in the CustomMCP node. The mcpServerConfig paramete
Node.js 8.5.0 before 8.6.0 allows remote attackers to access unintended files, because a change to ".." handling was inc
An issue was discovered in the node-serialize package 0.0.4 for Node.js. Rated critical severity (CVSS 9.8), this vulner
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
Directory traversal vulnerability in the st module before 0.2.5 for Node.js allows remote attackers to read arbitrary fi
Multiple SQL injection vulnerabilities in the Manage Accounts page in the AccountManagement.asmx service in the Solarwin
The JS-YAML module before 2.0.5 for Node.js parses input without properly considering the unsafe !!js/function tag, whic
EUVD-2026-88551
GHSA-q2hr-2g5m-vwhr
NVD
CVE.org
EPSS
Vulnrichment
Exploit-DB