CVE-2023-45288
High · 7.5CVSS
7.5
EPSS
92.0%
Published
Apr 4, 2024
CISA due date
—
Cloudanix analysis
A flaw in how some web servers handle web traffic allows an attacker to send a flood of junk data that can overload the server, making the service unavailable for legitimate users.
- Exploitation
- Remote Unauthenticated
- Attacker needs
- None
- Complexity
- Low
- Impact
- Denial Of Service
- Component
- Library
- Class
- Denial of service
- Remediation
- Upgrade
- Effort
- Medium
- Patch risk
- Low
What it actually does
An unauthenticated remote attacker can cause a denial-of-service condition on an HTTP/2-enabled endpoint. The vulnerability lies in the excessive processing of HTTP/2 CONTINUATION frames. Even after a server determines that a request's headers exceed the allowed size limit, it continues to parse all associated CONTINUATION frames. This allows an attacker to force the server to perform computationally expensive parsing operations, particularly with Huffman-encoded headers, leading to CPU resource exhaustion and rendering the service unresponsive.
Why it matters to the business
This vulnerability can lead to a complete denial of service for critical web applications, APIs, and services. An attacker can make your services unavailable to customers, partners, and internal users, resulting in direct revenue loss, reputational damage, and potential violation of Service Level Agreements (SLAs). The extremely high EPSS score indicates a high probability of active exploitation, making this a high-priority threat to business continuity.
How an attack unfolds
A remote, unauthenticated attacker targets a public-facing server that supports the HTTP/2 protocol. The attacker crafts and sends a specially formed HTTP/2 request that begins with a HEADERS frame and is followed by an excessive number of CONTINUATION frames. The cumulative size of the headers is intentionally larger than the server's configured limit. Despite deciding to ultimately reject the request, the vulnerable server is forced to parse every CONTINUATION frame to maintain the HPACK state. By sending a continuous stream of these requests, the attacker monopolizes the server's CPU resources, causing it to become unresponsive to legitimate traffic and leading to a denial-of-service.
How to fix it
The primary remediation is to upgrade all components that terminate HTTP/2 traffic to a patched version. This includes web servers, reverse proxies, load balancers, and application-layer libraries. Consult vendor advisories for specific patches addressing CVE-2023-45288 or the 'HTTP/2 CONTINUATION Flood' attack. If patching is not immediately possible, consider temporary mitigations such as applying rate limits on edge devices, using a Web Application Firewall (WAF) to limit the number of frames per HTTP/2 stream, or temporarily disabling HTTP/2 if the business impact is acceptable.
How to confirm the fix worked
To validate the fix, ensure that all relevant software components have been upgraded to a version that explicitly addresses CVE-2023-45288. After patching, you can use a security testing tool or a custom script to simulate the 'CONTINUATION Flood' attack against a non-production endpoint. A successfully patched system should terminate the malicious connection promptly without a significant increase in CPU usage. To identify exposure, inventory all HTTP/2-enabled endpoints and check their software versions against vendor advisories for this vulnerability.
Typical attack path
- The attacker identifies a target server, load balancer, or reverse proxy that accepts HTTP/2 connections.
- The attacker crafts a malicious HTTP/2 stream containing a HEADERS frame followed by an abnormally large number of CONTINUATION frames.
- The attacker sends the malicious stream to the target server over the network.
- The target server begins parsing the excessive frames, causing its CPU utilization to spike to 100%.
- The server becomes resource-exhausted and is unable to process legitimate user requests, resulting in a denial of service.
How to detect it
Detection of this attack is primarily behavioral. Monitor CPU utilization on HTTP/2-enabled servers for sustained, abnormally high levels. Analyze network traffic or server logs for an unusually high ratio of HTTP/2 CONTINUATION frames to HEADERS frames within a single stream. A high rate of HTTP/2 stream errors, particularly related to protocol errors or header size limits (e.g., HTTP 431), originating from a small number of source IPs can also indicate an attack. Some network security monitoring tools or WAFs may have specific signatures for 'HTTP/2 CONTINUATION Flood' that should be enabled.
- request header fields too large
- closing connection due to excessive continuation frames
- HTTP/2 stream error: protocol error
- HTTP/2 GOAWAY frame received with error code ENHANCE_YOUR_CALM
- refused stream due to excessive headers
What your security team should do
- Immediately patch all public-facing HTTP/2 endpoints, as the high CVSS score (7.5) and very high EPSS score (91.97%) indicate a significant and likely threat.
- If patching is delayed, deploy mitigation rules on Web Application Firewalls (WAFs) or other edge devices to limit the number of HTTP/2 CONTINUATION frames per stream.
- Implement monitoring and alerting for sustained high CPU utilization on servers that terminate HTTP/2 traffic, as this is the primary indicator of an ongoing attack.
- Ensure network and server logging can capture metadata about HTTP/2 streams, such as frame counts and stream errors, to aid in detection and forensic analysis.
The record
An attacker may cause an HTTP/2 endpoint to read arbitrary amounts of header data by sending an excessive number of CONTINUATION frames. Maintaining HPACK state requires parsing and processing all HEADERS and CONTINUATION frames on a connection. When a request's headers exceed MaxHeaderBytes, no memory is allocated to store the excess headers, but they are still parsed. This permits an attacker to cause an HTTP/2 endpoint to read arbitrary amounts of header data, all associated with a request which is going to be rejected. These headers can include Huffman-encoded data which is significantly more expensive for the receiver to decode than for an attacker to send. The fix sets a limit on the amount of excess header frames we will process before closing a connection.
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|---|---|---|
| Go | golang.org/x/net | 0 | 0.23.0 |
| Go | golang.org/x/net/http2 | 0 | 0.23.0 |
| Go | net/http | 0 | 1.21.9 |
| Go | net/http | 1.22.0-0 | 1.22.2 |
| Go | stdlib | 0 | 1.21.9 |
| AlmaLinux:8 | delve | 0 | 1.20.2-1.module_el8.9.0+3642+43318da8 |
| AlmaLinux:8 | delve | 0 | 1.21.2-3.module_el8.10.0+3760+4dd778f9 |
| AlmaLinux:8 | git-lfs | 0 | 3.2.0-3.el8_9 |
| AlmaLinux:8 | git-lfs | 0 | 3.4.1-2.el8_10 |
| AlmaLinux:8 | go-toolset | 0 | 1.20.12-1.module_el8.9.0+3728+f1d47c6f |
| AlmaLinux:8 | go-toolset | 0 | 1.21.9-1.module_el8.10.0+3840+edaca3c3 |
| AlmaLinux:8 | golang | 0 | 1.20.12-8.module_el8.9.0+3818+ac9bcae6 |
| AlmaLinux:8 | golang | 0 | 1.21.9-1.module_el8.10.0+3840+edaca3c3 |
| AlmaLinux:8 | golang-bin | 0 | 1.20.12-8.module_el8.9.0+3818+ac9bcae6 |
| AlmaLinux:8 | golang-bin | 0 | 1.21.9-1.module_el8.10.0+3840+edaca3c3 |
| AlmaLinux:8 | golang-docs | 0 | 1.20.12-8.module_el8.9.0+3818+ac9bcae6 |
| AlmaLinux:8 | golang-docs | 0 | 1.21.9-1.module_el8.10.0+3840+edaca3c3 |
| AlmaLinux:8 | golang-misc | 0 | 1.20.12-8.module_el8.9.0+3818+ac9bcae6 |
| AlmaLinux:8 | golang-misc | 0 | 1.21.9-1.module_el8.10.0+3840+edaca3c3 |
| AlmaLinux:8 | golang-src | 0 | 1.20.12-8.module_el8.9.0+3818+ac9bcae6 |
| AlmaLinux:8 | golang-src | 0 | 1.21.9-1.module_el8.10.0+3840+edaca3c3 |
| AlmaLinux:8 | golang-tests | 0 | 1.20.12-8.module_el8.9.0+3818+ac9bcae6 |
| AlmaLinux:8 | golang-tests | 0 | 1.21.9-1.module_el8.10.0+3840+edaca3c3 |
| AlmaLinux:9 | git-lfs | 0 | 3.2.0-2.el9_3 |
| AlmaLinux:9 | git-lfs | 0 | 3.4.1-2.el9_4 |
| AlmaLinux:9 | go-toolset | 0 | 1.20.12-4.el9_3 |
| AlmaLinux:9 | go-toolset | 0 | 1.21.9-2.el9_4 |
| AlmaLinux:9 | golang | 0 | 1.20.12-4.el9_3 |
| AlmaLinux:9 | golang | 0 | 1.21.9-2.el9_4 |
| AlmaLinux:9 | golang-bin | 0 | 1.20.12-4.el9_3 |
| AlmaLinux:9 | golang-bin | 0 | 1.21.9-2.el9_4 |
| AlmaLinux:9 | golang-docs | 0 | 1.20.12-4.el9_3 |
| AlmaLinux:9 | golang-docs | 0 | 1.21.9-2.el9_4 |
| AlmaLinux:9 | golang-misc | 0 | 1.20.12-4.el9_3 |
| AlmaLinux:9 | golang-misc | 0 | 1.21.9-2.el9_4 |
| AlmaLinux:9 | golang-src | 0 | 1.20.12-4.el9_3 |
| AlmaLinux:9 | golang-src | 0 | 1.21.9-2.el9_4 |
| AlmaLinux:9 | golang-tests | 0 | 1.20.12-4.el9_3 |
| AlmaLinux:9 | golang-tests | 0 | 1.21.9-2.el9_4 |
| Bitnami | golang | 0 | 1.21.9 |
| Chainguard | aactl | 0 | 0.4.12-r11 |
| Chainguard | actions-runner-controller | 0 | 0.9.0-r1 |
| Chainguard | actions-runner-controller-compat | 0 | 0.9.0-r1 |
| Chainguard | actions-runner-controller-fips | 0 | 0.9.1-r0 |
| Chainguard | actions-runner-controller-fips-compat | 0 | 0.9.1-r0 |
| Chainguard | addon-resizer | 0 | 1.8.20-r1 |
| Chainguard | addon-resizer-compat | 0 | 1.8.20-r1 |
| Chainguard | addon-resizer-fips | 0 | 1.8.20-r1 |
| Chainguard | addon-resizer-fips-compat | 0 | 1.8.20-r1 |
| Chainguard | amass | 0 | 4.2.0-r8 |
| Chainguard | apko | 0 | 0.14.0-r7 |
| Chainguard | argo-cd-2.10 | 0 | 2.10.7-r1 |
| Chainguard | argo-cd-2.10-compat | 0 | 2.10.7-r1 |
| Chainguard | argo-cd-2.10-repo-server | 0 | 2.10.7-r1 |
| Chainguard | argo-cd-2.8 | 0 | 2.8.16-r0 |
| Chainguard | argo-cd-2.8-compat | 0 | 2.8.16-r0 |
| Chainguard | argo-cd-2.8-repo-server | 0 | 2.8.16-r0 |
| Chainguard | argo-cd-2.9 | 0 | 2.9.12-r0 |
| Chainguard | argo-cd-2.9-compat | 0 | 2.9.12-r0 |
| Chainguard | argo-cd-2.9-repo-server | 0 | 2.9.12-r0 |
| Chainguard | argo-cd-fips-2.10 | 0 | 2.10.6-r1 |
| Chainguard | argo-cd-fips-2.10-compat | 0 | 2.10.6-r1 |
| Chainguard | argo-cd-fips-2.10-repo-server | 0 | 2.10.6-r1 |
| Chainguard | argo-cd-fips-2.8 | 0 | 2.8.15-r1 |
| Chainguard | argo-cd-fips-2.8-compat | 0 | 2.8.15-r1 |
| Chainguard | argo-cd-fips-2.8-repo-server | 0 | 2.8.15-r1 |
| Chainguard | argo-cd-fips-2.9 | 0 | 2.9.11-r1 |
| Chainguard | argo-cd-fips-2.9-compat | 0 | 2.9.11-r1 |
| Chainguard | argo-cd-fips-2.9-repo-server | 0 | 2.9.11-r1 |
| Chainguard | argo-workflow-cli | 0 | 3.5.5-r5 |
| Chainguard | argo-workflow-cli | 0 | 3.6.5-r2 |
| Chainguard | argo-workflow-cli-fips | 0 | 3.5.5-r2 |
| Chainguard | argo-workflow-controller | 0 | 3.5.5-r5 |
| Chainguard | argo-workflow-controller | 0 | 3.6.5-r2 |
| Chainguard | argo-workflow-controller-compat | 0 | 3.5.5-r5 |
| Chainguard | argo-workflow-controller-compat | 0 | 3.6.5-r2 |
| Chainguard | argo-workflow-controller-compat-fips | 0 | 3.5.5-r2 |
| Chainguard | argo-workflow-controller-fips | 0 | 3.5.5-r2 |
| Chainguard | argo-workflow-executor | 0 | 3.5.5-r5 |
| Chainguard | argo-workflow-executor | 0 | 3.6.5-r2 |
| Chainguard | argo-workflow-executor-compat | 0 | 3.5.5-r5 |
| Chainguard | argo-workflow-executor-compat | 0 | 3.6.5-r2 |
| Chainguard | argo-workflow-executor-compat-fips | 0 | 3.5.5-r2 |
| Chainguard | argo-workflow-executor-fips | 0 | 3.5.5-r2 |
| Chainguard | argo-workflows | 0 | 3.5.5-r5 |
| Chainguard | argo-workflows | 0 | 3.6.5-r2 |
| Chainguard | argo-workflows-fips | 0 | 3.5.5-r2 |
| Chainguard | argo-workflows-known-hosts | 0 | 3.5.5-r5 |
| Chainguard | argo-workflows-known-hosts | 0 | 3.6.5-r2 |
| Chainguard | argo-workflows-known-hosts-fips | 0 | 3.5.5-r2 |
| Chainguard | argo-workflows-ui | 0 | 3.5.5-r5 |
| Chainguard | argo-workflows-ui | 0 | 3.6.5-r2 |
| Chainguard | atlantis | 0 | 0.27.2-r2 |
| Chainguard | atlantis-fips | 0 | 0.27.2-r5 |
| Chainguard | aws-ebs-csi-driver | 0 | 1.29.1-r1 |
| Chainguard | aws-ebs-csi-driver-1.18 | 0 | 1.18.0-r13 |
| Chainguard | aws-ebs-csi-driver-1.19 | 0 | 1.19.0-r13 |
| Chainguard | aws-ebs-csi-driver-fips | 0 | 1.29.1-r3 |
| Chainguard | aws-efs-csi-driver | 0 | 1.7.7-r1 |
| Chainguard | aws-efs-csi-driver-fips | 0 | 1.7.0-r8 |
| Chainguard | aws-efs-csi-driver-fips-1.6 | 0 | 1.6.0-r8 |
| Chainguard | aws-flb-cloudwatch | 0 | 1.9.4-r8 |
| Chainguard | aws-flb-cloudwatch-compat | 0 | 1.9.4-r8 |
| Chainguard | aws-flb-firehose | 0 | 1.7.2-r8 |
| Chainguard | aws-flb-firehose-compat | 0 | 1.7.2-r8 |
| Chainguard | aws-flb-kinesis | 0 | 1.10.2-r9 |
| Chainguard | aws-flb-kinesis-compat | 0 | 1.10.2-r9 |
| Chainguard | aws-load-balancer-controller | 0 | 2.7.2-r2 |
| Chainguard | aws-load-balancer-controller-2.4.5 | 0 | 2.4.5-r9 |
| Chainguard | aws-load-balancer-controller-2.5 | 0 | 2.5.4-r4 |
| Chainguard | aws-load-balancer-controller-compat | 0 | 2.7.2-r2 |
| Chainguard | aws-load-balancer-controller-compat-2.4.5 | 0 | 2.5.4-r4 |
| Chainguard | aws-load-balancer-controller-fips | 0 | 2.7.2-r3 |
| Chainguard | aws-network-policy-agent | 0 | 1.1.0-r1 |
| Chainguard | aws-network-policy-agent-compat | 0 | 1.1.0-r1 |
| Chainguard | azure-aad-pod-identity-mic | 0 | 1.8.17-r7 |
| Chainguard | azure-aad-pod-identity-nmi | 0 | 1.8.17-r7 |
| Chainguard | bank-vaults | 0 | 1.20.4-r12 |
| Chainguard | bank-vaults-fips | 0 | 1.20.4-r9 |
| Chainguard | bank-vaults-template | 0 | 1.20.4-r12 |
| Chainguard | bank-vaults-template-fips | 0 | 1.20.4-r9 |
| Chainguard | bazelisk | 0 | 1.19.0-r2 |
| Chainguard | bazelisk-default | 0 | 1.19.0-r2 |
| Chainguard | bincapz | 0 | 0.8.0-r1 |
| Chainguard | bom | 0 | 0.6.0-r2 |
| Chainguard | boring-registry | 0 | 0.13.2-r4 |
| Chainguard | boring-registry-fips | 0 | 0.14.0-r0 |
| Chainguard | buf | 0 | 1.31.0-r0 |
| Chainguard | buildctl | 0 | 0.13.1-r2 |
| Chainguard | buildkitd | 0 | 0.13.1-r2 |
| Chainguard | caddy | 0 | 2.7.6-r8 |
| Chainguard | caddy-fips | 0 | 2.7.6-r5 |
| Chainguard | caddy-man | 0 | 2.7.6-r5 |
| Chainguard | caddy-man | 0 | 2.7.6-r8 |
| Chainguard | caddy-src | 0 | 2.7.6-r8 |
| Chainguard | cadvisor | 0 | 0.49.1-r5 |
| Chainguard | cadvisor-compat | 0 | 0.49.1-r5 |
| Chainguard | cadvisor-fips | 0 | 0.49.1-r4 |
| Chainguard | calico | 0 | 3.27.3-r1 |
| Chainguard | calico-apiserver | 0 | 3.27.3-r1 |
| Chainguard | calico-app-policy | 0 | 3.27.3-r1 |
| Chainguard | calico-cni | 0 | 3.27.3-r1 |
| Chainguard | calico-cni-compat | 0 | 3.27.3-r1 |
| Chainguard | calico-cni-fips-3.25-compat | 0 | 3.25.2-r7 |
| Chainguard | calico-cni-fips-compat | 0 | 3.27.3-r1 |
| Chainguard | calico-felix | 0 | 3.27.3-r1 |
| Chainguard | calico-fips | 0 | 3.27.3-r1 |
| Chainguard | calico-fips-3.25 | 0 | 3.25.2-r7 |
| Chainguard | calico-fips-apiserver | 0 | 3.27.3-r1 |
| Chainguard | calico-fips-apiserver-3.25 | 0 | 3.25.2-r7 |
| Chainguard | calico-fips-app-policy | 0 | 3.27.3-r1 |
| Chainguard | calico-fips-app-policy-3.25 | 0 | 3.25.2-r7 |
| Chainguard | calico-fips-cni | 0 | 3.27.3-r1 |
| Chainguard | calico-fips-cni-3.25 | 0 | 3.25.2-r7 |
| Chainguard | calico-fips-felix | 0 | 3.27.3-r1 |
| Chainguard | calico-fips-felix-3.25 | 0 | 3.25.2-r7 |
| Chainguard | calico-fips-key-cert-provisioner | 0 | 3.27.3-r1 |
| Chainguard | calico-fips-kube-controllers | 0 | 3.27.3-r1 |
| Chainguard | calico-fips-kube-controllers-3.25 | 0 | 3.25.2-r7 |
| Chainguard | calico-fips-node | 0 | 3.27.3-r1 |
| Chainguard | calico-fips-node-3.25 | 0 | 3.25.2-r7 |
| Chainguard | calico-fips-pod2daemon | 0 | 3.27.3-r1 |
| Chainguard | calico-fips-pod2daemon-3.25 | 0 | 3.25.2-r7 |
| Chainguard | calico-fips-typha-client | 0 | 3.27.3-r1 |
| Chainguard | calico-fips-typha-client-3.25 | 0 | 3.25.2-r7 |
| Chainguard | calico-fips-typhad | 0 | 3.27.3-r1 |
| Chainguard | calico-fips-typhad-3.25 | 0 | 3.25.2-r7 |
| Chainguard | calico-key-cert-provisioner | 0 | 3.27.3-r1 |
| Chainguard | calico-kube-controllers | 0 | 3.27.3-r1 |
| Chainguard | calico-node | 0 | 3.27.3-r1 |
| Chainguard | calico-pod2daemon | 0 | 3.27.3-r1 |
| Chainguard | calico-pod2daemon-flexvol-compat | 0 | 3.27.3-r1 |
| Chainguard | calico-typha-client | 0 | 3.27.3-r1 |
| Chainguard | calico-typhad | 0 | 3.27.3-r1 |
| Chainguard | calicoctl | 0 | 3.27.3-r1 |
| Chainguard | calicoctl-fips | 0 | 3.27.3-r1 |
| Chainguard | calicoctl-fips-3.25 | 0 | 3.25.2-r7 |
| Chainguard | capslock | 0 | 0.2.2-r1 |
| Chainguard | cass-operator | 0 | 1.19.1-r1 |
| Chainguard | cass-operator-compat | 0 | 1.19.1-r1 |
| Chainguard | cass-operator-compat-fips | 0 | 1.19.1-r1 |
| Chainguard | cass-operator-config | 0 | 1.19.1-r1 |
| Chainguard | cass-operator-fips | 0 | 1.19.1-r1 |
| Chainguard | cass-operator-fips-no-pvc-delete | 0 | 1.19.1-r2 |
| Chainguard | cass-operator-fips-no-pvc-delete-compat | 0 | 1.19.1-r2 |
| Chainguard | cert-exporter | 0 | 2.12.0-r3 |
| Chainguard | cert-exporter-fips | 0 | 2.12.0-r4 |
| Chainguard | cert-manager-1.12 | 0 | 1.12.9-r3 |
| Chainguard | cert-manager-1.12-acmesolver | 0 | 1.12.9-r3 |
| Chainguard | cert-manager-1.12-cainjector | 0 | 1.12.9-r3 |
| Chainguard | cert-manager-1.12-controller | 0 | 1.12.9-r3 |
| Chainguard | cert-manager-1.12-webhook | 0 | 1.12.9-r3 |
| Chainguard | cert-manager-1.13 | 0 | 1.13.5-r2 |
| Chainguard | cert-manager-1.13-acmesolver | 0 | 1.13.5-r2 |
| Chainguard | cert-manager-1.13-cainjector | 0 | 1.13.5-r2 |
| Chainguard | cert-manager-1.13-controller | 0 | 1.13.5-r2 |
| Chainguard | cert-manager-1.13-webhook | 0 | 1.13.5-r2 |
| Chainguard | cert-manager-1.14 | 0 | 1.14.4-r3 |
| Chainguard | cert-manager-1.14-acmesolver | 0 | 1.14.4-r3 |
| Chainguard | cert-manager-1.14-cainjector | 0 | 1.14.4-r3 |
Related vulnerabilities
- CVE-2026-27141 Due to missing nil check, sending 0x0a-0x0f HTTP/2 frames will cause a running server to… Also affects golang.org/x/net
- CVE-2025-58190 The html.Parse function in golang.org/x/net/html has an infinite parsing loop when… Also affects golang.org/x/net
- CVE-2025-47911 The html.Parse function in golang.org/x/net/html has quadratic parsing complexity when… Also affects golang.org/x/net
- CVE-2025-22870 Matching of hosts against proxy patterns can improperly treat an IPv6 zone ID as a… Also affects golang.org/x/net
- CVE-2024-45338 An attacker can craft an input to the Parse functions that would be processed… Also affects golang.org/x/net
- CVE-2023-44487 The HTTP/2 protocol allows a denial of service (server resource consumption) because… Also affects golang.org/x/net
- CVE-2025-68121 During session resumption in crypto/tls, if the underlying Config has its ClientCAs or… Also affects stdlib
- CVE-2025-22873 It was possible to improperly access the parent directory of an os.Root by opening a… Also affects stdlib