CVE-2026-33871: Netty HTTP/2 CONTINUATION Frame Flood DoS via Zero-Byte Frame Bypass
Summary 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.
Details The vulnerability exists in Netty's DefaultHttp2FrameReader. When an HTTP/2 HEADERS frame is received without the ENDHEADERS flag, the server expects one or more subsequent CONTINUATION frames. However, the implementation does not enforce a limit on the count of these CONTINUATION frames.
The key issue is located in codec-http2/src/main/java/io/netty/handler/codec/http2/DefaultHttp2FrameReader.java. The verifyContinuationFrame() method checks for stream association but fails to implement a frame count limit.
Any user can exploit this by sending a stream of CONTINUATION frames with a zero-byte payload. While Netty has a maxHeaderListSize protection to limit the total size of headers, this check is never triggered by zero-byte frames. The logic effectively evaluates to maxHeaderListSize - 0 < currentSize, which will not trigger the limit until a non-zero byte is added. As a result, the server is forced to process an unlimited number of frames, consuming a CPU thread and monopolizing the connection.
codec-http2/src/main/java/io/netty/handler/codec/http2/DefaultHttp2FrameReader.java
verifyContinuationFrame() (lines 381-393) — No frame count check: java private void verifyContinuationFrame() throws Http2Exception { verifyAssociatedWithAStream(); if (headersContinuation == null) { throw connectionError(PROTOCOLERROR, "..."); } if (streamId != headersContinuation.getStreamId()) { throw connectionError(PROTOCOLERROR, "..."); } // NO frame count limit! }
HeadersBlockBuilder.addFragment() (lines 695-723) — Byte limit bypassed by 0-byte frames: java // Line 710-711: This check NEVER fires when len=0 if (headersDecoder.configuration().maxHeaderListSizeGoAway() - len < headerBlock.readableBytes()) { headerSizeExceeded(); // 10240 - 0 < 1 => FALSE always }
When len=0: maxGoAway - 0 < readableBytes → 10240 < 1 → FALSE. The byte limit is never triggered.
Impact This is a CPU-based Denial of Service (DoS). Any service using Netty's default HTTP/2 server implementation is impacted. An unauthenticated user can exhaust server CPU resources and block legitimate users, leading to service unavailability. The low bandwidth requirement for the attack makes it highly practical.
Other sources
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.
— MITRE
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Upgrade
Upgrade
maven/io.netty:netty-codec-http2to a version that resolves this vulnerability.Fixed in 4.2.11.Final - Upgrade
Upgrade
maven/io.netty:netty-codec-http2to a version that resolves this vulnerability.Fixed in 4.1.132.Final - Upgrade
Upgrade
Netty HTTP/2 DefaultHttp2FrameReader (codec-http2)to a version that resolves this vulnerability.Fixed in 4.1.132.Final - Upgrade
Upgrade
Netty HTTP/2 DefaultHttp2FrameReader (codec-http2)to a version that resolves this vulnerability.Fixed in 4.2.10.Final
Event History
Frequently Asked Questions
What is the severity of CVE-2026-33871?
CVE-2026-33871 is classified as a Denial of Service (DoS) vulnerability.
How do I fix CVE-2026-33871?
To fix CVE-2026-33871, update to Netty version 4.2.11.Final or 4.1.132.Final.
What causes the CVE-2026-33871 vulnerability?
CVE-2026-33871 is caused by a lack of limit on the number of CONTINUATION frames that can be sent to a Netty HTTP/2 server.
Who is affected by CVE-2026-33871?
CVE-2026-33871 affects users of the io.netty:netty-codec-http2 package versions prior to 4.2.11.Final or 4.1.132.Final.
What is the impact of CVE-2026-33871?
The impact of CVE-2026-33871 is that it allows remote attackers to flood a Netty HTTP/2 server, potentially leading to service disruption.