Quick answer
The HTTP/2 CONTINUATION Flood is a class of denial-of-service bugs disclosed on 3 April 2024 and coordinated through CERT/CC note VU#421644. A client sends a stream of CONTINUATION frames without ever setting END_HEADERS, so a vulnerable server keeps decoding headers it will reject, exhausting memory or CPU. CVE-2024-27316 is the Apache HTTP Server identifier, fixed in 2.4.59; many other implementations had their own CVEs. Often one connection is enough, and the attack leaves no entry in the access log.
At a glance
high severity- Identifier
- CVE-2024-27316
- Also known as
- HTTP/2 CONTINUATION Flood (Apache HTTP Server)
- Product
- Apache HTTP Server (httpd), one of many implementations affected by the CONTINUATION Flood class
- Affected
- Apache HTTP Server 2.4.17 through 2.4.58
- Fixed in
- Apache HTTP Server 2.4.59; Debian bookworm apache2 2.4.59-1~deb12u1 (DSA-5662-1); Ubuntu 22.04 jammy apache2 2.4.52-1ubuntu4.9 (USN-6729-1); 24.04 noble 2.4.58-1ubuntu8.1
- CVSS
- 7.5 (CVSS 3.1), per NVD; rated Moderate by Apache
- Disclosed
- Known exploited (CISA KEV)
- Not listed
Patch available since April 2024. Coordinated via CERT/CC VU#421644. Not listed in CISA KEV as of October 2026.
01What is the HTTP/2 CONTINUATION Flood?
It is a family of denial-of-service vulnerabilities in how HTTP/2 implementations handle header frames. HTTP/2 sends request headers in a HEADERS frame, and when they do not fit in one frame the rest arrive in CONTINUATION frames. The sequence is meant to end with a frame that sets the END_HEADERS flag. If a client never sets that flag and keeps sending CONTINUATION frames, a vulnerable server keeps reading, parsing and decoding them without end.
The result ranges from a fast crash to gradual exhaustion, depending on the implementation: an out-of-memory crash where frames are buffered, or heavy CPU use where the HPACK Huffman data is decoded but discarded. The common thread is that the work is done for a request that will never complete and is going to be rejected anyway.
The class was disclosed on 3 April 2024 by security researcher Bartek Nowotarski and coordinated through CERT/CC Vulnerability Note VU#421644. CVE-2024-27316 is the identifier assigned to the Apache HTTP Server instance of the bug; each affected project received its own CVE. This page uses the Apache identifier as the anchor and lists the others below.
02How does the attack work, conceptually?
An HTTP/2 server must maintain HPACK compression state across every HEADERS and CONTINUATION frame on a connection, because the header table is shared. That forces it to process each frame as it arrives, even before it has a complete request. A correct implementation caps how much header data, or how many continuation frames, it will accept before it gives up and resets the stream.
In most vulnerable implementations that cap was missing or applied too late. The server accepted CONTINUATION frames indefinitely while the END_HEADERS flag stayed unset, so the stream never finished and was never reset. Where excess headers were buffered, memory grew until the process was killed. Where they were only decoded, CPU was consumed decoding Huffman-encoded data that is far cheaper to send than to decode. In several stacks a single TCP connection, sometimes a handful of frames, was enough.
This page describes the mechanism only. It contains no frame sequences, no tooling and no steps to reproduce an attack. The fix and the honest limits of edge filtering are in the sections below.
03Which implementations were affected, and which fixes apply?
The coordinated disclosure listed many implementations, each with its own CVE and fixed version. If you run any of these, match your deployed version against the fixed one. The researcher lists nginx, HAProxy, Jetty, NetScaler, Varnish and Cloudflare as not affected.
| Implementation | CVE | Affected | Fixed in |
|---|---|---|---|
| Apache HTTP Server (httpd) | CVE-2024-27316 | 2.4.17 - 2.4.58 | 2.4.59 |
| Apache Traffic Server | CVE-2024-31309 | 8.0.0-8.1.9, 9.0.0-9.2.3 | 8.1.10, 9.2.4 |
| Apache Tomcat | CVE-2024-24549 | 11.0.0-M1 to -M16, 10.1.0-M1 to 10.1.18, 9.0.0-M1 to 9.0.85, 8.5.0 to 8.5.98 | 11.0.0-M17, 10.1.19, 9.0.86, 8.5.99 |
| Node.js | CVE-2024-27983 | <=18.20.0, <=20.12.0, <=21.7.1 | 18.20.1, 20.12.1, 21.7.2 |
| Go net/http | CVE-2023-45288 | <go1.21.9, go1.22.0-go1.22.1 | go1.21.9, go1.22.2 (x/net 0.23.0) |
| nghttp2 | CVE-2024-28182 | <=1.60.0 | 1.61.0 |
| Envoy (oghttp2 codec) | CVE-2024-27919 | 1.29.0, 1.29.1 | 1.29.2 |
| Envoy (nghttp2 path) | CVE-2024-30255 | <=1.29.2 | 1.29.3, 1.28.2, 1.27.4, 1.26.8 |
| amphp/http | CVE-2024-2653 | <=1.7.2, 2.0.0-2.1.0 | 1.7.3, 2.1.1 |
| Tempesta FW | CVE-2024-2758 | 0.7.0 (rate limits off by default) | No fixed release named; enable rate limits |
| IBM WebSphere Liberty | CVE-2024-27268 | 18.0.0.2 - 24.0.0.4 | 24.0.0.5 |
| Mozilla Firefox / Thunderbird | CVE-2024-3302 | Firefox <125, ESR/Thunderbird <115.10 | 125, 115.10 |
04How is it different from Rapid Reset and MadeYouReset?
All three abuse HTTP/2 stream handling, but the mechanics and the right defences differ. CONTINUATION Flood keeps a single stream open forever by withholding END_HEADERS, so the request never completes. Rapid Reset and MadeYouReset instead churn through many streams that are cancelled or reset, each freeing a concurrency slot so the next can start immediately.
The practical difference is visibility and scale. Rapid Reset generates visible requests and usually needs a botnet to do real damage, so rate limiting and request logging both help. CONTINUATION Flood generates no completed requests, so it is invisible in the access log, and in many servers a single connection suffices, so per-request rate limiting does not catch it. The fix for CONTINUATION Flood is a cap on continuation frames, not a rate limit.
- For the stream-cancellation record attacks, see HTTP/2 Rapid Reset
- For the server-induced variant that bypasses Rapid Reset defences, see MadeYouReset
- For the broader category these sit in, see what an HTTP flood is
| Technique | CVE | Mechanism | Visible in access log? |
|---|---|---|---|
| CONTINUATION Flood | CVE-2024-27316 (Apache) | Endless CONTINUATION frames, no END_HEADERS | No completed request logged |
| Rapid Reset | CVE-2023-44487 | Open a stream, immediately RST_STREAM | Yes, many requests |
| MadeYouReset | CVE-2025-8671 | Malformed control frames make the server reset streams | Partly; server-side resets |
05How do I check and fix it?
Check the version of every HTTP/2 endpoint you expose, including servers behind a load balancer and HTTP/2 client libraries in your own code. Confirm whether HTTP/2 is even enabled, then match the version against the fixed one in the table. The checks below read state only.
The fix is to upgrade to the patched version. Where an upgrade is not yet possible and the server offers HTTP/1.1, disabling HTTP/2 removes the attack surface entirely at the cost of HTTP/2's performance benefits. On Apache this is a one-line change to the Protocols directive; restart the server afterwards.
# does the endpoint negotiate HTTP/2 at all?
curl -sI --http2 https://example.com/ -o /dev/null -w '%{http_version}\n'
# server versions (match against the fixed-version table)
apache2 -v # or: httpd -v
node --version
dpkg -l | grep -E 'apache2|nghttp2|nodejs' # Debian/Ubuntu package versions06What can a WAF or reverse proxy do about it?
Be precise about the limit. If the vulnerable server is the one terminating the HTTP/2 connection, a filter inside that same server cannot reliably save it, because the damage happens during header processing. The useful arrangement is a separate, non-vulnerable tier in front that terminates HTTP/2 itself.
A reverse proxy that is not affected, or that is patched, terminates the client connection and forwards clean, complete requests to the origin over a connection it controls. The malformed, never-ending header stream dies at that tier and never reaches the origin. This is the same reason a resilient proxy absorbs an HTTP flood before it reaches the application. What a proxy cannot do is make an unpatched origin safe if clients can still reach it directly, which is why edge filtering supplements patching rather than replacing it. For keeping clients off the origin address, see how to hide your origin IP.
| Measure | Stops the DoS? | Notes |
|---|---|---|
| Upgrade to the fixed version | Yes | The only complete fix |
| Disable HTTP/2 (serve HTTP/1.1) | Yes | Removes the surface; loses HTTP/2 benefits |
| Non-vulnerable reverse proxy in front | Yes, if it terminates HTTP/2 | Origin must still be patched or unreachable directly |
| Per-request rate limiting | No | No request completes, so there is nothing to count |
| Blocking source IPs | No | One connection can suffice; sources rotate |
07Timeline
| Date | Event |
|---|---|
| 5 Jan 2024 | Bartek Nowotarski discovers the CONTINUATION Flood class |
| 8 Jan 2024 | First reports sent to affected vendors |
| 25 Jan 2024 | Report sent to CERT/CC, which coordinates the disclosure |
| 22 Feb 2024 | CVE-2024-27316 reported to the Apache security team |
| 3 Apr 2024 | Embargo lifts; CERT/CC publishes VU#421644; oss-security post |
| 4 Apr 2024 | Apache HTTP Server 2.4.59 released with the fix |
| 16 Apr 2024 | Firefox 125 ships the client-side fix (CVE-2024-3302) |
Questions
Frequently asked questions
Sources
Sources and verification
A minimal Apache 2.4.68 (Debian apache2-bin 2.4.68-1~deb12u1, unpacked to a scratch directory) configuration with "Protocols http/1.1" passed apache2 -t, and the HTTP/2 negotiation check was run against example.com with curl 7.88.1, on Debian 12, October 2026.
- 01NVD - CVE-2024-27316 · NVD
- 02VU#421644 - HTTP/2 CONTINUATION frames can be utilized for DoS attacks · CERT/CC
- 03Apache HTTP Server 2.4 vulnerabilities (CVE-2024-27316) · Apache
- 04HTTP/2 CONTINUATION Flood · Bartek Nowotarski
- 05oss-security: HTTP/2 CONTINUATION frames DoS · openwall
- 06Debian security tracker - CVE-2024-27316 · Debian
- 07Ubuntu - CVE-2024-27316 · Ubuntu
- 08Go announce: CVE-2023-45288 (net/http CONTINUATION) · Go
- 09RFC 9113: HTTP/2, section 10.5.1 (Limits on Field Block Size) · IETF
Last updated