HTTP/2 Rapid Reset: a protocol flaw that turned into the largest attacks ever recorded
Not a memory bug. HTTP/2 lets a client open a request and cancel it immediately, and the cancellation costs the client nothing while costing the server real work. Doing that in a loop produced denial-of-service attacks an order of magnitude larger than anything seen before.
A fixed package version is available on 4 of the releases below. 1 has an advisory with no fix released. Each row names the version, and the section below it says when this does not apply to you at all.
What it actually is
A client streams RST_STREAM frames to cancel requests as fast as it can create them. The server keeps allocating and tearing down request state while the connection limit is never reached, because cancelled streams do not count against it.
What an attacker gets: Denial of service, at a scale that made it notable. No data disclosure and no code execution.
When it applies to you, and when it does not
An old package version and a real exposure are different things. These are the conditions this one needs.
- HTTP/2 has to be enabled and reachable. A server behind a reverse proxy or a CDN that terminates HTTP/2 is protected by whatever that layer does, not by its own version.
- The fixes are rate limits and accounting changes rather than a single corrected line, so different servers addressed it differently and on different dates.
- This is the clearest case on this site of a CVE being about a protocol rather than a package. nginx carries advisories for it, and Apache HTTP Server's own package carries none on these releases. On Rocky Linux and AlmaLinux, though, Apache's HTTP/2 support is a separate package, mod_http2, and AlmaLinux's advisory for that package names this CVE: read the mod_http2 table as well.
Check your own server
ss -lntp | grep -E ':(80|443)' && (nginx -V 2>&1 | grep -o with-http_v2_module; grep -rn 'http2' /etc/nginx/ 2>/dev/null | head -5)The question is whether anything on this machine terminates HTTP/2 for the internet, not which version it is.
Fixed package version, per distribution
From each distribution’s own advisory data, asked per release. A version here is the package version that carries the fix on that release, not the upstream release number.
nginx
| Release | Source package | State | Fixed in |
|---|---|---|---|
| Ubuntu 22.04 LTS | nginx | No advisory names it | no advisory for this release names it |
| Ubuntu 24.04 LTS | nginx | No advisory names it | no advisory for this release names it |
| Debian 12 (bookworm) | nginx | No fix released | no fixed version released |
| Debian 13 (trixie) | nginx | Fixed | 1.24.0-2 |
| Rocky Linux 9 | nginx | Fixed | 1:1.22.1-3.module+el9.2.0+15280+45c505d6.1 |
| AlmaLinux 9 | nginx | Fixed | 1:1.22.1-3.module_el9.2.0+44+f932b372.1.alma.1 |
Install the fix with apt update && apt install --only-upgrade nginx nginx-core on Debian and Ubuntu, or dnf update nginx on Rocky Linux and AlmaLinux. Restart whatever was using it afterwards: a patched file on disk is not a patched process in memory.
Apache HTTP Server
| Release | Source package | State | Fixed in |
|---|---|---|---|
| Ubuntu 22.04 LTS | apache2 | No advisory names it | no advisory for this release names it |
| Ubuntu 24.04 LTS | apache2 | No advisory names it | no advisory for this release names it |
| Debian 12 (bookworm) | apache2 | No advisory names it | no advisory for this release names it |
| Debian 13 (trixie) | apache2 | No advisory names it | no advisory for this release names it |
| Rocky Linux 9 | httpd | No advisory names it | Rocky Linux and AlmaLinux package Apache's HTTP/2 support separately: see the mod_http2 table |
| AlmaLinux 9 | httpd | No advisory names it | Rocky Linux and AlmaLinux package Apache's HTTP/2 support separately: see the mod_http2 table |
Install the fix with apt update && apt install --only-upgrade apache2 apache2-bin on Debian and Ubuntu, or dnf update httpd httpd-core on Rocky Linux and AlmaLinux. Restart whatever was using it afterwards: a patched file on disk is not a patched process in memory.
Apache HTTP/2 module (mod_http2)
| Release | Source package | State | Fixed in |
|---|---|---|---|
| Ubuntu 22.04 LTS | Package not shipped | Built into apache2 on this release: see the Apache HTTP Server table | |
| Ubuntu 24.04 LTS | Package not shipped | Built into apache2 on this release: see the Apache HTTP Server table | |
| Debian 12 (bookworm) | Package not shipped | Built into apache2 on this release: see the Apache HTTP Server table | |
| Debian 13 (trixie) | Package not shipped | Built into apache2 on this release: see the Apache HTTP Server table | |
| Rocky Linux 9 | mod_http2 | No advisory names it | No Rocky Linux 9 advisory names it. AlmaLinux 9, rebuilt from the same Red Hat Enterprise Linux 9 source, fixed it in 2.0.26-1.el9 (ALSA-2024:2368). |
| AlmaLinux 9 | mod_http2 | Fixed | 2.0.26-1.el9 |
Install the fix with dnf update mod_http2 on Rocky Linux and AlmaLinux. Debian and Ubuntu build it into apache2, so the Apache HTTP Server line above covers them. Restart whatever was using it afterwards: a patched file on disk is not a patched process in memory.
What SecAI has recorded about it
The HTTP/2 protocol allows a denial of service (server resource consumption) because request cancellation can reset many streams quickly, as exploited in the wild in August through October 2023.
Recorded from nvd. Its weakness class is CWE-400, from NVD.
- http://www.openwall.com/lists/oss-security/2023/10/10/6
- http://www.openwall.com/lists/oss-security/2023/10/10/7
- http://www.openwall.com/lists/oss-security/2023/10/13/4
- http://www.openwall.com/lists/oss-security/2023/10/13/9
- http://www.openwall.com/lists/oss-security/2023/10/18/4
- http://www.openwall.com/lists/oss-security/2023/10/18/8
Read next
Other CVEs explained in full
Then check the rest of the server
The command above shows which version you run, and the table shows which version fixes CVE-2023-44487. One more read-only command, with no account and no agent, checks the rest of the server’s setup: SSH, the firewall, how many security updates are waiting, and signs that it has already been compromised. It changes nothing. It does not match your packages against advisories; SecAI’s agent does that, checking installed packages against published advisories every 12 hours.