Cloudanix VulnDB

CVE-2026-26996

High · 7.5

CVSS

7.5

EPSS

0.6%

Published

Feb 20, 2026

CISA due date

—

Cloudanix analysis

Next patch cycle SSVC: Track

A small specially crafted search or file-matching pattern can make affected applications freeze or become unavailable until they are updated.

Exploit Available
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

minimatch versions 10.2.0 and earlier can generate JavaScript regular expressions with catastrophic backtracking when the glob pattern contains many consecutive asterisks followed by a literal character that is not present in the string being matched. Each '*' becomes a separate lazy '[^/]*?' group; when the match ultimately fails, V8 explores an exponentially growing number of ways to split the input across those groups. The result is CPU exhaustion and event-loop blocking in Node.js applications that pass attacker-controlled input as the minimatch pattern. The impact is availability loss, not data disclosure or code execution.

Why it matters to the business

Applications that expose glob, path-filter, search, routing, allowlist, denylist, file-selection, or rule-matching features backed by minimatch may be remotely slowed or made unavailable with a small request payload. Because exploitation requires no authentication in exposed use cases and public exploit techniques are available, internet-facing services using vulnerable minimatch versions should be prioritized even though this issue is not currently listed in CISA KEV and has a low EPSS score. Operationally, successful exploitation can cause request timeouts, failed jobs, degraded APIs, container restarts, autoscaling cost spikes, and denial of service for legitimate users.

How an attack unfolds

An attacker first identifies application functionality where user input is interpreted as a glob pattern, such as file matching, artifact selection, include/exclude rules, path filters, package filters, or search masks. They then submit a pattern containing many consecutive '*' characters followed by a literal character that is absent from the target string being evaluated. When the application calls minimatch() with that attacker-supplied value as the pattern, minimatch compiles the glob into a regular expression containing many adjacent lazy wildcard groups. If the candidate string does not contain the trailing literal, the regex engine repeatedly backtracks across possible wildcard splits. With enough consecutive asterisks, one request can pin the Node.js event loop for seconds or indefinitely; repeated requests can exhaust worker capacity and make the service unavailable.

How to fix it

Upgrade minimatch to version 10.2.1 or later. For source-based consumers, ensure the fix containing commit 6d7ac34de6979f0b028b34fecd40349cd4dde186 is present. Rebuild and redeploy applications after dependency updates, and verify lockfiles are updated so transitive dependencies do not continue resolving to minimatch 10.2.0 or earlier. If immediate upgrade is not possible, mitigate by rejecting or normalizing user-supplied glob patterns with excessive consecutive '*' characters, imposing strict maximum pattern length and wildcard-run length, applying request timeouts, isolating glob evaluation from the main event loop where feasible, rate-limiting unauthenticated pattern-matching endpoints, and avoiding passing untrusted input as the minimatch pattern argument.

How to confirm the fix worked

Confirm dependency resolution shows minimatch 10.2.1 or later in package manifests and lockfiles, including transitive dependency trees. Use package-audit tooling, software composition analysis, or commands such as npm ls minimatch, pnpm why minimatch, or yarn why minimatch to identify remaining vulnerable versions. In staging, exercise legitimate glob functionality and verify behavior remains correct. Also test that patterns with long consecutive '*' runs are rejected, normalized, or complete quickly without event-loop stalls. Operational validation should include monitoring CPU, Node.js event-loop delay, request latency, timeout rates, and worker restarts before and after remediation.

Typical attack path

  1. Find an API, web form, CLI-backed service, CI/CD workflow, repository browser, file filter, or rule engine that accepts glob-style patterns from users.
  2. Confirm the application uses minimatch or a downstream package that invokes minimatch with the user value as the pattern argument.
  3. Submit a crafted glob containing a long run of consecutive '*' characters followed by a literal character unlikely to appear in the matched string.
  4. Trigger matching against one or more candidate strings that do not contain the trailing literal character.
  5. Cause catastrophic regex backtracking inside the Node.js process, blocking the event loop and consuming CPU.
  6. Repeat the request or target multiple workers to produce sustained service degradation or outage.

How to detect it

