CVE-2026-33750
Medium · 6.5CVSS
6.5
EPSS
0.6%
Published
Mar 27, 2026
CISA due date
—
Cloudanix analysis
A specially crafted text pattern can make affected software consume excessive resources and stop responding.
- Exploitation
- Requires User Interaction
- Attacker needs
- User Interaction
- Complexity
- Moderate
- Impact
- Denial Of Service
- Component
- Library
- Class
- Denial of service
- Remediation
- Upgrade
- Effort
- Medium
- Patch risk
- Low
What it actually does
The flaw is an uncontrolled resource consumption issue in the juliangruber brace-expansion library. When the library expands a numeric brace expression that uses a zero step value, such as `{1..2..0}`, sequence generation does not terminate as expected. Applications that pass attacker-controlled or untrusted strings to `expand()` can be forced into a long-running loop and excessive heap memory allocation, causing high CPU usage, memory exhaustion, event-loop blocking, process hangs, or process termination. The impact is availability loss only; the vulnerability does not directly provide code execution, data disclosure, or data modification.
Why it matters to the business
Applications, build tools, developer platforms, APIs, or services that use vulnerable versions of brace-expansion and process user-supplied patterns may be susceptible to denial of service. A small crafted input can degrade performance or make a service unavailable, potentially causing failed requests, job backlogs, degraded developer workflows, outages, and increased infrastructure costs from repeated crashes or autoscaling. The CVSS score is moderate-high for availability impact, but the current EPSS score is low and there is no CISA KEV listing or known ransomware association, so remediation should be prioritized based on whether untrusted input reaches this library.
How an attack unfolds
An attacker first identifies an application feature that accepts strings later processed by brace-expansion, such as file globbing, path expansion, pattern matching, search filters, template expansion, build configuration, package tooling, or API parameters. The attacker submits a crafted brace expression containing a zero step value, for example `{1..2..0}`. If the application uses a vulnerable version of brace-expansion and does not validate the input, the library enters a non-terminating or highly resource-intensive sequence generation path. This can block the application thread, consume large amounts of memory, trigger garbage collection pressure, exhaust container or process memory limits, and ultimately cause slow responses, timeouts, crashes, or service restarts. Repeated submissions can sustain a denial-of-service condition.
How to fix it
Upgrade the brace-expansion package to a fixed version appropriate for the major release line in use: 5.0.5 or later, 3.0.2 or later, 2.0.3 or later, or 1.1.13 or later. Regenerate lockfiles and redeploy all applications, containers, build images, serverless functions, and developer tooling that bundle the vulnerable dependency, including transitive dependency copies. If immediate upgrade is not possible, sanitize all strings before calling `expand()` and reject brace ranges with a zero step value. Input validation should block numeric range expressions where the third range component is `0`, including whitespace and signed-zero variants where applicable. Add request size limits, execution timeouts, memory limits, and rate limiting around features that process user-supplied patterns. Where feasible, avoid passing untrusted input to brace expansion entirely.
How to confirm the fix worked
Confirm dependency versions using package manager tooling and lockfile review. For Node.js projects, inspect `package-lock.json`, `npm-shrinkwrap.json`, `yarn.lock`, `pnpm-lock.yaml`, SBOMs, and dependency trees for `brace-expansion` versions earlier than 5.0.5, 3.0.2, 2.0.3, or 1.1.13. Run `npm ls brace-expansion`, `yarn why brace-expansion`, or `pnpm why brace-expansion` as appropriate. Validate that rebuilt artifacts and container images no longer contain vulnerable versions. Add a negative test that submits `{1..2..0}` and confirms the application rejects it quickly or handles it without elevated CPU/memory usage. Monitor runtime behavior during the test to ensure there is no process hang, heap growth, request timeout, or restart.
Typical attack path
- Find an application endpoint, job processor, CLI workflow, or build/dependency tool that accepts user-controlled brace, glob, or pattern strings.
- Submit a brace expansion pattern with a zero step value, such as `{1..2..0}` or a nested variant embedded inside otherwise valid input.
- Trigger application code that passes the crafted string into `brace-expansion`'s `expand()` function.
- Cause the vulnerable sequence generation loop to run indefinitely or allocate excessive heap memory.
- Repeat requests or jobs to maintain high CPU and memory pressure, leading to hangs, timeouts, process crashes, or service unavailability.
How to detect it
To assess whether exploitation already occurred, review application access logs, API gateway logs, reverse proxy logs, WAF logs, job-submission records, CI/CD logs, and application error logs for brace range inputs containing a zero step value. Focus on requests or jobs that include patterns like `{number..number..0}` and occurred shortly before CPU saturation, heap out-of-memory errors, container OOM kills, event-loop stalls, request timeouts, HTTP 502/503/504 responses, worker crashes, or repeated process restarts. In Node.js environments, examine logs and crash artifacts for JavaScript heap exhaustion, fatal out-of-memory errors, garbage collection pressure, unresponsive workers, and supervisor restarts. Because no public exploit maturity or named threat actor activity is currently indicated, detections should focus on anomalous input patterns and availability symptoms rather than actor-specific infrastructure.
- {1..2..0}
- ..0}
- FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
- FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory
- JavaScript heap out of memory
- Allocation failed - JavaScript heap out of memory
- OOMKilled
- out of memory
- heap out of memory
- brace-expansion
- expand()
What your security team should do
- Inventory all applications, CI/CD tooling, containers, and developer utilities that include the `brace-expansion` dependency, including transitive use through globbing or file-matching packages.
- Prioritize remediation for internet-facing services, multi-tenant platforms, job queues, build systems, or APIs where untrusted users can submit pattern, path, glob, or template strings.
- Upgrade to fixed brace-expansion versions: 5.0.5+, 3.0.2+, 2.0.3+, or 1.1.13+, and verify lockfiles and deployed artifacts were actually rebuilt.
- Add input validation to reject zero-step brace ranges before calling expansion functions, even after patching, as a defense-in-depth control.
- Apply operational controls such as request rate limiting, payload limits, worker timeouts, memory limits, and process supervision for services that process user-controlled patterns.
- Search historical logs for crafted zero-step brace expansion inputs and correlate any matches with CPU spikes, memory exhaustion, process restarts, 5xx errors, or job failures.
- Create regression tests and SCA policies to prevent vulnerable brace-expansion versions from re-entering the software supply chain.
The record
The brace-expansion library generates arbitrary strings containing a common prefix and suffix. Prior to versions 5.0.5, 3.0.2, 2.0.3, and 1.1.13, a brace pattern with a zero step value (e.g., `{1..2..0}`) causes the sequence generation loop to run indefinitely, making the process hang for seconds and allocate heaps of memory. Versions 5.0.5, 3.0.2, 2.0.3, and 1.1.13 fix the issue. As a workaround, sanitize strings passed to `expand()` to ensure a step value of `0` is not used.
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|---|---|---|
| npm | brace-expansion | 0 | 1.1.13 |
| npm | brace-expansion | 2.0.0 | 2.0.3 |
| npm | brace-expansion | 3.0.0 | 3.0.2 |
| Chainguard | arangodb-3.12 | 0 | 3.12.7.2-r5 |
| Chainguard | argo-workflows-ui-3.6 | 0 | 3.6.19-r5 |
| Chainguard | argo-workflows-ui-3.7 | 0 | 3.7.12-r2 |
| Chainguard | argo-workflows-ui-4.0 | 0 | 4.0.3-r2 |
| Chainguard | eslint | 0 | 10.1.0-r1 |
| Chainguard | gemini-cli | 0 | 0.35.3-r0 |
| Chainguard | kibana-7 | 0 | 7.17.29-r8 |
| Chainguard | kubeflow-centraldashboard | 0 | 1.10.0-r18 |
| Chainguard | langfuse-2-worker | 0 | 2.95.12-r17 |
| Chainguard | langfuse-fips-2-worker | 0 | 2.95.12-r20 |
| Chainguard | lerna | 0 | 9.0.7-r2 |
| Chainguard | npm | 0 | 11.12.1-r0 |
| Chainguard | opensearch-dashboards-2 | 0 | 2.19.5-r6 |
| Chainguard | opensearch-dashboards-2-dashboards-reporting | 0 | 2.19.5-r6 |
| Chainguard | opensearch-dashboards-2-fips | 0 | 2.19.5-r5 |
| Chainguard | opensearch-dashboards-2-fips-dashboards-reporting | 0 | 2.19.5-r5 |
| Chainguard | opensearch-dashboards-3 | 0 | 3.5.0-r13 |
| Chainguard | opensearch-dashboards-3-alerting-dashboards-plugin | 0 | 3.5.0-r13 |
| Chainguard | opensearch-dashboards-3-anomaly-detection-dashboards-plugin | 0 | 3.5.0-r13 |
| Chainguard | opensearch-dashboards-3-dashboards-maps | 0 | 3.5.0-r13 |
| Chainguard | opensearch-dashboards-3-dashboards-notifications | 0 | 3.5.0-r13 |
| Chainguard | opensearch-dashboards-3-dashboards-observability | 0 | 3.5.0-r13 |
| Chainguard | opensearch-dashboards-3-dashboards-query-workbench | 0 | 3.5.0-r13 |
| Chainguard | opensearch-dashboards-3-dashboards-reporting | 0 | 3.5.0-r13 |
| Chainguard | opensearch-dashboards-3-dashboards-search-relevance | 0 | 3.5.0-r13 |
| Chainguard | opensearch-dashboards-3-fips | 0 | 3.5.0-r8 |
| Chainguard | opensearch-dashboards-3-fips-alerting-dashboards-plugin | 0 | 3.5.0-r7 |
| Chainguard | opensearch-dashboards-3-fips-anomaly-detection-dashboards-plugin | 0 | 3.5.0-r7 |
| Chainguard | opensearch-dashboards-3-fips-dashboards-maps | 0 | 3.5.0-r7 |
| Chainguard | opensearch-dashboards-3-fips-dashboards-notifications | 0 | 3.5.0-r7 |
| Chainguard | opensearch-dashboards-3-fips-dashboards-observability | 0 | 3.5.0-r7 |
| Chainguard | opensearch-dashboards-3-fips-dashboards-query-workbench | 0 | 3.5.0-r7 |
| Chainguard | opensearch-dashboards-3-fips-dashboards-reporting | 0 | 3.5.0-r7 |
| Chainguard | opensearch-dashboards-3-fips-dashboards-search-relevance | 0 | 3.5.0-r7 |
| Chainguard | opensearch-dashboards-3-fips-index-management-dashboards-plugin | 0 | 3.5.0-r7 |
| Chainguard | opensearch-dashboards-3-fips-ml-commons-dashboards | 0 | 3.5.0-r7 |
| Chainguard | opensearch-dashboards-3-fips-security-analytics-dashboards-plugin | 0 | 3.5.0-r7 |
| Chainguard | opensearch-dashboards-3-fips-security-dashboards-plugin | 0 | 3.5.0-r7 |
| Chainguard | opensearch-dashboards-3-index-management-dashboards-plugin | 0 | 3.5.0-r13 |
| Chainguard | opensearch-dashboards-3-ml-commons-dashboards | 0 | 3.5.0-r13 |
| Chainguard | opensearch-dashboards-3-security-analytics-dashboards-plugin | 0 | 3.5.0-r13 |
| Chainguard | opensearch-dashboards-3-security-dashboards-plugin | 0 | 3.5.0-r13 |
| Chainguard | pelias-api | 0 | 7.6.0-r5 |
| Chainguard | prism | 0 | 5.14.3-r13 |
| Chainguard | pulumi-language-nodejs | 0 | 3.229.0-r3 |
| Chainguard | rancher-api-ui | 0 | 1.2.3-r8 |
| Chainguard | redisinsight | 0 | 3.2.0-r4 |
| Chainguard | renovate | 0 | 43.104.7-r1 |
| Chainguard | serve | 0 | 14.2.6-r1 |
| Chainguard | sqlpad | 0 | 7.5.7-r17 |
| Chainguard | tileserver-gl | 0 | 5.5.0-r11 |
| Chainguard | tileserver-gl-fips | 0 | 5.5.0-r11 |
| Chainguard | wazuh-dashboard | 0 | 4.14.4-r1 |
| Chainguard | wazuh-dashboard-dashboards-reporting | 0 | 4.14.4-r1 |
| Wolfi | argo-workflows-ui-3.7 | 0 | 3.7.12-r2 |
| Wolfi | argo-workflows-ui-4.0 | 0 | 4.0.3-r2 |
| Wolfi | eslint | 0 | 10.1.0-r1 |
| Wolfi | kubeflow-centraldashboard | 0 | 1.10.0-r18 |
| Wolfi | lerna | 0 | 9.0.7-r2 |
| Wolfi | npm | 0 | 11.12.1-r0 |
| Wolfi | opensearch-dashboards-2 | 0 | 2.19.5-r6 |
| Wolfi | opensearch-dashboards-2-dashboards-reporting | 0 | 2.19.5-r6 |
| Wolfi | opensearch-dashboards-3 | 0 | 3.5.0-r13 |
| Wolfi | opensearch-dashboards-3-alerting-dashboards-plugin | 0 | 3.5.0-r13 |
| Wolfi | opensearch-dashboards-3-anomaly-detection-dashboards-plugin | 0 | 3.5.0-r13 |
| Wolfi | opensearch-dashboards-3-dashboards-maps | 0 | 3.5.0-r13 |
| Wolfi | opensearch-dashboards-3-dashboards-notifications | 0 | 3.5.0-r13 |
| Wolfi | opensearch-dashboards-3-dashboards-observability | 0 | 3.5.0-r13 |
| Wolfi | opensearch-dashboards-3-dashboards-query-workbench | 0 | 3.5.0-r13 |
| Wolfi | opensearch-dashboards-3-dashboards-reporting | 0 | 3.5.0-r13 |
| Wolfi | opensearch-dashboards-3-dashboards-search-relevance | 0 | 3.5.0-r13 |
| Wolfi | opensearch-dashboards-3-index-management-dashboards-plugin | 0 | 3.5.0-r13 |
| Wolfi | opensearch-dashboards-3-ml-commons-dashboards | 0 | 3.5.0-r13 |
| Wolfi | opensearch-dashboards-3-security-analytics-dashboards-plugin | 0 | 3.5.0-r13 |
| Wolfi | opensearch-dashboards-3-security-dashboards-plugin | 0 | 3.5.0-r13 |
| Wolfi | prism | 0 | 5.14.3-r13 |
| Wolfi | pulumi-language-nodejs | 0 | 3.229.0-r3 |
| Wolfi | rancher-api-ui | 0 | 1.2.3-r8 |
| Wolfi | renovate | 0 | 43.104.7-r1 |
| Wolfi | serve | 0 | 14.2.6-r1 |
| Wolfi | sqlpad | 0 | 7.5.7-r17 |
| Wolfi | tileserver-gl | 0 | 5.5.0-r11 |
Related vulnerabilities
- GHSA-f886-m6hf-6m8v brace-expansion: Zero-step sequence causes process hang and memory exhaustion Same vulnerability
- CVE-2026-45149 The brace-expansion library generates arbitrary strings containing a common prefix and… Also affects brace-expansion
- GHSA-jxxr-4gwj-5jf2 brace-expansion: Large numeric range defeats documented `max` DoS protection Also affects brace-expansion
- CVE-2025-5889 A vulnerability was found in juliangruber brace-expansion up to 1.1.11/2.0.1/3.0.0/4.0.0. Also affects brace-expansion
- GHSA-f23m-r3pf-42rh lodash vulnerable to Prototype Pollution via array path bypass in `_.unset` and `_.omit` Also affects arangodb-3.12
- CVE-2026-2950 Impact: Lodash versions 4.17.23 and earlier are vulnerable to prototype pollution in the… Also affects arangodb-3.12
- GHSA-7r86-cg39-jmmj minimatch has ReDoS: matchOne() combinatorial backtracking via multiple non-adjacent… Also affects arangodb-3.12
- GHSA-23c5-xmqv-rm74 minimatch ReDoS: nested *() extglobs generate catastrophically backtracking regular… Also affects arangodb-3.12