CVE-2026-126204: express-rate-limit skipFailedRequests / skipSuccessfulRequests: with the default MemoryStore, a request from an earlier window is still un-counted from the current window
express-rate-limit is a basic rate-limiting middleware for Express. From 8.6.0 until 8.7.2, the built-in MemoryStore returns a Client whose mutable resetTime object is retained by middleware using skipFailedRequests or skipSuccessfulRequests. When a later request resets the client window, MemoryStore.resetClient mutates that same Date, so an earlier request that finishes or disconnects after the reset can pass the stale-window guard and decrement the current window's count. A client able to keep requests in flight across the boundary can obtain a bounded extra burst of up to one additional configured limit in the new window; the behavior does not increase the sustained rate. Stores that return a fresh Date are not affected. This issue is fixed in version 8.7.2.
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Upgrade
Upgrade
express-rate-limitto a version that resolves this vulnerability.Fixed in 8.7.2
Event History
Frequently Asked Questions
Which deployments are affected?
Deployments using express-rate-limit versions 8.6.0 through 8.7.1 with the built-in MemoryStore and either skipFailedRequests or skipSuccessfulRequests enabled are affected. Stores that return a fresh Date are not affected.
What does an attacker need to do to exploit this behavior?
An attacker must be able to keep requests in flight across a rate-limit window boundary, then have an earlier request finish or disconnect after a later request resets the client window. No privileges or user interaction are required.
What is the practical impact on rate limiting?
A client can receive a bounded extra burst of up to one additional configured limit in the new window. The issue does not increase the sustained request rate.
How can this be remediated?
Upgrade express-rate-limit to version 8.7.2, which fixes the issue. If upgrading is not immediately possible, avoid the affected built-in MemoryStore configuration by using a store that returns a fresh Date.