Review application, API gateway, reverse proxy, WAF, and load balancer logs for requests containing unusually long runs of asterisks in parameters or JSON fields used for glob-style matching, particularly names such as pattern, glob, filter, include, excludes, path, files, mask, rule, matcher, or search. Include URL-decoded searches for repeated '%2A' sequences. Correlate these requests with sudden increases in Node.js CPU utilization, event-loop lag, request latency, worker saturation, 499/502/503/504 responses, application-level timeout errors, container restarts, and process supervisor restarts. In APM traces, look for long spans or stalled requests around minimatch(), path filtering, rule matching, file selection, or repository/artifact search operations. Because exploitation primarily causes denial of service and may not write files or spawn processes, absence of host artifacts does not rule out exploitation; the strongest evidence is a suspicious wildcard-heavy request immediately preceding resource exhaustion.

  • ***************a
  • **********************************a
  • %2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2Aa
  • %2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2Aa
  • pattern=***************
  • glob=***************
  • filter=***************
  • include=***************
  • exclude=***************
  • mask=***************
  • "pattern":"***************
  • "glob":"***************
  • "filter":"***************
  • "include":"***************
  • "exclude":"***************
  • "mask":"***************
  • minimatch(
  • event loop delay
  • JavaScript heap out of memory
  • Request timeout
  • upstream timed out
  • HTTP 504
  • HTTP 503

What your security team should do

  • Inventory all JavaScript and Node.js applications, build tools, CLIs, CI/CD components, and services that include minimatch directly or transitively.
  • Prioritize internet-facing or unauthenticated features that accept glob-like user input, especially pattern, path, include, exclude, filter, mask, or rule parameters.
  • Upgrade minimatch to 10.2.1 or later and refresh lockfiles; verify the fixed commit 6d7ac34de6979f0b028b34fecd40349cd4dde186 is included where source builds are used.
  • Add input validation that limits pattern length and blocks long consecutive '*' runs before glob evaluation.
  • Add or tune rate limits, request timeouts, circuit breakers, and event-loop delay alerts for endpoints that perform pattern matching.
  • Search historical logs for suspicious long wildcard runs and correlate with CPU spikes, request timeouts, 502/503/504 responses, container restarts, or Node.js process restarts.
  • Create regression tests for pathological glob patterns so future dependency or code changes do not reintroduce ReDoS behavior.

The record

minimatch is a minimal matching utility for converting glob expressions into JavaScript RegExp objects. Versions 10.2.0 and below are vulnerable to Regular Expression Denial of Service (ReDoS) when a glob pattern contains many consecutive * wildcards followed by a literal character that doesn't appear in the test string. Each * compiles to a separate [^/]*? regex group, and when the match fails, V8's regex engine backtracks exponentially across all possible splits. The time complexity is O(4^N) where N is the number of * characters. With N=15, a single minimatch() call takes ~2 seconds. With N=34, it hangs effectively forever. Any application that passes user-controlled strings to minimatch() as the pattern argument is vulnerable to DoS. This issue has been fixed in version 10.2.1.

Affected packages

Ecosystem Package Introduced Fixed
npm minimatch 0 3.1.3
npm minimatch 10.0.0 10.2.1
npm minimatch 4.0.0 4.2.4
npm minimatch 5.0.0 5.1.7
npm minimatch 6.0.0 6.2.1
npm minimatch 7.0.0 7.4.7
npm minimatch 8.0.0 8.0.5
npm minimatch 9.0.0 9.0.6
Chainguard actions-runner 0 2.332.0-r0
Chainguard arangodb-3.11 0 3.11.14.3-r1
Chainguard arangodb-3.12 0 3.12.7.2-r2
Chainguard code-server 0 4.106.3-r5
Chainguard emscripten 0 5.0.1-r2
Chainguard eslint 0 10.0.1-r0
Chainguard foxx-cli 0 2.1.1-r4
Chainguard gemini-cli 0 0.30.0-r0
Chainguard graalvm-25-ce-nodejs 0 25.0.2-r3
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-r12
Chainguard kubeflow-pipelines-frontend 0 2.16.0-r0
Chainguard langfuse-2-worker 0 2.95.12-r11
Chainguard langfuse-3 0 3.155.1-r2
Chainguard langfuse-3-worker 0 3.155.1-r2
Chainguard langfuse-fips-2-worker 0 2.95.12-r13
Chainguard langfuse-fips-3 0 3.155.1-r1
Chainguard langfuse-fips-3-worker 0 3.155.1-r1
Chainguard lerna 0 9.0.4-r3
Chainguard librechat 0 0.8.2-r5
Chainguard node-gyp 0 12.2.0-r2
Chainguard npm 0 11.10.1-r0
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.0-r1
Chainguard pelias-api 0 7.6.0-r3
Chainguard prism 0 5.14.3-r8
Chainguard pulumi-language-nodejs 0 3.223.0-r1
Chainguard rancher-api-ui 0 1.2.3-r5
Chainguard redisinsight 0 3.0.3-r1
Chainguard renovate 0 43.38.0-r1
Chainguard serve 0 14.2.6-r0
Chainguard sqlpad 0 7.5.7-r10
Chainguard tileserver-gl 0 5.5.0-r5
Chainguard tileserver-gl-fips 0 5.5.0-r6
Chainguard vitess-22 0 22.0.3-r2
Chainguard vitess-23 0 23.0.2-r1
Wolfi code-server 0 4.106.3-r5
Wolfi eslint 0 10.0.1-r0
Wolfi kubeflow-centraldashboard 0 1.10.0-r12
Wolfi kubeflow-pipelines-frontend 0 2.16.0-r0
Wolfi langfuse-3 0 3.155.1-r2
Wolfi langfuse-3-worker 0 3.155.1-r2
Wolfi lerna 0 9.0.4-r3
Wolfi node-gyp 0 12.2.0-r2
Wolfi npm 0 11.10.1-r0
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.223.0-r1
Wolfi rancher-api-ui 0 1.2.3-r5
Wolfi renovate 0 43.38.0-r1
Wolfi serve 0 14.2.6-r0
Wolfi sqlpad 0 7.5.7-r10
Wolfi tileserver-gl 0 5.5.0-r5
Wolfi vitess-22 0 22.0.3-r2
Wolfi vitess-23 0 23.0.2-r1
openSUSE:Leap 16.0 cockpit 0 354-160000.2.1
openSUSE:Leap 16.0 cockpit-machines 0 346-160000.2.1
openSUSE:Leap 16.0 cockpit-packages 0 4-160000.1.1
openSUSE:Leap 16.0 cockpit-podman 0 117-160000.2.1
openSUSE:Leap 16.0 cockpit-repos 0 4.7-160000.2.1
openSUSE:Leap 16.0 cockpit-subscriptions 0 12.1-160000.3.1
openSUSE:Tumbleweed openQA 0 5.1782995932.ffeb09be-1.1
openSUSE:Tumbleweed velociraptor 0 0.7.0.4.git185.a5708584-2.1

Related vulnerabilities