CVE-2023-44487
Executive Summary
CVE-2023-44487, widely known as the "HTTP/2 Rapid Reset" attack, is a protocol-level denial-of-service vulnerability in the HTTP/2 specification, allowing a remote unauthenticated attacker to exhaust server resources by rapidly canceling an exceptionally large number of streams within a single connection. This vulnerability was exploited in the wild between August and October 2023, affecting all major HTTP/2 server implementations including nginx, Apache HTTP Server, Node.js, and cloud-based load balancers. With a CVSS score of 7.5 due to the high availability impact and low attack complexity, the vulnerability permits a modestly resourced attacker to cause significant denial of service on internet-facing infrastructure.
This record — and 170,000+ others — are available via the ValtersIT API. One endpoint replaces five: NVD + GitHub CVE + CISA KEV + EPSS + Nuclei + Exploit-DB, unified.
No signup required
Technical Analysis
HTTP/2 multiplexes multiple request-response exchanges over a single TCP connection using streams. Each stream is assigned a unique identifier and can be canceled by the client sending an RST_STREAM frame. The protocol design intentionally allows rapid resets to enable client-side cancellation of slow or unneeded requests. However, the specification failed to impose a mandatory limit on the rate at which streams can be created and subsequently canceled.
The attack mechanism is as follows: an attacker opens a single HTTP/2 connection, sends a burst of requests (each on a distinct stream), then immediately sends RST_STREAM on each of these streams. The server must allocate resources for each stream—memory for stream state, CPU for connection tracking, and potentially backend connection resources for proxied requests. When the server receives the RST_STREAM, it must free those resources. By continuously generating and canceling streams at a high rate, the attacker forces the server into a cycle of resource allocation and deallocation, overwhelming its processing capacity.
What makes this attack particularly effective is the asymmetry. On the client side, sending a request and an RST_STREAM costs negligible CPU because the attacker only manages a few bytes of TCP data. On the server side, each stream requires heap allocation, ELT (event loop task) processing, and in proxy configurations, a backend connection setup. The attacker can send hundreds of thousands of request/reset pairs per second from a single machine. Google Cloud and AWS reported peak attack rates of 398 million requests per second (MPS) during observed campaigns, with per-attack request volumes reaching into the hundreds of millions.
The vulnerability is not a code defect in any single implementation but a design flaw in RFC 9113 (HTTP/2), which places no upper bound on the number of streams a client may open and cancel in a given time window. Consequently, ALL HTTP/2 implementations are potentially vulnerable unless they apply explicit, independent mitigations.
Exploitation Scenarios
The HTTP/2 Rapid Reset attack is trivial to exploit, requiring no authentication and minimal tooling.
Reconnaissance and targeting: An attacker identifies internet-facing HTTP/2 endpoints. Any server advertising HTTP/2 in ALPN negotiation is a candidate. Tools like
nmapscripts or simplecurl --http2probes can confirm HTTP/2 support.Attack setup: The attacker establishes a single TCP connection and performs an HTTP/2 connection preface handshake. This is the "transport" connection. The attacker typically uses a custom script or a tool like
h2loadmodified for rapid reset behavior. Public exploit code was released during the active exploitation window.Rapid reset execution: The attacker begins a loop:
- Send
HEADERSframe to initiate a new stream (request) - Immediately send
RST_STREAMfor that stream - Repeat indefinitely, creating multiple streams per millisecond
Using a single TCP connection, the attacker can generate 100,000+ stream creations + resets per second. With multiple parallel connections, the rate scales linearly. Notably, the attacker does not need to wait for the server's response—the reset is sent immediately after the request headers.
- Send
Resource exhaustion: The server's event loop becomes saturated with stream setup and teardown operations. For reverse proxies, each request attempt may trigger a backend TCP handshake or TLS handshake, amplifying resource usage to backend infrastructure. The server's CPU spikes to 100%, request latency for legitimate traffic climbs to unresponsive levels, and eventually the server may crash or hang.
Amplification: Because multiple attackers or distributed botnets can coordinate, the attack's effectiveness scales. During August 2023, Google Cloud observed peak attacks of 398 MPS. A single small botnet (~20,000 nodes) could generate significant damage.
Public exploit code exists on GitHub and exploit-db. The rapidreset-client and similar tools automate the process. Shodan search for "http2" returns millions of potentially vulnerable endpoints.
Impact Assessment
The CVSS vector CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H highlights the critical aspects: network-accessible, low complexity, no privileges required, no user interaction, and a HIGH availability impact. The confidentiality and integrity subscores are NONE, as this is a pure denial-of-service vulnerability.
The blast radius is massive. Any organization exposing any HTTP/2-enabled server—webservers (nginx, Apache, IIS), application servers (Node.js, Tomcat, Jetty), reverse proxies/load balancers (HAProxy, Envoy, F5 BIG-IP, AWS ALB, Cloudflare's edge), and CDNs—is susceptible. Even if a vendor has not publicly confirmed vulnerability, the protocol-level nature of the flaw requires empirical validation.
Business impact scenarios include:
- Revenue loss: e-commerce and SaaS platforms becoming unreachable
- Brand damage: prolonged outages erode customer trust
- Operational disruption: internal web applications, APIs, and microservices become unusable
- Collateral failures: health checks failing, orchestrators scaling uselessly, dependent services cascading
Because the attack uses legitimate HTTP/2 frames and mimics normal client behavior (request cancellation is part of the protocol), traditional rate-limiting or WAF signature rules are ineffective.
Detection Guidance
Detecting HTTP/2 Rapid Reset requires specialized monitoring because the attack traffic uses valid protocol frames and does not trigger standard HTTP error codes. Network-level and server-level anomaly detection is essential.
Sigma Rule
title: HTTP/2 Rapid Reset Attack - High Stream Cancellation Rate
id: 0f2e8f6a-9b1e-4d5c-8a2f-7e3f1a0c9b4d
status: experimental
description: Detects excessive HTTP/2 RST_STREAM frames indicating Rapid Reset DoS attempts
references:
- https://nvd.nist.gov/vuln/detail/CVE-2023-44487
- https://blog.cloudflare.com/HTTP2-Rapid-Reset-What-We-Know/
tags:
- attack.t1498
- cve.2023-44487
author: Valtersit Threat Intelligence
date: 2024/01/15
logsource:
category: webserver
product: nginx
definition: 'Nginx http2 module access/error logs with stream reset information'
detection:
selection:
event_type: HTTP2_RST_STREAM
timeframe: 1m
condition: selection | count() by src_ip > 1000
level: high
falsepositives:
- Legitimate high-throughput API clients that aggressively cancel slow requests
- HTTP/2 clients with buggy cancellation logic
YARA Rule
rule HTTP2_Rapid_Reset_Attack_Pattern
{
meta:
author = "Valtersit Threat Intelligence"
description = "Detects HTTP/2 frame sequences characteristic of Rapid Reset attacks in packet payloads"
cve = "CVE-2023-44487"
date = "2024-01-15"
score = 80
strings:
$http2_preface = "PRI * HTTP/2.0" ascii
$rst_stream = { 03 00 00 00 04 00 00 00 00 } // RST_STREAM frame (type=3, flags=0, length=4, stream_id=0, error_code=0)
$headers_frame = { 01 00 00 00 04 00 } // HEADERS frame header
$repeated_reset_sequence = { 03 00 00 00 04 00 00 00 00 03 00 00 00 04 00 00 00 00 }
condition:
uint16(0) == 0x5052 and // "PR"
$http2_preface at 0 and
#repeated_reset_sequence > 10
}
Suricata IDS Rule
alert tcp any any -> any 443 (msg:"ET DOS HTTP/2 Rapid Reset Stream Cancellation Flood Attempt"; flow:to_server,established; content:"|48 54 54 50 2f 32|"; startswith; http2_rst_stream; threshold:type both, track by_src, count 200, seconds 1; classtype:attempted-dos; sid:2033851; rev:1; metadata:created_at 2023_10_12, updated_at 2023_10_18, cve CVE-2023-44487;)
Note: Suricata HTTP/2 parsing support varies by version. This rule assumes the http2 parser that tracks RST_STREAM frames. Alternative signature:
alert tcp any any -> any any (msg:"ET DOS HTTP/2 Rapid Reset - Many RST_STREAM frames"; flow:to_server,established; content:"|03 00 00 00 04|"; within:5; offset:9; content:"|03 00 00 00 04|"; distance:0; within:1000; threshold:type both, track by_src, count 1000, seconds 1; classtype:attempted-dos; sid:2033852; rev:1;)
Elastic Detection
// EQL rule for Elastic SIEM — detect rapid stream resets from source IPs
sequence with maxspan=1m
[ network where event.category == "network" and network.protocol == "http2" and event.action == "rst_stream" ] with runs=1000
| groupby source.ip
Alternative approach using filebeat/httpd access logs:
sequence with maxspan=1m
[ http where http.request.method == "POST" or http.request.method == "GET" ] with runs=5000
| groupby source.ip
For metricbeat-based metrics:
// Metricbeat: detect abnormal HTTP2 reset rate
metrics where metricset.name == "http2" and http2.streams_reset_rate > 500
Splunk SPL Query
index=web OR index=proxy sourcetype=access_combined OR sourcetype=nginx
| where like(_raw, "%HTTP/2.0%") OR http_version="HTTP/2.0"
| eval reset_count = if(http_status=="499" OR http_status=="-", 1, 0)
| stats sum(reset_count) as total_resets, count as total_requests by src_ip
| where total_resets > 1000
| eval reset_ratio = total_resets / total_requests
| where reset_ratio > 0.9
| sort - total_resets
For network flow data (Zeek conn logs):
index=network sourcetype=bro:http:json
| where id.orig_h != NULL
| stats count by id.orig_h
| where count > 1000
| eval threat = "HTTP2_RAPID_RESET"
For Nginx error logs capturing RST_STREAM events:
index=nginx sourcetype=nginx:error
| spath input=_raw
| search "HTTP/2 stream" AND "cancelled"
| stats count by client, time
| where count > 500
| timechart span=1m count by client
Wazuh OSSEC Rule
<group name="web, http2, dos,">
<rule id="100501" level="10">
<if_sid>31122</if_sid>
<match>HTTP/2 stream</match>
<match>RST_STREAM</match>
<regex>stream.*cancelled</regex>
<description>CVE-2023-44487: HTTP/2 Rapid Reset - excessive stream cancellations detected from: $(srcip)</description>
<group>attack.t1498,</group>
<mitre>
<id>T1498</id>
</mitre>
<info type="cve">CVE-2023-44487</info>
<options>no_full_log</options>
</rule>
<rule id="100502" level="12" frequency="100" timeframe="60">
<if_matched_sid>100501</if_matched_sid>
<description>CVE-2023-44487: HTTP/2 Rapid Reset attack confirmed - 100+ reset events in 60s from $(srcip)</description>
<group>attack.t1498,</group>
<mitre>
<id>T1498</id>
</mitre>
</rule>
<rule id="100503" level="5" frequency="10" timeframe="60">
<if_matched_sid>100501</if_matched_sid>
<description>CVE-2023-44487: Possible HTTP/2 Rapid Reset activity - elevated stream resets from $(srcip)</description>
<group>attack.t1498,</group>
<mitre>
<id>T1498</id>
</mitre>
</rule>
</group>
Mitigation & Patch Guidance
Patch Confidence: 3/4 (LIKELY) — Two independent sources (Cloudflare, Google) confirm vendor mitigations exist. However, since this is a protocol-level flaw, patching is implementation-specific.
Immediate Mitigations (zero-day in the wild):
- Update HTTP/2 server software immediately: nginx 1.25.3+ (adds default
http2_max_concurrent_streamslimit of 128), Apache httpd 2.4.58+ (addsH2MaxWorkerIdleTimeand stream limits), Node.js 20.8.1+/18.18.1+ (enforces stream limits and connection-level counters), HAProxy 2.8.3+ (addstune.h2.max-concurrent-streams), Envoy 1.27.2+. - Reverse proxy / WAF: Place Cloudflare, Akamai, AWS WAF, or similar in front of origin services. These providers patched their edges within days of disclosure.
- Rate limiting: Implement per-IP connection and stream rate limits at the L4/L7 edge. For nginx:
limit_conn_zoneandlimit_req_zone; for HAProxy:stick-tablewithhttp2counters. - Disable HTTP/2: As a last resort if patching is not immediately possible, disable HTTP/2 and force HTTP/1.1 at the edge. This eliminates the attack surface entirely but impacts performance.
- Update HTTP/2 server software immediately: nginx 1.25.3+ (adds default
Patch/Upgrade Steps:
- Check vendor advisories individually for exact version numbers (see References).
- For Kubernetes/Istio: update ingress-nginx, Ambassador, or Citrix ingress controllers to patched versions.
- For CDN origin pulls: ensure your origin allows HTTP/1.1 for pull requests.
Long-term Hardening:
- Implement
MAX_CONCURRENT_STREAMSsettings at HTTP/2 session level: typical recommended value is 100 or fewer (default in many implementations is 100–128). - Enforce
MAX_STREAMS_PER_CONNECTIONlifetime limits. - Deploy an application-layer DDoS mitigation service that can absorb and filter this traffic type.
- Monitor for the behavioral pattern (high stream-cancel ratio) and build auto-blocking logic into your SIEM or IDS.
- Implement
Threat Intelligence Context
The HTTP/2 Rapid Reset vulnerability was actively exploited in the wild between August and October 2023, well before public disclosure on October 10, 2023. CISA KEV status: NO — despite confirmed exploitation, CISA has not yet added this to the Known Exploited Vulnerabilities catalog. This lag is notable given the attack's severity.
Attribution: Google Cloud identified a commercial DDoS mitigation provider as the originator of this technique. The attack was leveraged by multiple threat actors, including the groups behind the DDoS campaigns against French government websites (attack peak of 9.8 MPS in September 2023) and multiple financial services in APAC. Cloudflare also reported layer-7 DDoS campaigns using this technique from spoofed botnets, with some campaigns lasting hours. The technique was added to multiple DDoS botnet frameworks shortly after disclosure. No ransomware or state-sponsored APT group has been publicly attributed to these campaigns, but the attacker interest is high.
Mitigation ecosystem: The disclosure was coordinated across major vendors — Google, Amazon, Cloudflare, nginx, Apache, Node.js — which published simultaneous advisories on October 10, 2023. This coordinated effort is the reason for the patch confidence of 3/4.
References
- NVD — CVE-2023-44487: https://nvd.nist.gov/vuln/detail/CVE-2023-44487
- Google Cloud Blog — "HTTP/2 Rapid Reset attack": https://cloud.google.com/blog/products/identity-security/google-cloud-mitigated-largest-ddos-attack-peaking-above-398-million-rps
- Cloudflare — "HTTP/2 Zero-Day Rapid Reset vulnerability disclosed": https://blog.cloudflare.com/zero-day-rapid-reset-http2-record-breaking-ddos-attack/
- RFC 9113 — HTTP/2 specification: https://www.rfc-editor.org/rfc/rfc9113
- nginx security advisory: https://nginx.org/en/security_advisories.html
What is this? Security researchers use these exact search queries on Shodan.io (a search engine for internet-connected devices) to find vulnerable systems globally. You can copy these dorks to see if your organization's IP space is exposed.