Security Digest · Oct 10, 2023 · Vulnerability · Network edge
HTTP/2 Rapid Reset: Record DDoS Flaw in HTTP/2 Servers
CVE-2023-44487 lets clients open and cancel HTTP/2 streams to exhaust servers. Patch self-hosted HTTP/2 stacks; CDN-fronted sites are mostly covered.
Our verdict
Check exposure
This is availability-only and was exploited at record scale, but if your HTTP/2 traffic terminates at a major CDN or cloud load balancer the provider already absorbed it; check what terminates HTTP/2 on your own servers.
Who must act: Anyone terminating HTTP/2 directly on self-managed servers, proxies, or app runtimes (NGINX, Tomcat, Node.js, Go, nghttp2-based stacks) that are reachable from the internet.
Who can relax: Sites whose public HTTP/2 traffic terminates at Cloudflare, Google Cloud load balancing, AWS edge services, or a similar provider, and services that do not speak HTTP/2 at all.
- Affected
- nghttp2 before 1.57.0
Node.js 18.x before 18.18.2 and 20.x before 20.8.1
Apache Tomcat 10.1.0-M1 to 10.1.13
NGINX Plus before R29p1 / R30p1
Most server-side HTTP/2 implementations shipped before October 2023 - Fixed in
- nghttp2 1.57.0
Node.js 18.18.2, 20.8.1
Apache Tomcat 10.1.14
NGINX Plus R29p1, R30p1; NGINX Open Source rebuilt from current code
Go 1.21.3 and 1.20.10 (net/http security fix, same day) - CVSS
- 7.5 (v3.1, NVD)
- EPSS
- 100.0% (percentile 100.0)
- CISA KEV
- Yes, listed as known exploited
- Exploitation
- Exploited in the wild
- Severity
- High
What to do
- Inventory every component that terminates HTTP/2 from untrusted clients: reverse proxies, ingress controllers, app servers, language runtimes.
- Upgrade each to a release with a rapid-reset mitigation (for example nghttp2 1.57.0+, Node.js 18.18.2+/20.8.1+, Tomcat 10.1.14+, NGINX Plus R29p1/R30p1).
- On NGINX keep keepalive_requests at its default of 1000 and http2_max_concurrent_streams at 128, and add limit_conn and limit_req.
- Put internet-facing HTTP/2 endpoints behind a DDoS-capable CDN or cloud load balancer where practical.
- If you cannot patch an exposed service, consider disabling HTTP/2 on it until you can.
How to check if you are affected or compromised
- Check versions: `nginx -v`, `node -v`, `go version`, and your Tomcat release notes or `version.sh`.
- Look for connections carrying very high counts of RST_STREAM frames or requests that are canceled before a response.
- Watch for sudden CPU or memory spikes on HTTP/2 frontends without matching completed-request volume; Tomcat typically shows OutOfMemoryError.
What happened#
On October 10, 2023, Google, Cloudflare, AWS and others jointly disclosed a denial-of-service technique against the HTTP/2 protocol itself, tracked as CVE-2023-44487 and nicknamed "Rapid Reset." HTTP/2 lets a client run many requests (streams) over one TCP connection, capped by a concurrent-stream limit. An attacker sends a request and immediately cancels it with a RST_STREAM frame. The cancellation frees the slot, so the client can keep opening and canceling streams without limit, while the server still pays for each one (allocating stream state, decoding headers, routing). Google described the cost asymmetry and two variants, including one that batches cancellations to dodge rate limits.
This was not theoretical. NVD notes exploitation in the wild from August through October 2023 and scores it CVSS 7.5 (availability only). Google saw a peak above 398 million requests per second; Cloudflare saw just over 201 million from a botnet of about 20,000 machines, first noticed on August 25. CISA added the CVE to the KEV catalog on October 10, 2023, and it remains listed as of this writing.
Who is affected#
Because the weakness is in protocol behavior, almost every server-side HTTP/2 implementation needed a change. Examples of fixed releases: nghttp2 1.57.0 (mitigated by default), Node.js 18.18.2 and 20.8.1, Apache Tomcat 10.1.14 (10.1.0-M1 to 10.1.13 affected, typically failing with OutOfMemoryError), and NGINX Plus R29p1/R30p1. Go 1.21.3 and 1.20.10 shipped the same day with a net/http security fix. Clients and HTTP/1.1-only services are not the target; Google said HTTP/3 is not believed vulnerable to these methods.
Do you really need to act?#
The impact is outage, not data theft or code execution. The question is who terminates your HTTP/2 connections. If public traffic first hits a large CDN or cloud load balancer, that provider was mitigating before disclosure: AWS said its infrastructure already had protections and added more, and only asked customers running their own HTTP/2 servers to check with vendors. Google said its load balancing stopped the attacks at the edge.
If instead your own NGINX, Tomcat, Node.js or Go service speaks HTTP/2 directly to the internet, you are the edge, and an unpatched build can be taken down by a modest botnet. Three years on, the remaining risk is mostly in forgotten appliances, old container images and embedded servers that never got the update. CISA advised patching and applying vendor configuration mitigations.
What to do now#
- List everything that terminates HTTP/2 from untrusted clients: ingress controllers, reverse proxies, app servers, runtimes.
- Upgrade each to a mitigated release (check with
nginx -v,node -v,go version, Tomcatversion.sh). - On NGINX, F5 advises keeping
keepalive_requestsat 1000 andhttp2_max_concurrent_streamsat 128, pluslimit_connandlimit_req. - Where practical, front public HTTP/2 endpoints with a DDoS-capable CDN or load balancer, which Cloudflare called the best defense.
- If an exposed service cannot be patched, disable HTTP/2 on it until it can.
How to tell if you were hit#
This attack leaves no persistent compromise; the symptom is degraded service. Signs include connections with large numbers of canceled streams, CPU or memory spikes on HTTP/2 frontends without matching completed requests, and bursts of 502 errors from proxies. Google's suggested heuristic flags connections with more than 100 requests where over half were canceled.
Timeline#
- — Cloudflare first observes Rapid Reset attacks; Google's largest attacks peak in August.
- — Issue reported to the Apache Tomcat security team.
- — Coordinated disclosure; nghttp2 1.57.0, Tomcat 10.1.14 and Go 1.21.3/1.20.10 released; CISA alert and KEV listing.
- — Node.js 18.18.2 and 20.8.1 security releases.
- — Still listed in CISA KEV; brief updated.
Vulnerability records
- CVE-2023-44487 · KEV 2023-10-10 · The HTTP/2 protocol allows a denial of service (server resource consumption) because request cancellation can reset many streams quickly, as exploited in the…
Sources
Original sources first: vendor and project advisories, CVE and government records, the discoverers’ write-ups. Every claim above links to one of these. See how the Security Desk works.
Original and primary sources
- NVD — CVE-2023-44487 nvd.nist.gov
- CISA — HTTP/2 Rapid Reset Vulnerability, CVE-2023-44487 cisa.gov
- CISA — Known Exploited Vulnerabilities Catalog cisa.gov
- Google Cloud — How it works: The novel HTTP/2 'Rapid Reset' DDoS attack cloud.google.com
- Cloudflare — HTTP/2 Rapid Reset: deconstructing the record-breaking attack blog.cloudflare.com
- AWS — Security Bulletin AWS-2023-011 aws.amazon.com
- nghttp2 — GHSA-vx74-f528-fxqg github.com
- Node.js — October 2023 security releases nodejs.org
- Apache Tomcat — Tomcat 10 security fixes tomcat.apache.org
- F5 — HTTP/2 Rapid Reset Attack Impacting F5 NGINX Products f5.com
- Go — Release history go.dev