express-rate-limit · Vulnerability
cve-program · CVE-2026-30827
Publishedexpress-rate-limit is a basic rate-limiting middleware for Express. In versions starting from 8.0.0 and prior to versions 8.0.2, 8.1.1, 8.2.2, and 8.3.0, the default keyGenerator in express-rate-limit applies IPv6 subnet masking (/56 by default) to all addresses that net.isIPv6() returns true for. This includes IPv4-mapped IPv6 addresses (::ffff:x.x.x.x), which Node.js returns as request.ip on dual-stack servers. Because the first 80 bits of all IPv4-mapped addresses are zero, a /56 (or any /32 to /80) subnet mask produces the same network key (::/56) for every IPv4 client. This collapses all IPv4 traffic into a single rate-limit bucket: one client exhausting the limit causes HTTP 429 for all other IPv4 clients. This issue has been patched in versions 8.0.2, 8.1.1, 8.2.2, and 8.3.0.
Read the publisher's advisoryeuvd · EUVD-2026-10113
Publishedexpress-rate-limit is a basic rate-limiting middleware for Express. In versions starting from 8.0.0 and prior to versions 8.0.2, 8.1.1, 8.2.2, and 8.3.0, the default keyGenerator in express-rate-limit applies IPv6 subnet masking (/56 by default) to all addresses that net.isIPv6() returns true for. This includes IPv4-mapped IPv6 addresses (::ffff:x.x.x.x), which Node.js returns as request.ip on dual-stack servers. Because the first 80 bits of all IPv4-mapped addresses are zero, a /56 (or any /32 to /80) subnet mask produces the same network key (::/56) for every IPv4 client. This collapses all IPv4 traffic into a single rate-limit bucket: one client exhausting the limit causes HTTP 429 for all other IPv4 clients. This issue has been patched in versions 8.0.2, 8.1.1, 8.2.2, and 8.3.0.
Read the publisher's advisorynvd · CVE-2026-30827
Publishedexpress-rate-limit is a basic rate-limiting middleware for Express. In versions starting from 8.0.0 and prior to versions 8.0.2, 8.1.1, 8.2.2, and 8.3.0, the default keyGenerator in express-rate-limit applies IPv6 subnet masking (/56 by default) to all addresses that net.isIPv6() returns true for. This includes IPv4-mapped IPv6 addresses (::ffff:x.x.x.x), which Node.js returns as request.ip on dual-stack servers. Because the first 80 bits of all IPv4-mapped addresses are zero, a /56 (or any /32 to /80) subnet mask produces the same network key (::/56) for every IPv4 client. This collapses all IPv4 traffic into a single rate-limit bucket: one client exhausting the limit causes HTTP 429 for all other IPv4 clients. This issue has been patched in versions 8.0.2, 8.1.1, 8.2.2, and 8.3.0.
Read the publisher's advisoryosv · GHSA-46wh-pxpv-q5gq
Published## Summary The default `keyGenerator` in express-rate-limit applies IPv6 subnet masking (`/56` by default) to all addresses that `net.isIPv6()` returns true for. This includes IPv4-mapped IPv6 addresses (`::ffff:x.x.x.x`), which Node.js returns as `request.ip` on dual-stack servers. Because the first 80 bits of all IPv4-mapped addresses are zero, a `/56` (or any `/32` to `/80`) subnet mask produces the same network key (`::/56`) for **every** IPv4 client. This collapses all IPv4 traffic into a single rate-limit bucket: one client exhausting the limit causes HTTP 429 for all other IPv4 clients. ## Details ### Root Cause In `source/ip-key-generator.ts`: ```typescript export function ipKeyGenerator(ip: string, ipv6Subnet: number | false = 56) { if (ipv6Subnet && isIPv6(ip)) { return `${new Address6(`${ip}/${ipv6Subnet}`).startAddress().correctForm()}/${ipv6Subnet}` } return ip } ``` `net.isIPv6('::ffff:192.168.1.1')` returns `true`, so IPv4-mapped addresses enter the subnet masking path. With a `/56` prefix, the start address for any `::ffff:x.x.x.x` is `::`, producing the key `::/56`. ### Proof of Concept ```javascript const { isIPv6 } = require('net'); const { Address6 } = require('ip-address'); function ipKeyGenerator(ip, ipv6Subnet = 56) { if (ipv6Subnet && isIPv6(ip)) { return `${new Address6(`${ip}/${ipv6Subnet}`).startAddress().correctForm()}/${ipv6Subnet}`; } return ip; } console.log(ipKeyGenerator('::ffff:192.168.1.1', 56)); // ::/56 console.log(ipKeyGenerator('::ffff:10.0.0.1', 56)); // ::/56 console.log(ipKeyGenerator('::ffff:8.8.8.8', 56)); // ::/56 // ALL produce '::/56' — same bucket ``` ### End-to-End Validation On a dual-stack Express server (`app.listen(port, '::')`), tested with Express 5.2.1: - `request.ip` for IPv4 clients is `::ffff:127.0.0.1` - Rate limit key resolves to `::/56` - After `limit` requests from any IPv4 client, all other IPv4 clients receive 429 ### When This Occurs - Node.js dual-stack servers (default on Linux when listening on `::`) - Any environment where `request.ip` contains IPv4-mapped IPv6 addresses - Only affects the default `keyGenerator` (custom key generators are not affected) ## Impact - **Denial of Service**: A single client can block all IPv4 traffic by exhausting the shared rate limit - **Affects default configuration**: No special options needed to trigger this ## Affected Versions All versions of express-rate-limit between v8.0.0 and v8.2.1. ## Fix This issue was fixed in commit 14e53888cdfd1b9798faf5b634c4206409e27fc4. This fix has been included in release v8.3.0, and backported to all affected minor versions in the form of releases v8.2.2, v8.1.1, and v8.0.2.
Read the publisher's advisoryAffected versions, risk and source history
Exploitation and risk
Source statusCISA KEV lists vulnerabilities known to be exploited. FIRST EPSS estimates the likelihood of exploitation in the next 30 days. An unavailable score does not mean zero risk.
Which CVEs have scores here?
This view includes predictions for CVE identifiers explicitly listed in public NuGet advisories. Microsoft release pages have their own prediction coverage. Check source status for the scope and latest checks.
No exploitation or prediction data is available here for these CVEs. This does not mean they are safe or unlikely to be exploited.
cve-program · CVE-2026-30827
Publishedexpress-rate-limit: IPv4-mapped IPv6 addresses bypass per-client rate limiting (all IPv4 clients share one bucket on dual-stack servers)
express-rate-limit is a basic rate-limiting middleware for Express. In versions starting from 8.0.0 and prior to versions 8.0.2, 8.1.1, 8.2.2, and 8.3.0, the default keyGenerator in express-rate-limit applies IPv6 subnet masking (/56 by default) to all addresses that net.isIPv6() returns true for. This includes IPv4-mapped IPv6 addresses (::ffff:x.x.x.x), which Node.js returns as request.ip on dual-stack servers. Because the first 80 bits of all IPv4-mapped addresses are zero, a /56 (or any /32 to /80) subnet mask produces the same network key (::/56) for every IPv4 client. This collapses all IPv4 traffic into a single rate-limit bucket: one client exhausting the limit causes HTTP 429 for all other IPv4 clients. This issue has been patched in versions 8.0.2, 8.1.1, 8.2.2, and 8.3.0.
- Source published
- 7 Mar 2026 05:19:08 UTC
- Source modified
- 9 Mar 2026 20:44:25 UTC
- Saved here
- 23 Oct 2026 15:48:27 UTC
- Source terms
- CVE Program Terms of Use
Original source record · Cite this exact observation · Complete original publisher JSON
Source: cve-program · CVE Program Terms of Use. The publisher's wording is preserved. ChangeIntel groups the information and labels changes. The JSON record includes additional source fields.
CVSS 3.1 · 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
euvd · EUVD-2026-10113
Publishedexpress-rate-limit is a basic rate-limiting middleware for Express. In versions starting from 8.0.0 and prior to versions 8.0.2, 8.1.1, 8.2.2, and 8.3.0, the default keyGenerator in express-rate-limit applies IPv6 subnet masking (/56 by def…
express-rate-limit is a basic rate-limiting middleware for Express. In versions starting from 8.0.0 and prior to versions 8.0.2, 8.1.1, 8.2.2, and 8.3.0, the default keyGenerator in express-rate-limit applies IPv6 subnet masking (/56 by default) to all addresses that net.isIPv6() returns true for. This includes IPv4-mapped IPv6 addresses (::ffff:x.x.x.x), which Node.js returns as request.ip on dual-stack servers. Because the first 80 bits of all IPv4-mapped addresses are zero, a /56 (or any /32 to /80) subnet mask produces the same network key (::/56) for every IPv4 client. This collapses all IPv4 traffic into a single rate-limit bucket: one client exhausting the limit causes HTTP 429 for all other IPv4 clients. This issue has been patched in versions 8.0.2, 8.1.1, 8.2.2, and 8.3.0.
Additional publisher context
EUVD source date text has no stated timezone and is retained without inventing a UTC instant. Related bulletin membership is not an alias, common cause or applicability claim. A missing vector with a zero score is treated as unrated. Complete vendor/product and underlying source evidence remains in the original JSON.
Original publisher date fields
datePublished: Mar 7, 2026, 5:19:08 AM
dateUpdated: Mar 9, 2026, 8:44:25 PM
5 related source bulletins · separate from aliases
RHSA-2026:6404: Red Hat Security Advisory: Red Hat Ansible Automation Platform 2.6 Container Release Update
CVE-2025-69223 · CVE-2025-69873 · CVE-2026-1615 · CVE-2026-25639 · CVE-2026-25990 · CVE-2026-26007 · CVE-2026-28498 · CVE-2026-28802 · CVE-2026-29074 · CVE-2026-30827 · CVE-2026-30922
RHSA-2026:6309: Red Hat Security Advisory: Red Hat Ansible Automation Platform 2.6 Container Release Update
CVE-2025-69223 · CVE-2025-69873 · CVE-2026-1615 · CVE-2026-25639 · CVE-2026-25990 · CVE-2026-26007 · CVE-2026-28498 · CVE-2026-28802 · CVE-2026-29074 · CVE-2026-30827 · CVE-2026-30922
RHSA-2026:21772: Red Hat Security Advisory: Red Hat OpenShift Dev Spaces 3.28.0 Release.
CVE-2025-14813 · CVE-2025-68121 · CVE-2026-0636 · CVE-2026-1525 · CVE-2026-1526 · CVE-2026-1528 · CVE-2026-1605 · CVE-2026-2229 · CVE-2026-2327 · CVE-2026-5588 · CVE-2026-26996 · CVE-2026-27904 · CVE-2026-29074 · CVE-2026-30827 · CVE-2026-31802 · CVE-2026-32141 · CVE-2026-32280 · CVE-2026-32282 · CVE-2026-32305 · CVE-2026-33252 · CVE-2026-33810 · CVE-2026-34742 · CVE-2026-35051 · CVE-2026-39858 · CVE-2026-40477 · CVE-2026-40478 · CVE-2026-40611 · CVE-2026-40895 · CVE-2026-40912 · CVE-2026-40972 · CVE-2026-40973 · CVE-2026-40975 · CVE-2026-41240 · CVE-2026-42033 · CVE-2026-42035 · CVE-2026-42039 · CVE-2026-42041 · CVE-2026-42043 · CVE-2026-42044
WID-SEC-W-2026-1220: IBM App Connect Enterprise: Mehrere Schwachstellen
CVE-2026-26278 · CVE-2026-27601 · CVE-2026-27903 · CVE-2026-27904 · CVE-2026-29786 · CVE-2026-30827 · CVE-2026-31802 · CVE-2026-31988 · CVE-2026-32141 · CVE-2026-33036 · CVE-2026-33228
WID-SEC-W-2026-0935: Red Hat Ansible Automation Platform: Mehrere Schwachstellen
CVE-2025-69223 · CVE-2025-69873 · CVE-2026-25639 · CVE-2026-25990 · CVE-2026-29074 · CVE-2026-30827 · CVE-2026-30922 · CVE-2026-26007 · CVE-2026-1615 · CVE-2026-28498 · CVE-2026-28802
- Source published
- Mar 7, 2026, 5:19:08 AM (timezone not stated)
- Source modified
- Mar 9, 2026, 8:44:25 PM (timezone not stated)
- Saved here
- 15 Nov 2026 09:30:10 UTC
- Source terms
- ENISA EUVD · source terms and attribution apply
Original source record · Cite this exact observation · Complete original publisher JSON
Source: euvd · ENISA EUVD · source terms and attribution apply. The publisher's wording is preserved. ChangeIntel groups the information and labels changes. The JSON record includes additional source fields.
EUVD CVSS 3.1 · 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
nvd · CVE-2026-30827
Publishedexpress-rate-limit is a basic rate-limiting middleware for Express. In versions starting from 8.0.0 and prior to versions 8.0.2, 8.1.1, 8.2.2, and 8.3.0, the default keyGenerator in express-rate-limit applies IPv6 subnet masking (/56 by def…
express-rate-limit is a basic rate-limiting middleware for Express. In versions starting from 8.0.0 and prior to versions 8.0.2, 8.1.1, 8.2.2, and 8.3.0, the default keyGenerator in express-rate-limit applies IPv6 subnet masking (/56 by default) to all addresses that net.isIPv6() returns true for. This includes IPv4-mapped IPv6 addresses (::ffff:x.x.x.x), which Node.js returns as request.ip on dual-stack servers. Because the first 80 bits of all IPv4-mapped addresses are zero, a /56 (or any /32 to /80) subnet mask produces the same network key (::/56) for every IPv4 client. This collapses all IPv4 traffic into a single rate-limit bucket: one client exhausting the limit causes HTTP 429 for all other IPv4 clients. This issue has been patched in versions 8.0.2, 8.1.1, 8.2.2, and 8.3.0.
Additional publisher context
NVD analysis and CPE criteria are source context, not proof that a package or your environment is affected. Complete affected data, logical configurations and SSVC are retained in the original JSON.
Source analysis status: Analyzed
Weakness classifications: CWE-770
Original publisher date fields
published: 2026-03-07T06:16:10.507
lastModified: 2026-06-17T10:32:59.050
2 source CPE criteria · context only
- cpe:2.3:a:express-rate-limit_project:express-rate-limit:*:*:*:*:*:*:*:*
- cpe:2.3:a:express-rate-limit_project:express-rate-limit:8.1.0:*:*:*:*:*:*:*
The original JSON retains the logical configuration operators, exclusions and version bounds.
- Source published
- 7 Mar 2026 06:16:10 UTC
- Source modified
- 17 Jun 2026 10:32:59 UTC
- Saved here
- 25 Oct 2026 07:19:08 UTC
- Source terms
- NIST NVD usage terms; underlying source attribution retained
Original source record · Cite this exact observation · Complete original publisher JSON
Source: nvd · NIST NVD usage terms; underlying source attribution retained. The publisher's wording is preserved. ChangeIntel groups the information and labels changes. The JSON record includes additional source fields.
CVSS 3.1 · [email protected] · Secondary · 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
osv · GHSA-46wh-pxpv-q5gq
Publishedexpress-rate-limit: IPv4-mapped IPv6 addresses bypass per-client rate limiting on servers with dual-stack network
## Summary The default `keyGenerator` in express-rate-limit applies IPv6 subnet masking (`/56` by default) to all addresses that `net.isIPv6()` returns true for. This includes IPv4-mapped IPv6 addresses (`::ffff:x.x.x.x`), which Node.js returns as `request.ip` on dual-stack servers. Because the first 80 bits of all IPv4-mapped addresses are zero, a `/56` (or any `/32` to `/80`) subnet mask produces the same network key (`::/56`) for **every** IPv4 client. This collapses all IPv4 traffic into a single rate-limit bucket: one client exhausting the limit causes HTTP 429 for all other IPv4 clients. ## Details ### Root Cause In `source/ip-key-generator.ts`: ```typescript export function ipKeyGenerator(ip: string, ipv6Subnet: number | false = 56) { if (ipv6Subnet && isIPv6(ip)) { return `${new Address6(`${ip}/${ipv6Subnet}`).startAddress().correctForm()}/${ipv6Subnet}` } return ip } ``` `net.isIPv6('::ffff:192.168.1.1')` returns `true`, so IPv4-mapped addresses enter the subnet masking path. With a `/56` prefix, the start address for any `::ffff:x.x.x.x` is `::`, producing the key `::/56`. ### Proof of Concept ```javascript const { isIPv6 } = require('net'); const { Address6 } = require('ip-address'); function ipKeyGenerator(ip, ipv6Subnet = 56) { if (ipv6Subnet && isIPv6(ip)) { return `${new Address6(`${ip}/${ipv6Subnet}`).startAddress().correctForm()}/${ipv6Subnet}`; } return ip; } console.log(ipKeyGenerator('::ffff:192.168.1.1', 56)); // ::/56 console.log(ipKeyGenerator('::ffff:10.0.0.1', 56)); // ::/56 console.log(ipKeyGenerator('::ffff:8.8.8.8', 56)); // ::/56 // ALL produce '::/56' — same bucket ``` ### End-to-End Validation On a dual-stack Express server (`app.listen(port, '::')`), tested with Express 5.2.1: - `request.ip` for IPv4 clients is `::ffff:127.0.0.1` - Rate limit key resolves to `::/56` - After `limit` requests from any IPv4 client, all other IPv4 clients receive 429 ### When This Occurs - Node.js dual-stack servers (default on Linux when listening on `::`) - Any environment where `request.ip` contains IPv4-mapped IPv6 addresses - Only affects the default `keyGenerator` (custom key generators are not affected) ## Impact - **Denial of Service**: A single client can block all IPv4 traffic by exhausting the shared rate limit - **Affects default configuration**: No special options needed to trigger this ## Affected Versions All versions of express-rate-limit between v8.0.0 and v8.2.1. ## Fix This issue was fixed in commit 14e53888cdfd1b9798faf5b634c4206409e27fc4. This fix has been included in release v8.3.0, and backported to all affected minor versions in the form of releases v8.2.2, v8.1.1, and v8.0.2.
- Source published
- 6 Mar 2026 18:36:56 UTC
- Source modified
- 10 Sep 2026 03:50:36 UTC
- Saved here
- 24 Oct 2026 13:17:17 UTC
- Source terms
- GitHub Advisory Database · CC-BY-4.0
Original source record · Cite this exact observation · Complete original publisher JSON
Source: osv · GitHub Advisory Database · CC-BY-4.0. The publisher's wording is preserved. ChangeIntel groups the information and labels changes. The JSON record includes additional source fields.
CVSS_V3 · CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
Publisher rating · HIGH