CVE-2026-27904
High · 7.5CVSS
7.5
EPSS
0.5%
Published
Feb 26, 2026
CISA due date
—
Cloudanix analysis
A small specially crafted search pattern can make affected JavaScript services freeze or become unavailable until they are updated or protected.
- Exploitation
- Remote Unauthenticated
- Attacker needs
- None
- Complexity
- Low
- Impact
- Denial Of Service
- Component
- Library
- Class
- Denial of service
- Remediation
- Upgrade
- Effort
- Medium
- Patch risk
- Low
What it actually does
Affected versions of minimatch generate JavaScript regular expressions with nested, unbounded quantifiers when processing nested extglob patterns using constructs such as *() or +(). In V8, these generated expressions can trigger catastrophic backtracking against short non-matching inputs, causing a single minimatch() call to consume CPU for seconds to minutes. The flaw affects the default minimatch() API and does not require special options. The impact is availability loss: confidentiality and integrity are not directly affected, but Node.js processes, worker threads, request handlers, build jobs, or automation tasks that evaluate attacker-controlled glob patterns or candidate strings can stall.
Why it matters to the business
Applications, APIs, developer platforms, CI/CD jobs, file-processing services, or automation systems that pass untrusted glob patterns into minimatch can be made slow or unavailable with very small inputs. Because minimatch is commonly used directly and as a transitive dependency in JavaScript tooling, exposure may exist even where the package was not intentionally selected. The vulnerability has a high availability CVSS impact, but it is not currently listed in CISA KEV, is not associated with ransomware use, and has low EPSS at the time of assessment; prioritization should therefore focus on internet-facing or multi-tenant services that accept user-controlled patterns.
How an attack unfolds
An attacker first identifies functionality that accepts glob-like input, such as file filters, path matchers, ignore rules, search filters, artifact selectors, repository tooling, or upload/download selection logic. The attacker submits a short nested extglob pattern using repeated *() or +() nesting, then provides or causes evaluation against a non-matching candidate string. Vulnerable minimatch versions translate that pattern into a regular expression containing nested unbounded quantifiers. When V8 evaluates the expression, it explores a very large backtracking search space before determining there is no match. Repeating the request or increasing nesting/input length can pin the Node.js event loop or worker CPU, causing request timeouts, queue buildup, container restarts, failed jobs, or service degradation.
How to fix it
Upgrade minimatch to a fixed version appropriate for the major version in use: 10.2.3 or later, 9.0.7 or later, 8.0.6 or later, 7.4.8 or later, 6.2.2 or later, 5.1.8 or later, 4.2.5 or later, or 3.1.4 or later. The upstream Git fix is identified as commit ea94840326c3f40522f1b544bd2303024b0eec35. Update package-lock.json, npm-shrinkwrap.json, yarn.lock, or pnpm-lock.yaml so transitive dependency resolution also moves to a fixed version. Where immediate upgrade is not possible, reject or strictly constrain user-supplied extglob syntax, especially nested *() and +() groups; enforce maximum pattern length, nesting depth, and match time; run risky matching in isolated workers with CPU/time limits; and apply rate limiting to endpoints that evaluate glob patterns.
How to confirm the fix worked
Confirm dependency resolution with package-manager tooling such as npm ls minimatch, yarn why minimatch, pnpm why minimatch, or SBOM/SCA scans, and verify no resolved minimatch package is below the fixed versions for its major line. Inspect lockfiles for minimatch versions earlier than 10.2.3, 9.0.7, 8.0.6, 7.4.8, 6.2.2, 5.1.8, 4.2.5, or 3.1.4. After upgrading, run a regression test that evaluates nested extglob patterns against non-matching strings and confirm the operation returns quickly rather than stalling. Validate production protection by checking that user-controlled glob inputs are length-limited, nesting-limited, logged, and rate-limited where applicable.
Typical attack path
- Find an endpoint, job parameter, configuration field, or workflow that accepts glob patterns or file-matching expressions.
- Confirm the application uses minimatch directly or through a dependency path to evaluate those patterns.
- Submit a nested extglob pattern using *() or +() constructs, such as a small pattern with multiple nested groups.
- Cause the pattern to be matched against a short non-matching input string.
- Trigger catastrophic backtracking in the generated JavaScript regular expression, consuming CPU in the Node.js process.
- Repeat or parallelize requests to exhaust workers, increase latency, cause timeouts, or disrupt dependent services.
How to detect it
This vulnerability does not produce a durable compromise artifact because it causes denial of service rather than code execution, so detection should focus on evidence of attempted triggering and correlated resource exhaustion. Review application logs, API gateway logs, WAF logs, reverse proxy logs, job execution logs, CI/CD logs, and audit trails for user-supplied glob patterns containing nested *() or +() extglob syntax. Correlate those requests with spikes in Node.js CPU usage, event-loop lag, request duration, HTTP 408/429/499/500/502/503/504 responses, worker thread saturation, container restarts, process manager restarts, failed build steps, or timeout errors. In Node.js telemetry, look for long synchronous JavaScript execution in RegExp evaluation or minimatch-related stack traces. Because exploit maturity is currently reported as none and the issue is not in KEV, treat confirmed suspicious patterns plus service impact as the strongest signal of attempted exploitation.
- *(*(*(a|b)))
- +(*(*(a|b)))
- +(+(*(a|b)))
- *(*(*(
- +(+(+(
- (?:(?:a|b)*)*
- (?:(?:a|b)+)*
- node_modules/minimatch/package.json
- minimatch()
- RegExp.prototype.test
- event loop lag
- request timeout
- worker timeout
- JavaScript heap out of memory
What your security team should do
- Inventory all direct and transitive uses of minimatch across application repositories, container images, serverless packages, CI/CD tooling, and developer automation.
- Prioritize remediation for internet-facing, multi-tenant, or unauthenticated functionality that accepts glob patterns, file filters, path selectors, ignore rules, or similar matching expressions.
- Upgrade minimatch to the fixed version for the deployed major line and refresh lockfiles to ensure transitive dependencies are actually updated.
- Add input validation to reject deeply nested extglob constructs and enforce maximum glob pattern length and nesting depth.
- Add runtime safeguards for pattern matching, such as worker isolation, request timeouts, event-loop lag monitoring, CPU quotas, and rate limits.
- Search historical application and edge logs for nested extglob patterns, correlated request timeouts, high CPU, event-loop stalls, worker restarts, or failed jobs.
- Add SCA policy checks so vulnerable minimatch versions fail builds or deployment gates going forward.
The record
minimatch is a minimal matching utility for converting glob expressions into JavaScript RegExp objects. Prior to version 10.2.3, 9.0.7, 8.0.6, 7.4.8, 6.2.2, 5.1.8, 4.2.5, and 3.1.4, nested `*()` extglobs produce regexps with nested unbounded quantifiers (e.g. `(?:(?:a|b)*)*`), which exhibit catastrophic backtracking in V8. With a 12-byte pattern `*(*(*(a|b)))` and an 18-byte non-matching input, `minimatch()` stalls for over 7 seconds. Adding a single nesting level or a few input characters pushes this to minutes. This is the most severe finding: it is triggered by the default `minimatch()` API with no special options, and the minimum viable pattern is only 12 bytes. The same issue affects `+()` extglobs equally. Versions 10.2.3, 9.0.7, 8.0.6, 7.4.8, 6.2.2, 5.1.8, 4.2.5, and 3.1.4 fix the issue.
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|---|---|---|
| npm | minimatch | 0 | 3.1.4 |
| npm | minimatch | 10.0.0 | 10.2.3 |
| npm | minimatch | 4.0.0 | 4.2.5 |
| npm | minimatch | 5.0.0 | 5.1.8 |
| npm | minimatch | 6.0.0 | 6.2.2 |
| npm | minimatch | 7.0.0 | 7.4.8 |
| npm | minimatch | 8.0.0 | 8.0.6 |
| npm | minimatch | 9.0.0 | 9.0.7 |
| Chainguard | actions-runner | 0 | 2.332.0-r1 |
| Chainguard | arangodb-3.11 | 0 | 3.11.14.3-r2 |
| Chainguard | arangodb-3.12 | 0 | 3.12.7.2-r3 |
| Chainguard | code-server | 0 | 4.109.2-r0 |
| Chainguard | emscripten | 0 | 5.0.2-r1 |
| Chainguard | eslint | 0 | 10.0.2-r1 |
| Chainguard | graalvm-25-ce-nodejs | 0 | 25.0.2-r4 |
| Chainguard | kibana-8.17 | 0 | 8.17.10-r12 |
| Chainguard | kibana-8.17-bitnami | 0 | 8.17.10-r12 |
| Chainguard | kibana-8.17-iamguarded | 0 | 8.17.10-r12 |
| Chainguard | kibana-8.19 | 0 | 8.19.12-r2 |
| Chainguard | kibana-8.19-bitnami | 0 | 8.19.12-r2 |
| Chainguard | kibana-8.19-iamguarded | 0 | 8.19.12-r2 |
| Chainguard | kibana-9.0 | 0 | 9.0.8-r13 |
| Chainguard | kibana-9.0-bitnami | 0 | 9.0.8-r13 |
| Chainguard | kibana-9.0-iamguarded | 0 | 9.0.8-r13 |
| Chainguard | kibana-9.1 | 0 | 9.1.10-r6 |
| Chainguard | kibana-9.1-iamguarded | 0 | 9.1.10-r6 |
| Chainguard | kibana-9.2 | 0 | 9.2.5-r5 |
| Chainguard | kibana-9.2-iamguarded | 0 | 9.2.5-r5 |
| Chainguard | kibana-9.3 | 0 | 9.3.0-r2 |
| Chainguard | kibana-9.3-iamguarded | 0 | 9.3.0-r2 |
| Chainguard | kubeflow-centraldashboard | 0 | 1.10.0-r13 |
| Chainguard | langfuse-2-worker | 0 | 2.95.12-r12 |
| Chainguard | lerna | 0 | 9.0.5-r1 |
| Chainguard | librechat | 0 | 0.8.2-r6 |
| Chainguard | node-gyp | 0 | 12.2.0-r2 |
| Chainguard | npm | 0 | 11.11.0-r1 |
| Chainguard | opensearch-dashboards-2 | 0 | 2.19.4-r15 |
| Chainguard | opensearch-dashboards-2-dashboards-reporting | 0 | 2.19.4-r15 |
| Chainguard | opensearch-dashboards-2-fips | 0 | 2.19.4-r13 |
| Chainguard | opensearch-dashboards-2-fips-dashboards-reporting | 0 | 2.19.4-r13 |
| Chainguard | opensearch-dashboards-3 | 0 | 3.5.0-r6 |
| Chainguard | opensearch-dashboards-3-dashboards-reporting | 0 | 3.5.0-r6 |
| Chainguard | opentelemetry-auto-instrumentations-node | 0 | 0.70.1-r1 |
| Chainguard | prism | 0 | 5.14.3-r8 |
| Chainguard | pulumi-language-nodejs | 0 | 3.224.0-r1 |
| Chainguard | renovate | 0 | 43.49.0-r1 |
| Chainguard | serve | 0 | 14.2.6-r0 |
| Chainguard | tileserver-gl | 0 | 5.5.0-r6 |
| Chainguard | tileserver-gl-fips | 0 | 5.5.0-r7 |
| Chainguard | vitess-22 | 0 | 22.0.4-r4 |
| Chainguard | vitess-23 | 0 | 23.0.3-r5 |
| Wolfi | code-server | 0 | 4.109.2-r0 |
| Wolfi | eslint | 0 | 10.0.2-r1 |
| Wolfi | kubeflow-centraldashboard | 0 | 1.10.0-r13 |
| Wolfi | lerna | 0 | 9.0.5-r1 |
| Wolfi | node-gyp | 0 | 12.2.0-r2 |
| Wolfi | npm | 0 | 11.11.0-r1 |
| Wolfi | opensearch-dashboards-2 | 0 | 2.19.4-r15 |
| Wolfi | opensearch-dashboards-2-dashboards-reporting | 0 | 2.19.4-r15 |
| Wolfi | opensearch-dashboards-3 | 0 | 3.5.0-r6 |
| Wolfi | opensearch-dashboards-3-dashboards-reporting | 0 | 3.5.0-r6 |
| Wolfi | prism | 0 | 5.14.3-r8 |
| Wolfi | pulumi-language-nodejs | 0 | 3.224.0-r1 |
| Wolfi | renovate | 0 | 43.49.0-r1 |
| Wolfi | serve | 0 | 14.2.6-r0 |
| Wolfi | tileserver-gl | 0 | 5.5.0-r6 |
| Wolfi | vitess-22 | 0 | 22.0.4-r4 |
| Wolfi | vitess-23 | 0 | 23.0.3-r5 |
| openSUSE:Tumbleweed | onnxruntime | 0 | 1.26.0-1.1 |
| openSUSE:Tumbleweed | openQA | 0 | 5.1782995932.ffeb09be-1.1 |
| openSUSE:Tumbleweed | velociraptor | 0 | 0.7.0.4.git185.a5708584-2.1 |
Related vulnerabilities
- GHSA-23c5-xmqv-rm74 minimatch ReDoS: nested *() extglobs generate catastrophically backtracking regular… Same vulnerability
- GHSA-7r86-cg39-jmmj minimatch has ReDoS: matchOne() combinatorial backtracking via multiple non-adjacent… Also affects minimatch
- CVE-2026-27903 minimatch is a minimal matching utility for converting glob expressions into JavaScript… Also affects minimatch
- CVE-2026-26996 minimatch is a minimal matching utility for converting glob expressions into JavaScript… Also affects minimatch
- GHSA-3ppc-4f35-3m26 minimatch has a ReDoS via repeated wildcards with non-matching literal in pattern Also affects minimatch
- GHSA-9ppj-qmqm-q256 node-tar Symlink Path Traversal via Drive-Relative Linkpath Also affects actions-runner
- CVE-2026-31802 node-tar is a full-featured Tar for Node.js. Also affects actions-runner
- CVE-2026-29786 node-tar is a full-featured Tar for Node.js. Also affects actions-runner