CVE-2021-33502
High · 7.5CVSS
7.5
EPSS
1.7%
Published
May 24, 2021
CISA due date
—
Cloudanix analysis
A flaw in a common URL-handling component can let someone make affected web services slow down or stop responding by submitting a specially crafted link.
- 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
The normalize-url Node.js package contains a regular expression denial-of-service weakness when processing specially crafted data: URLs. In affected versions before 4.5.1, 5.x before 5.3.1, and 6.x before 6.0.1, certain malformed or adversarial data: URL strings can trigger exponential regular-expression backtracking. If an application normalizes attacker-controlled URLs synchronously in a request path, a single crafted input can consume excessive CPU time and block the Node.js event loop, degrading or preventing service availability. The issue does not directly provide code execution, data disclosure, or privilege escalation; its impact is availability loss.
Why it matters to the business
Applications that accept and normalize user-supplied URLs may become slow or unavailable if an attacker sends crafted data: URL values. Because Node.js services often rely on a single event loop per process, CPU exhaustion in URL normalization can affect all concurrent users served by that process. Public APIs, link-preview services, webhooks, crawlers, redirect validation, content ingestion, and form-processing workflows are the most likely business-impact areas. The vulnerability is older, not listed in CISA KEV, has no known ransomware association, and has relatively low EPSS, but remediation is still important because the flaw is remotely triggerable without authentication where vulnerable URL normalization is exposed.
How an attack unfolds
An attacker first identifies an endpoint or workflow that accepts a URL-like value and passes it to normalize-url, such as a submitted website field, redirect parameter, webhook target, feed URL, profile link, import URL, or API payload. The attacker then submits a specially crafted data: URL designed to exercise the vulnerable regular expression path. When the application attempts to normalize that value, the regex engine performs excessive backtracking and consumes CPU for an abnormally long time. In a Node.js process, this can block the event loop, delaying unrelated requests and potentially causing upstream timeouts, health-check failures, process restarts, autoscaling events, or sustained service degradation if repeated. Exploitation requires no authentication if the affected input is publicly reachable, but it requires the vulnerable package version and a code path that normalizes attacker-controlled data: URLs.
How to fix it
Upgrade normalize-url to a fixed version appropriate for the dependency line: 4.5.1 or later for 4.x, 5.3.1 or later for 5.x, and 6.0.1 or later for 6.x. If consuming directly from the Git repository, use a version containing commit 305e3f22efb87505d3bc87c17c50b1ef67789acb or later. Regenerate lockfiles and redeploy all services that bundle the vulnerable package, including transitive consumers. Where immediate upgrade is not possible, reject or strictly limit data: URLs before calling normalize-url, enforce maximum URL length, apply request body and parameter size limits, use request timeouts, rate-limit unauthenticated URL-submission endpoints, and isolate CPU-heavy parsing from latency-sensitive request handlers. Do not rely on WAF filtering alone because payload details may vary and the vulnerable behavior occurs inside application-side parsing.
How to confirm the fix worked
Confirm that dependency manifests and lockfiles no longer resolve normalize-url to affected versions: any version before 4.5.1, 5.x before 5.3.1, or 6.x before 6.0.1 should be treated as vulnerable. Validate built artifacts and container images because JavaScript dependencies may be vendored or bundled during build. Run software composition analysis against package-lock.json, npm-shrinkwrap.json, yarn.lock, pnpm-lock.yaml, and deployed images. Functionally test endpoints that accept URL input with benign long data: URL values and verify that requests are rejected quickly or handled within normal latency bounds. Monitor CPU utilization and event-loop delay under test to ensure malformed URL inputs cannot cause disproportionate processing time.
Typical attack path
- Find a public endpoint, API, form, webhook, crawler, or import feature that accepts URL input.
- Submit test values to determine whether data: URLs are accepted or processed.
- Send a crafted data: URL that triggers catastrophic regex backtracking in vulnerable normalize-url versions.
- Cause the Node.js process to spend excessive CPU time during URL normalization.
- Repeat requests or distribute them across sources to sustain event-loop blocking and service degradation.
- Observe application slowdowns, request timeouts, failed health checks, or process restarts as the denial-of-service effect.
How to detect it
This vulnerability causes denial of service rather than persistent compromise, so detection should focus on evidence of attempted or successful resource exhaustion. Review HTTP access logs, API gateway logs, load balancer logs, WAF logs, application logs, APM traces, and Node.js runtime telemetry for requests containing data: URL values, especially unusually long values or repeated submissions to URL-processing endpoints. Correlate those requests with spikes in CPU usage, event-loop lag, request latency, upstream timeouts, HTTP 408/429/499/500/502/503/504 responses, container restarts, process manager restarts, failed health checks, or autoscaling events. Examine application error logs for request timeout messages and performance traces showing time spent in URL normalization or regex processing. Because payloads may be URL-encoded or embedded in JSON bodies, decode request parameters and inspect body samples where retention and privacy policies permit. There are no widely reliable attacker-specific network indicators for this issue; detection is behavior- and payload-pattern based.
- data:
- %64%61%74%61%3A
- data%3A
- normalize-url
- package-lock.json
- node_modules/normalize-url/package.json
- "normalize-url"
- "version": "4.
- "version": "5.
- "version": "6.0.0"
- event loop lag
- Event loop delay
- request timeout
- upstream timed out
- HTTP 503
- HTTP 504
What your security team should do
- Inventory all applications and services using normalize-url directly or transitively, prioritizing internet-facing Node.js services that process user-supplied URLs.
- Upgrade normalize-url to 4.5.1+, 5.3.1+, or 6.0.1+ depending on the major version in use, and rebuild/redeploy affected services.
- Add input validation that rejects data: URLs unless explicitly required; if required, enforce strict length, media-type, and character constraints before normalization.
- Apply request-size limits, per-endpoint rate limits, and timeouts to unauthenticated URL-submission paths.
- Search historical logs for unusually long data: URL parameters, elevated request latency, HTTP 408/499/500/502/503/504 spikes, Node.js event-loop delay, and CPU saturation around URL-processing endpoints.
- Add dependency scanning gates so vulnerable normalize-url versions cannot be introduced through direct or transitive dependencies.
- Ensure production monitoring alerts on event-loop lag, high CPU, request queue depth, and repeated health-check failures for Node.js services.
The record
The normalize-url package before 4.5.1, 5.x before 5.3.1, and 6.x before 6.0.1 for Node.js has a ReDoS (regular expression denial of service) issue because it has exponential performance for data: URLs.
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|---|---|---|
| npm | normalize-url | 4.3.0 | 4.5.1 |
| npm | normalize-url | 5.0.0 | 5.3.1 |
| npm | normalize-url | 6.0.0 | No fix |
| npm | normalize-url | 6.0.0 | 6.0.1 |
| AlmaLinux:8 | nodejs | 0 | 1:16.13.1-3.module_el8.5.0+246+05401605 |
| AlmaLinux:8 | nodejs | 0 | 1:16.13.1-3.module_el8.5.0+2605+45d748af |
| AlmaLinux:8 | nodejs | 0 | 1:14.18.2-2.module_el8.5.0+254+b4526b16 |
| AlmaLinux:8 | nodejs | 0 | 1:14.18.2-2.module_el8.5.0+2618+8d46dafd |
| AlmaLinux:8 | nodejs-devel | 0 | 1:16.13.1-3.module_el8.5.0+246+05401605 |
| AlmaLinux:8 | nodejs-devel | 0 | 1:16.13.1-3.module_el8.5.0+2605+45d748af |
| AlmaLinux:8 | nodejs-devel | 0 | 1:14.18.2-2.module_el8.5.0+254+b4526b16 |
| AlmaLinux:8 | nodejs-devel | 0 | 1:14.18.2-2.module_el8.5.0+2618+8d46dafd |
| AlmaLinux:8 | nodejs-docs | 0 | 1:16.13.1-3.module_el8.5.0+246+05401605 |
| AlmaLinux:8 | nodejs-docs | 0 | 1:16.13.1-3.module_el8.5.0+2605+45d748af |
| AlmaLinux:8 | nodejs-docs | 0 | 1:14.18.2-2.module_el8.5.0+254+b4526b16 |
| AlmaLinux:8 | nodejs-docs | 0 | 1:14.18.2-2.module_el8.5.0+2618+8d46dafd |
| AlmaLinux:8 | nodejs-full-i18n | 0 | 1:16.13.1-3.module_el8.5.0+246+05401605 |
| AlmaLinux:8 | nodejs-full-i18n | 0 | 1:16.13.1-3.module_el8.5.0+2605+45d748af |
| AlmaLinux:8 | nodejs-full-i18n | 0 | 1:14.18.2-2.module_el8.5.0+254+b4526b16 |
| AlmaLinux:8 | nodejs-full-i18n | 0 | 1:14.18.2-2.module_el8.5.0+2618+8d46dafd |
| AlmaLinux:8 | nodejs-nodemon | 0 | 2.0.15-1.module_el8.5.0+2605+45d748af |
| AlmaLinux:8 | nodejs-nodemon | 0 | 2.0.15-1.module_el8.6.0+2904+f21ad6f4 |
| AlmaLinux:8 | nodejs-nodemon | 0 | 2.0.15-1.module_el8.5.0+2618+8d46dafd |
| AlmaLinux:8 | nodejs-packaging | 0 | 25-1.module_el8.5.0+246+05401605 |
| AlmaLinux:8 | nodejs-packaging | 0 | 25-1.module_el8.5.0+2605+45d748af |
| AlmaLinux:8 | nodejs-packaging | 0 | 23-3.module_el8.4.0+2522+3bd42762 |
| AlmaLinux:8 | nodejs-packaging | 0 | 23-3.module_el8.5.0+2618+8d46dafd |
| AlmaLinux:8 | npm | 0 | 1:8.1.2-1.16.13.1.3.module_el8.5.0+246+05401605 |
| AlmaLinux:8 | npm | 0 | 1:8.1.2-1.16.13.1.3.module_el8.5.0+2605+45d748af |
| AlmaLinux:8 | npm | 0 | 1:6.14.15-1.14.18.2.2.module_el8.5.0+254+b4526b16 |
| AlmaLinux:8 | npm | 0 | 1:6.14.15-1.14.18.2.2.module_el8.5.0+2618+8d46dafd |
| AlmaLinux:9 | nodejs | 0 | 1:16.16.0-1.el9_0 |
| AlmaLinux:9 | nodejs-docs | 0 | 1:16.16.0-1.el9_0 |
| AlmaLinux:9 | nodejs-full-i18n | 0 | 1:16.16.0-1.el9_0 |
| AlmaLinux:9 | nodejs-libs | 0 | 1:16.16.0-1.el9_0 |
| AlmaLinux:9 | nodejs-nodemon | 0 | 2.0.19-1.el9_0 |
| AlmaLinux:9 | npm | 0 | 1:8.11.0-1.16.16.0.1.el9_0 |
| Debian:11 | node-got | 0 | 11.8.1+~cs53.13.17-3 |
| Debian:12 | node-got | 0 | 11.8.1+~cs53.13.17-3 |
| Debian:13 | node-got | 0 | 11.8.1+~cs53.13.17-3 |
| Debian:14 | node-got | 0 | 11.8.1+~cs53.13.17-3 |
| Red Hat:enterprise_linux:8::appstream | nodejs | 0 | 1:16.13.1-3.module+el8.5.0+13548+45d748af |
| Red Hat:enterprise_linux:8::appstream | nodejs | 0 | 1:14.18.2-2.module+el8.5.0+13644+8d46dafd |
| Red Hat:enterprise_linux:8::appstream | nodejs-debuginfo | 0 | 1:16.13.1-3.module+el8.5.0+13548+45d748af |
| Red Hat:enterprise_linux:8::appstream | nodejs-debuginfo | 0 | 1:14.18.2-2.module+el8.5.0+13644+8d46dafd |
| Red Hat:enterprise_linux:8::appstream | nodejs-debugsource | 0 | 1:16.13.1-3.module+el8.5.0+13548+45d748af |
| Red Hat:enterprise_linux:8::appstream | nodejs-debugsource | 0 | 1:14.18.2-2.module+el8.5.0+13644+8d46dafd |
| Red Hat:enterprise_linux:8::appstream | nodejs-devel | 0 | 1:16.13.1-3.module+el8.5.0+13548+45d748af |
| Red Hat:enterprise_linux:8::appstream | nodejs-devel | 0 | 1:14.18.2-2.module+el8.5.0+13644+8d46dafd |
| Red Hat:enterprise_linux:8::appstream | nodejs-docs | 0 | 1:16.13.1-3.module+el8.5.0+13548+45d748af |
| Red Hat:enterprise_linux:8::appstream | nodejs-docs | 0 | 1:14.18.2-2.module+el8.5.0+13644+8d46dafd |
| Red Hat:enterprise_linux:8::appstream | nodejs-full-i18n | 0 | 1:16.13.1-3.module+el8.5.0+13548+45d748af |
| Red Hat:enterprise_linux:8::appstream | nodejs-full-i18n | 0 | 1:14.18.2-2.module+el8.5.0+13644+8d46dafd |
| Red Hat:enterprise_linux:8::appstream | nodejs-nodemon | 0 | 0:2.0.15-1.module+el8.5.0+13548+45d748af |
| Red Hat:enterprise_linux:8::appstream | nodejs-nodemon | 0 | 0:2.0.15-1.module+el8.5.0+13504+a2e74d91 |
| Red Hat:enterprise_linux:8::appstream | nodejs-packaging | 0 | 0:25-1.module+el8.5.0+10992+fac5fe06 |
| Red Hat:enterprise_linux:8::appstream | nodejs-packaging | 0 | 0:23-3.module+el8.3.0+6519+9f98ed83 |
| Red Hat:enterprise_linux:8::appstream | npm | 0 | 1:8.1.2-1.16.13.1.3.module+el8.5.0+13548+45d748af |
| Red Hat:enterprise_linux:8::appstream | npm | 0 | 1:6.14.15-1.14.18.2.2.module+el8.5.0+13644+8d46dafd |
| Red Hat:enterprise_linux:9::appstream | nodejs | 0 | 1:16.16.0-1.el9_0 |
| Red Hat:enterprise_linux:9::appstream | nodejs-debuginfo | 0 | 1:16.16.0-1.el9_0 |
| Red Hat:enterprise_linux:9::appstream | nodejs-debugsource | 0 | 1:16.16.0-1.el9_0 |
| Red Hat:enterprise_linux:9::appstream | nodejs-docs | 0 | 1:16.16.0-1.el9_0 |
| Red Hat:enterprise_linux:9::appstream | nodejs-full-i18n | 0 | 1:16.16.0-1.el9_0 |
| Red Hat:enterprise_linux:9::appstream | nodejs-libs | 0 | 1:16.16.0-1.el9_0 |
| Red Hat:enterprise_linux:9::appstream | nodejs-libs-debuginfo | 0 | 1:16.16.0-1.el9_0 |
| Red Hat:enterprise_linux:9::appstream | nodejs-nodemon | 0 | 0:2.0.19-1.el9_0 |
| Red Hat:enterprise_linux:9::appstream | npm | 0 | 1:8.11.0-1.16.16.0.1.el9_0 |
| Red Hat:rhel_eus:8.4::appstream | nodejs | 0 | 1:14.18.2-2.module+el8.4.0+13643+6c0ebf22 |
| Red Hat:rhel_eus:8.4::appstream | nodejs-debuginfo | 0 | 1:14.18.2-2.module+el8.4.0+13643+6c0ebf22 |
| Red Hat:rhel_eus:8.4::appstream | nodejs-debugsource | 0 | 1:14.18.2-2.module+el8.4.0+13643+6c0ebf22 |
| Red Hat:rhel_eus:8.4::appstream | nodejs-devel | 0 | 1:14.18.2-2.module+el8.4.0+13643+6c0ebf22 |
| Red Hat:rhel_eus:8.4::appstream | nodejs-docs | 0 | 1:14.18.2-2.module+el8.4.0+13643+6c0ebf22 |
| Red Hat:rhel_eus:8.4::appstream | nodejs-full-i18n | 0 | 1:14.18.2-2.module+el8.4.0+13643+6c0ebf22 |
| Red Hat:rhel_eus:8.4::appstream | nodejs-nodemon | 0 | 0:2.0.15-1.module+el8.4.0+13503+fc29810b |
| Red Hat:rhel_eus:8.4::appstream | nodejs-packaging | 0 | 0:23-3.module+el8.3.0+6519+9f98ed83 |
| Red Hat:rhel_eus:8.4::appstream | npm | 0 | 1:6.14.15-1.14.18.2.2.module+el8.4.0+13643+6c0ebf22 |
| Red Hat:rhel_software_collections:3::el7 | rh-nodejs12-nodejs | 0 | 0:12.22.2-1.el7 |
| Red Hat:rhel_software_collections:3::el7 | rh-nodejs12-nodejs-debuginfo | 0 | 0:12.22.2-1.el7 |
| Red Hat:rhel_software_collections:3::el7 | rh-nodejs12-nodejs-devel | 0 | 0:12.22.2-1.el7 |
| Red Hat:rhel_software_collections:3::el7 | rh-nodejs12-nodejs-docs | 0 | 0:12.22.2-1.el7 |
| Red Hat:rhel_software_collections:3::el7 | rh-nodejs12-nodejs-nodemon | 0 | 0:2.0.3-2.el7 |
| Red Hat:rhel_software_collections:3::el7 | rh-nodejs12-npm | 0 | 0:6.14.13-12.22.2.1.el7 |
| Red Hat:rhel_software_collections:3::el7 | rh-nodejs14-nodejs | 0 | 0:14.17.2-1.el7 |
| Red Hat:rhel_software_collections:3::el7 | rh-nodejs14-nodejs-debuginfo | 0 | 0:14.17.2-1.el7 |
| Red Hat:rhel_software_collections:3::el7 | rh-nodejs14-nodejs-devel | 0 | 0:14.17.2-1.el7 |
| Red Hat:rhel_software_collections:3::el7 | rh-nodejs14-nodejs-docs | 0 | 0:14.17.2-1.el7 |
| Red Hat:rhel_software_collections:3::el7 | rh-nodejs14-nodejs-nodemon | 0 | 0:2.0.3-2.el7 |
| Red Hat:rhel_software_collections:3::el7 | rh-nodejs14-npm | 0 | 0:6.14.13-14.17.2.1.el7 |
| Red Hat:rhev_manager:4.4:el8 | ovirt-engine | 0 | 0:4.5.0.7-0.9.el8ev |
| Red Hat:rhev_manager:4.4:el8 | ovirt-engine-backend | 0 | 0:4.5.0.7-0.9.el8ev |
| Red Hat:rhev_manager:4.4:el8 | ovirt-engine-dbscripts | 0 | 0:4.5.0.7-0.9.el8ev |
| Red Hat:rhev_manager:4.4:el8 | ovirt-engine-health-check-bundler | 0 | 0:4.5.0.7-0.9.el8ev |
| Red Hat:rhev_manager:4.4:el8 | ovirt-engine-restapi | 0 | 0:4.5.0.7-0.9.el8ev |
| Red Hat:rhev_manager:4.4:el8 | ovirt-engine-setup | 0 | 0:4.5.0.7-0.9.el8ev |
| Red Hat:rhev_manager:4.4:el8 | ovirt-engine-setup-base | 0 | 0:4.5.0.7-0.9.el8ev |
| Red Hat:rhev_manager:4.4:el8 | ovirt-engine-setup-plugin-cinderlib | 0 | 0:4.5.0.7-0.9.el8ev |
| Red Hat:rhev_manager:4.4:el8 | ovirt-engine-setup-plugin-imageio | 0 | 0:4.5.0.7-0.9.el8ev |
| Red Hat:rhev_manager:4.4:el8 | ovirt-engine-setup-plugin-ovirt-engine | 0 | 0:4.5.0.7-0.9.el8ev |
| Red Hat:rhev_manager:4.4:el8 | ovirt-engine-setup-plugin-ovirt-engine-common | 0 | 0:4.5.0.7-0.9.el8ev |
| Red Hat:rhev_manager:4.4:el8 | ovirt-engine-setup-plugin-vmconsole-proxy-helper | 0 | 0:4.5.0.7-0.9.el8ev |
| Red Hat:rhev_manager:4.4:el8 | ovirt-engine-setup-plugin-websocket-proxy | 0 | 0:4.5.0.7-0.9.el8ev |
| Red Hat:rhev_manager:4.4:el8 | ovirt-engine-tools | 0 | 0:4.5.0.7-0.9.el8ev |
| Red Hat:rhev_manager:4.4:el8 | ovirt-engine-tools-backup | 0 | 0:4.5.0.7-0.9.el8ev |
| Red Hat:rhev_manager:4.4:el8 | ovirt-engine-ui-extensions | 0 | 0:1.3.3-1.el8ev |
| Red Hat:rhev_manager:4.4:el8 | ovirt-engine-vmconsole-proxy-helper | 0 | 0:4.5.0.7-0.9.el8ev |
| Red Hat:rhev_manager:4.4:el8 | ovirt-engine-webadmin-portal | 0 | 0:4.5.0.7-0.9.el8ev |
| Red Hat:rhev_manager:4.4:el8 | ovirt-engine-websocket-proxy | 0 | 0:4.5.0.7-0.9.el8ev |
| Red Hat:rhev_manager:4.4:el8 | ovirt-web-ui | 0 | 0:1.8.1-2.el8ev |
| Red Hat:rhev_manager:4.4:el8 | python3-ovirt-engine-lib | 0 | 0:4.5.0.7-0.9.el8ev |
| Red Hat:rhev_manager:4.4:el8 | rhvm | 0 | 0:4.5.0.7-0.9.el8ev |
| Rocky Linux:8 | nodejs | 0 | 1:16.13.1-3.module+el8.5.0+721+4c107270 |
| Rocky Linux:8 | nodejs | 0 | 1:14.18.2-2.module+el8.5.0+733+de4fee6c |
| Rocky Linux:8 | nodejs-nodemon | 0 | 0:2.0.15-1.module+el8.5.0+721+4c107270 |
| Rocky Linux:8 | nodejs-packaging | 0 | 0:25-1.module+el8.6.0+1046+80feca58 |
| Rocky Linux:8 | nodejs-packaging | 0 | 0:23-3.module+el8.7.0+1071+4bdda2a8 |
| Rocky Linux:9 | nodejs-nodemon | 0 | 0:2.0.19-1.el9_0 |
| Ubuntu:18.04:LTS | node-got | 0 | No fix |
| Ubuntu:20.04:LTS | node-got | 0 | No fix |
| Ubuntu:20.04:LTS | node-yarnpkg | 0 | No fix |
| Ubuntu:22.04:LTS | node-got | 0 | No fix |
| Ubuntu:22.04:LTS | node-yarnpkg | 0 | No fix |
| Ubuntu:24.04:LTS | node-got | 0 | No fix |
| Ubuntu:24.04:LTS | node-yarnpkg | 0 | No fix |
| Ubuntu:24.10 | node-got | 0 | No fix |
| Ubuntu:24.10 | node-yarnpkg | 0 | No fix |
| Ubuntu:25.04 | node-got | 0 | No fix |
| Ubuntu:25.04 | node-yarnpkg | 0 | No fix |
| Ubuntu:25.10 | node-got | 0 | No fix |
| Ubuntu:25.10 | node-yarnpkg | 0 | No fix |
| Ubuntu:Pro:18.04:LTS | node-got | 0 | No fix |
| Ubuntu:Pro:20.04:LTS | node-got | 0 | No fix |
| Ubuntu:Pro:20.04:LTS | node-yarnpkg | 0 | No fix |
Related vulnerabilities
- CVE-2025-6965 There exists a vulnerability in SQLite versions before 3.50.2 where the number of… Also affects nodejs
- CVE-2025-3277 An integer overflow can be triggered in SQLite’s `concat_ws()` function. Also affects nodejs
- CVE-2025-31498 c-ares is an asynchronous resolver library. Also affects nodejs
- CVE-2025-23085 A memory leak could occur when a remote peer abruptly closes the socket without sending a… Also affects nodejs
- CVE-2025-23083 With the aid of the diagnostics_channel utility, an event can be hooked into whenever a… Also affects nodejs
- CVE-2025-22150 Undici is an HTTP/1.1 client. Also affects nodejs
- CVE-2023-39333 Maliciously crafted export names in an imported WebAssembly module can inject JavaScript… Also affects nodejs
- CVE-2023-46809 Node.js versions which bundle an unpatched version of OpenSSL or run against a… Also affects nodejs