CVE-2026-33871
High · 7.5CVSS
7.5
EPSS
1.2%
Published
Mar 27, 2026
CISA due date
—
Cloudanix analysis
A remote attacker could make affected Netty-based web services slow down or stop responding by sending specially crafted HTTP/2 traffic.
- 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
This vulnerability affects Netty-based HTTP/2 servers before Netty 4.1.132.Final and 4.2.10.Final. A remote unauthenticated client can send a large sequence of HTTP/2 CONTINUATION frames, including zero-length frames, in a way that avoids existing size-based header protections. Because affected versions do not adequately limit the number of CONTINUATION frames, the server can spend excessive CPU processing the stream while the attacker uses very little bandwidth. The result is application-layer denial of service: event-loop threads can become saturated, legitimate HTTP/2 requests may stall or time out, and the service may become unresponsive without the attacker needing credentials or high traffic volume.
Why it matters to the business
Publicly reachable services using vulnerable Netty HTTP/2 components may be disrupted by low-bandwidth remote attacks. The main operational risk is service outage or severe latency for APIs, gateways, microservices, and applications built on Netty. Although there is no indication of data theft or code execution from this flaw, availability loss can affect customer-facing systems, internal service-to-service communication, SLAs, incident response workload, and autoscaling costs. The CVSS availability impact is high, EPSS is currently low, it is not listed in CISA KEV, and no mature public exploit is indicated, but remediation should still be prioritized for internet-facing or business-critical HTTP/2 services because exploitation requires no authentication and little attacker infrastructure.
How an attack unfolds
An attacker identifies a service that supports HTTP/2 and is implemented directly or indirectly with a vulnerable Netty version. The attacker opens one or more HTTP/2 connections and begins a request or header block that uses CONTINUATION frames. Instead of sending a normal finite header sequence, the attacker floods the server with many CONTINUATION frames, including zero-byte frames that avoid triggering size-based header limits. The Netty HTTP/2 processing path continues handling the frames and consuming CPU on event-loop threads. With enough streams or connections, CPU usage rises sharply, request handling slows, and the service can become unresponsive to legitimate clients. The attack is especially efficient because it can consume disproportionate server CPU compared with the attacker's network bandwidth.
How to fix it
Upgrade Netty to a fixed release: 4.1.132.Final or later for the 4.1.x line, or 4.2.10.Final or later for the 4.2.x line. Because Netty is often included transitively through web frameworks, RPC frameworks, API gateways, reactive stacks, or embedded servers, review dependency trees and container images for bundled Netty artifacts rather than checking only direct dependencies. Where immediate upgrade is not possible, consider temporary mitigations: disable HTTP/2 on exposed listeners where business impact is acceptable, terminate HTTP/2 at a patched reverse proxy or load balancer, apply strict connection and stream rate limits, enforce request/header timeout policies, cap concurrent HTTP/2 streams, and monitor or throttle clients generating abnormal CONTINUATION frame patterns. These mitigations reduce exposure but should not be treated as a substitute for upgrading Netty.
How to confirm the fix worked
Confirm that all deployed applications and build artifacts resolve Netty to 4.1.132.Final or later, or 4.2.10.Final or later. Validate both direct and transitive dependencies using package manager dependency output, software composition analysis, container image scans, and runtime classpath inspection where applicable. For Maven or Gradle environments, check all io.netty artifacts and ensure no older netty-codec-http2 or related Netty modules remain packaged. Functionally validate by sending normal HTTP/2 traffic through the service and confirming expected behavior after upgrade. Where safe and authorized, perform controlled resilience testing with abnormal HTTP/2 frame behavior to verify that excessive CONTINUATION frames are rejected, limited, or do not cause sustained CPU exhaustion. Also verify that compensating controls, if used, are actually enforcing HTTP/2 connection, stream, and rate limits at the edge.
Typical attack path
- Discover a reachable application, API, gateway, or service that negotiates HTTP/2.
- Confirm that the target stack uses an affected Netty HTTP/2 implementation or behaves consistently with a vulnerable implementation.
- Open HTTP/2 connections to the service without needing authentication.
- Start one or more HTTP/2 streams and send header blocks followed by excessive CONTINUATION frames.
- Use zero-length or very small CONTINUATION frames to avoid size-based header protections while maximizing frame-processing overhead.
- Repeat across streams or connections until Netty event-loop CPU is saturated.
- Cause legitimate requests to experience high latency, timeouts, connection resets, or service unavailability.
How to detect it
To determine whether this was already exploited, review network, proxy, load balancer, application, and host telemetry for periods of unexplained CPU saturation correlated with HTTP/2 traffic. Useful sources include edge proxy logs, web access logs with protocol fields, load balancer metrics, packet captures or flow metadata, Java application logs, APM traces, container metrics, JVM thread dumps, and host CPU telemetry. Look for a small number of clients creating many HTTP/2 connections or streams, unusually high CONTINUATION frame counts, many zero-length or very small HTTP/2 frames, elevated request latency, 408/429/499/502/503/504 responses, connection resets, and Netty event-loop threads consuming high CPU. If packet captures are available, inspect HTTP/2 frame sequences for prolonged CONTINUATION frame floods without normal header completion. In JVM evidence, look for Netty event-loop threads busy in HTTP/2 codec processing during the outage window. Because this is a denial-of-service issue rather than code execution, durable host artifacts may be limited; correlation of traffic anomalies with CPU exhaustion and service degradation is the strongest evidence.
- HTTP/2 CONTINUATION
- CONTINUATION frame
- zero-length CONTINUATION
- zero-byte CONTINUATION
- io.netty.handler.codec.http2
- io.netty.handler.codec.http2.Http2Exception
- Http2FrameCodec
- Http2ConnectionHandler
- Http2MultiplexHandler
- nioEventLoopGroup
- epollEventLoopGroup
- kqueueEventLoopGroup
What your security team should do
- Inventory internet-facing and business-critical services that support HTTP/2 and use Netty directly or transitively.
- Prioritize upgrading affected deployments to Netty 4.1.132.Final or later, or 4.2.10.Final or later, especially for public APIs, gateways, and high-availability services.
- Use software composition analysis and dependency tree review to find vulnerable Netty versions embedded through frameworks or shaded dependencies.
- Temporarily disable HTTP/2 or terminate it at a patched proxy/load balancer for high-risk services that cannot be upgraded quickly.
- Apply rate limits and connection controls for HTTP/2 clients, including limits on concurrent streams, connection duration, header processing time, and abnormal frame rates.
- Add monitoring for spikes in HTTP/2 frame processing, CONTINUATION frame volume, CPU saturation on event-loop threads, request latency, 5xx responses, and connection resets.
- Review historical traffic and logs for signs of prior denial-of-service attempts using abnormal HTTP/2 CONTINUATION frame patterns.
- Track upstream framework releases that bundle Netty and redeploy dependent applications after patched versions are available.
The record
Netty is an asynchronous, event-driven network application framework. In versions prior to 4.1.132.Final and 4.2.10.Final, a remote user can trigger a Denial of Service (DoS) against a Netty HTTP/2 server by sending a flood of `CONTINUATION` frames. The server's lack of a limit on the number of `CONTINUATION` frames, combined with a bypass of existing size-based mitigations using zero-byte frames, allows an user to cause excessive CPU consumption with minimal bandwidth, rendering the server unresponsive. Versions 4.1.132.Final and 4.2.10.Final fix the issue.
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|---|---|---|
| Chainguard | akhq | 0 | 0.27.0-r0 |
| Chainguard | apache-hop | 0 | 2.17.0-r6 |
| Chainguard | apache-hop-fips | 0 | 2.17.0-r6 |
| Chainguard | apache-pulsar-4.0 | 0 | 4.0.9-r10 |
| Chainguard | apache-pulsar-fips-4.0 | 0 | 4.0.9-r10 |
| Chainguard | apicurio-registry | 0 | 3.2.0-r3 |
| Chainguard | druid | 0 | 36.0.0-r12 |
| Chainguard | flyway-fips | 0 | 12.2.0-r2 |
| Chainguard | hono-adapter-mqtt | 0 | 2.7.0-r7 |
| Chainguard | hono-cli | 0 | 2.7.0-r7 |
| Chainguard | hono-service-auth | 0 | 2.7.0-r7 |
| Chainguard | hono-service-command-router | 0 | 2.7.0-r7 |
| Chainguard | hono-service-device-registry-jdbc | 0 | 2.7.0-r7 |
| Chainguard | infinispan-15.0 | 0 | 15.0.22-r4 |
| Chainguard | infinispan-15.1 | 0 | 15.1.7-r11 |
| Chainguard | infinispan-15.2 | 0 | 15.2.6-r12 |
| Chainguard | infinispan-16.0 | 0 | 16.0.8-r2 |
| Chainguard | infinispan-16.1 | 0 | 16.1.2-r2 |
| Chainguard | keycloak-26.5 | 0 | 26.5.6-r3 |
| Chainguard | keycloak-26.5-iamguarded-compat | 0 | 26.5.6-r3 |
| Chainguard | keycloak-26.5-operator | 0 | 26.5.6-r3 |
| Chainguard | keycloak-fips-26.5 | 0 | 26.5.6-r3 |
| Chainguard | keycloak-fips-26.5-iamguarded-fips | 0 | 26.5.6-r3 |
| Chainguard | keycloak-fips-26.5-operator | 0 | 26.5.6-r3 |
| Chainguard | knative-kafka-broker-1.17-dispatcher-loom | 0 | 1.17.3-r13 |
| Chainguard | knative-kafka-broker-1.17-receiver-loom | 0 | 1.17.3-r13 |
| Chainguard | knative-kafka-broker-1.18-dispatcher-loom | 0 | 1.18.2-r7 |
| Chainguard | knative-kafka-broker-1.18-receiver-loom | 0 | 1.18.2-r7 |
| Chainguard | knative-kafka-broker-1.19-dispatcher-loom | 0 | 1.19.11-r7 |
| Chainguard | knative-kafka-broker-1.19-receiver-loom | 0 | 1.19.11-r7 |
| Chainguard | knative-kafka-broker-1.20-dispatcher-loom | 0 | 1.20.2-r7 |
| Chainguard | knative-kafka-broker-1.20-receiver-loom | 0 | 1.20.2-r7 |
| Chainguard | knative-kafka-broker-1.21-dispatcher-loom | 0 | 1.21.1-r7 |
| Chainguard | knative-kafka-broker-1.21-receiver-loom | 0 | 1.21.1-r7 |
| Chainguard | knative-kafka-broker-fips-1.17-dispatcher-loom | 0 | 1.17.3-r3 |
| Chainguard | knative-kafka-broker-fips-1.17-receiver-loom | 0 | 1.17.3-r3 |
| Chainguard | knative-kafka-broker-fips-1.18-dispatcher-loom | 0 | 1.18.2-r3 |
| Chainguard | knative-kafka-broker-fips-1.18-receiver-loom | 0 | 1.18.2-r3 |
| Chainguard | knative-kafka-broker-fips-1.19-dispatcher-loom | 0 | 1.19.11-r4 |
| Chainguard | knative-kafka-broker-fips-1.19-receiver-loom | 0 | 1.19.11-r4 |
| Chainguard | knative-kafka-broker-fips-1.20-dispatcher-loom | 0 | 1.20.2-r4 |
| Chainguard | knative-kafka-broker-fips-1.20-receiver-loom | 0 | 1.20.2-r4 |
| Chainguard | knative-kafka-broker-fips-1.21-dispatcher-loom | 0 | 1.21.1-r4 |
| Chainguard | knative-kafka-broker-fips-1.21-receiver-loom | 0 | 1.21.1-r4 |
| Chainguard | management-api-for-apache-cassandra-4.0 | 0 | 0.1.114-r0 |
| Chainguard | management-api-for-apache-cassandra-4.1 | 0 | 0.1.114-r0 |
| Chainguard | management-api-for-apache-cassandra-5.0 | 0 | 0.1.114-r1 |
| Chainguard | pinot | 0 | 1.4.0-r5 |
| Chainguard | spark-3.5-scala-2.12 | 0 | 3.5.8-r11 |
| Chainguard | spark-3.5-scala-2.13 | 0 | 3.5.8-r11 |
| Chainguard | spark-4.0-scala-2.13 | 0 | 4.0.2-r10 |
| Chainguard | spark-4.1-scala-2.13 | 0 | 4.1.1-r11 |
| Chainguard | spark-fips-3.5-scala-2.12 | 0 | 3.5.8-r0 |
| Chainguard | spark-fips-3.5-scala-2.13 | 0 | 3.5.8-r0 |
| Chainguard | spark-fips-4.1-scala-2.13 | 0 | 4.1.1-r9 |
| Chainguard | thingsboard-tb-mqtt-transport | 0 | 4.3.1-r5 |
| Chainguard | thingsboard-tb-node | 0 | 4.3.1-r5 |
| Chainguard | trino-plugin-delta-lake | 0 | 480-r0 |
| Chainguard | trino-plugin-elasticsearch | 0 | 480-r0 |
| Chainguard | trino-plugin-exchange-filesystem | 0 | 480-r0 |
| Chainguard | trino-plugin-exchange-hdfs | 0 | 480-r0 |
| Chainguard | trino-plugin-hive | 0 | 480-r0 |
| Chainguard | trino-plugin-hudi | 0 | 480-r0 |
| Chainguard | trino-plugin-iceberg | 0 | 480-r0 |
| Chainguard | trino-plugin-lakehouse | 0 | 480-r0 |
| Chainguard | trino-plugin-opensearch | 0 | 480-r0 |
| Chainguard | trino-plugin-pinot | 0 | 480-r0 |
| Chainguard | trino-plugin-redshift | 0 | 480-r0 |
| Chainguard | trino-plugin-spooling-filesystem | 0 | 480-r0 |
| Chainguard | wavefront-proxy | 0 | 13.9-r11 |
| Chainguard | wildfly-openjdk-17 | 0 | 39.0.1-r3 |
| Chainguard | wildfly-openjdk-21 | 0 | 39.0.1-r3 |
| SUSE:Linux Enterprise Module for Development Tools 15 SP7 | netty-tcnative | 0 | 2.0.75-150200.3.36.1 |
| SUSE:Linux Enterprise Module for Package Hub 15 SP7 | netty | 0 | 4.1.132-150200.4.43.1 |
| Wolfi | akhq | 0 | 0.27.0-r0 |
| Wolfi | apicurio-registry | 0 | 3.2.0-r3 |
| Wolfi | druid | 0 | 36.0.0-r12 |
| Wolfi | infinispan-15.2 | 0 | 15.2.6-r12 |
| Wolfi | infinispan-16.0 | 0 | 16.0.8-r2 |
| Wolfi | infinispan-16.1 | 0 | 16.1.2-r2 |
| Wolfi | keycloak-26.5 | 0 | 26.5.6-r3 |
| Wolfi | keycloak-26.5-iamguarded-compat | 0 | 26.5.6-r3 |
| Wolfi | keycloak-26.5-operator | 0 | 26.5.6-r3 |
| Wolfi | management-api-for-apache-cassandra-4.1 | 0 | 0.1.114-r0 |
| Wolfi | management-api-for-apache-cassandra-5.0 | 0 | 0.1.114-r1 |
| Wolfi | spark-3.5-scala-2.12 | 0 | 3.5.8-r11 |
| Wolfi | spark-3.5-scala-2.13 | 0 | 3.5.8-r11 |
| Wolfi | spark-4.0-scala-2.13 | 0 | 4.0.2-r10 |
| Wolfi | spark-4.1-scala-2.13 | 0 | 4.1.1-r11 |
| Wolfi | thingsboard-tb-mqtt-transport | 0 | 4.3.1-r5 |
| Wolfi | thingsboard-tb-node | 0 | 4.3.1-r5 |
| Wolfi | trino-plugin-delta-lake | 0 | 480-r0 |
| Wolfi | trino-plugin-elasticsearch | 0 | 480-r0 |
| Wolfi | trino-plugin-exchange-filesystem | 0 | 480-r0 |
| Wolfi | trino-plugin-exchange-hdfs | 0 | 480-r0 |
| Wolfi | trino-plugin-hive | 0 | 480-r0 |
| Wolfi | trino-plugin-hudi | 0 | 480-r0 |
| Wolfi | trino-plugin-iceberg | 0 | 480-r0 |
| Wolfi | trino-plugin-lakehouse | 0 | 480-r0 |
| Wolfi | trino-plugin-opensearch | 0 | 480-r0 |
| Wolfi | trino-plugin-pinot | 0 | 480-r0 |
| Wolfi | trino-plugin-redshift | 0 | 480-r0 |
| Wolfi | trino-plugin-spooling-filesystem | 0 | 480-r0 |
| Wolfi | wavefront-proxy | 0 | 13.9-r11 |
| Wolfi | wildfly-openjdk-17 | 0 | 39.0.1-r3 |
| Wolfi | wildfly-openjdk-21 | 0 | 39.0.1-r3 |
| openSUSE:Leap 15.6 | netty | 0 | 4.1.132-150200.4.43.1 |
| openSUSE:Leap 15.6 | netty-tcnative | 0 | 2.0.75-150200.3.36.1 |
| openSUSE:Tumbleweed | netty | 0 | 4.1.132-1.1 |
Related vulnerabilities
- CVE-2026-33870 Netty is an asynchronous, event-driven network application framework. Also affects akhq
- CVE-2026-24281 Hostname verification in Apache ZooKeeper ZKTrustManager falls back to reverse DNS (PTR)… Also affects akhq
- CVE-2026-24308 Improper handling of configuration values in ZKConfig in Apache ZooKeeper 3.8.5 and 3.9.4… Also affects akhq
- CVE-2025-11143 The Jetty URI parser has some key differences to other common parsers when evaluating… Also affects akhq
- CVE-2025-33042 Improper Control of Generation of Code ('Code Injection') vulnerability in Apache Avro… Also affects akhq
- CVE-2026-1225 ACE vulnerability in configuration file processing by QOS.CH logback-core up to and… Also affects akhq
- CVE-2025-67735 Netty has a CRLF Injection vulnerability in io.netty.handler.codec.http.HttpRequestEncoder Also affects akhq
- CVE-2025-11226 ACE vulnerability in conditional configuration file processing by QOS.CH logback-core up… Also affects akhq