Vulnerabilities

8 min readUpdated

HTTP/2 CONTINUATION Flood (CVE-2024-27316)

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.

ImplementationCVEAffectedFixed in
Apache HTTP Server (httpd)CVE-2024-273162.4.17 - 2.4.582.4.59
Apache Traffic ServerCVE-2024-313098.0.0-8.1.9, 9.0.0-9.2.38.1.10, 9.2.4
Apache TomcatCVE-2024-2454911.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.9811.0.0-M17, 10.1.19, 9.0.86, 8.5.99
Node.jsCVE-2024-27983<=18.20.0, <=20.12.0, <=21.7.118.20.1, 20.12.1, 21.7.2
Go net/httpCVE-2023-45288<go1.21.9, go1.22.0-go1.22.1go1.21.9, go1.22.2 (x/net 0.23.0)
nghttp2CVE-2024-28182<=1.60.01.61.0
Envoy (oghttp2 codec)CVE-2024-279191.29.0, 1.29.11.29.2
Envoy (nghttp2 path)CVE-2024-30255<=1.29.21.29.3, 1.28.2, 1.27.4, 1.26.8
amphp/httpCVE-2024-2653<=1.7.2, 2.0.0-2.1.01.7.3, 2.1.1
Tempesta FWCVE-2024-27580.7.0 (rate limits off by default)No fixed release named; enable rate limits
IBM WebSphere LibertyCVE-2024-2726818.0.0.2 - 24.0.0.424.0.0.5
Mozilla Firefox / ThunderbirdCVE-2024-3302Firefox <125, ESR/Thunderbird <115.10125, 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.

TechniqueCVEMechanismVisible in access log?
CONTINUATION FloodCVE-2024-27316 (Apache)Endless CONTINUATION frames, no END_HEADERSNo completed request logged
Rapid ResetCVE-2023-44487Open a stream, immediately RST_STREAMYes, many requests
MadeYouResetCVE-2025-8671Malformed control frames make the server reset streamsPartly; 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.

Check whether HTTP/2 is served, and the server version
# 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 versions

06What 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.

MeasureStops the DoS?Notes
Upgrade to the fixed versionYesThe only complete fix
Disable HTTP/2 (serve HTTP/1.1)YesRemoves the surface; loses HTTP/2 benefits
Non-vulnerable reverse proxy in frontYes, if it terminates HTTP/2Origin must still be patched or unreachable directly
Per-request rate limitingNoNo request completes, so there is nothing to count
Blocking source IPsNoOne connection can suffice; sources rotate

07Timeline

DateEvent
5 Jan 2024Bartek Nowotarski discovers the CONTINUATION Flood class
8 Jan 2024First reports sent to affected vendors
25 Jan 2024Report sent to CERT/CC, which coordinates the disclosure
22 Feb 2024CVE-2024-27316 reported to the Apache security team
3 Apr 2024Embargo lifts; CERT/CC publishes VU#421644; oss-security post
4 Apr 2024Apache HTTP Server 2.4.59 released with the fix
16 Apr 2024Firefox 125 ships the client-side fix (CVE-2024-3302)

Questions

Frequently asked questions

No. CVE-2024-27316 is the Apache HTTP Server identifier for the bug. The CONTINUATION Flood is a class that affected many HTTP/2 implementations at once, each with its own CVE, such as CVE-2024-27983 for Node.js, CVE-2023-45288 for Go and CVE-2024-28182 for nghttp2. CERT/CC note VU#421644 tracks the whole coordinated disclosure and lists every confirmed implementation and fix.

No. The researcher's disclosure lists nginx as not affected, along with HAProxy, Jetty, NetScaler, Varnish and Cloudflare, and no nginx CVE was issued for the CONTINUATION Flood. If you run one of these servers you did not need a CONTINUATION Flood patch, though you should still track their other HTTP/2 advisories, such as those for Rapid Reset and MadeYouReset.

Yes, by removing the attack surface. If the server supports HTTP/1.1, disabling HTTP/2 closes the vulnerability; on Apache that is setting Protocols to http/1.1. Alternatively, place a non-vulnerable reverse proxy in front that terminates HTTP/2 and forwards clean requests. Both are stopgaps. The complete fix is to upgrade the affected software to its patched version and restart it.

Not reliably. Rate limiting counts completed requests, and a CONTINUATION Flood never completes a request, so there is nothing to count. In many affected servers a single connection was enough to cause harm, so per-IP request limits do not help either. The effective defence is a cap on the number of continuation frames per stream, which is exactly what the vendor fixes add.

No. As of October 2026 CVE-2024-27316 and the other CONTINUATION Flood CVEs are not listed in the CISA Known Exploited Vulnerabilities catalogue. They were coordinated through CERT/CC before public disclosure, which gave vendors time to ship fixes. That is not a reason to delay patching: internet-facing HTTP/2 servers on affected versions should be updated.

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.

  1. 01NVD - CVE-2024-27316 · NVD
  2. 02VU#421644 - HTTP/2 CONTINUATION frames can be utilized for DoS attacks · CERT/CC
  3. 03Apache HTTP Server 2.4 vulnerabilities (CVE-2024-27316) · Apache
  4. 04HTTP/2 CONTINUATION Flood · Bartek Nowotarski
  5. 05oss-security: HTTP/2 CONTINUATION frames DoS · openwall
  6. 06Debian security tracker - CVE-2024-27316 · Debian
  7. 07Ubuntu - CVE-2024-27316 · Ubuntu
  8. 08Go announce: CVE-2023-45288 (net/http CONTINUATION) · Go
  9. 09RFC 9113: HTTP/2, section 10.5.1 (Limits on Field Block Size) · IETF

Last updated