Update dependency io.netty:netty-codec-http to v4.1.135.Final [SECURITY] (main)#34
Draft
renovatebot-confluentinc[bot] wants to merge 1 commit into
Conversation
ea5243b to
45f1255
Compare
45f1255 to
7e1e3ab
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
For any questions/concerns about this PR, please review the Renovate Bot wiki/FAQs, or the #renovatebot Slack channel.
This PR contains the following updates:
4.1.119.Final→4.1.135.Final4.1.118.Final→4.1.135.FinalWarning
Some dependencies could not be looked up. Check the warning logs for more information.
Netty vulnerable to request smuggling due to incorrect parsing of chunk extensions
CVE-2025-58056 / GHSA-fghv-69vj-qj49
More information
Details
Summary
A flaw in netty's parsing of chunk extensions in HTTP/1.1 messages with chunked encoding can lead to request smuggling issues with some reverse proxies.
Details
When encountering a newline character (LF) while parsing a chunk extension, netty interprets the newline as the end of the chunk-size line regardless of whether a preceding carriage return (CR) was found. This is in violation of the HTTP 1.1 standard which specifies that the chunk extension is terminated by a CRLF sequence (see the RFC).
This is by itself harmless, but consider an intermediary with a similar parsing flaw: while parsing a chunk extension, the intermediary interprets an LF without a preceding CR as simply part of the chunk extension (this is also in violation of the RFC, because whitespace characters are not allowed in chunk extensions). We can use this discrepancy to construct an HTTP request that the intermediary will interpret as one request but netty will interpret as two (all lines ending with CRLF, notice the LFs in the chunk extension):
The intermediary will interpret this as a single request. Once forwarded to netty, netty will interpret it as two separate requests. This is a problem, because attackers can then the intermediary, as well as perform standard request smuggling attacks against other live users (see this Portswigger article).
Impact
This is a request smuggling issue which can be exploited for bypassing front-end access control rules as well as corrupting the responses served to other live clients.
The impact is high, but it only affects setups that use a front-end which:
Disclosure
Discussion
Discussion for this vulnerability can be found here:
Credit
Severity
Low
References
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Netty has a CRLF Injection vulnerability in io.netty.handler.codec.http.HttpRequestEncoder
CVE-2025-67735 / GHSA-84h7-rjj3-6jx4
More information
Details
Summary
The
io.netty.handler.codec.http.HttpRequestEncoderCRLF injection with the request uri when constructing a request. This leads to request smuggling whenHttpRequestEncoderis used without proper sanitization of the uri.Details
The
HttpRequestEncodersimply UTF8 encodes theuriwithout sanitization (buf.writeByte(SP).writeCharSequence(uriCharSequence, CharsetUtil.UTF_8);)The default implementation of HTTP headers guards against such possibility already with a validator making it impossible with headers.
PoC
Simple reproducer:
Impact
Any application / framework using
HttpRequestEncodercan be subject to be abused to perform request smuggling using CRLF injection.Severity
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:NReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Netty: HTTP Request Smuggling via Chunked Extension Quoted-String Parsing
CVE-2026-33870 / GHSA-pwqr-wmgm-9rr8
More information
Details
Summary
Netty incorrectly parses quoted strings in HTTP/1.1 chunked transfer encoding extension values, enabling request smuggling attacks.
Background
This vulnerability is a new variant discovered during research into the "Funky Chunks" HTTP request smuggling techniques:
The original research tested various chunk extension parsing differentials but did not cover quoted-string handling within extension values.
Technical Details
RFC 9110 Section 7.1.1 defines chunked transfer encoding:
RFC 9110 Section 5.6.4 defines quoted-string:
Critically, the allowed character ranges within a quoted-string are:
CR (
%x0D) and LF (%x0A) bytes fall outside all of these ranges and are therefore not permitted inside chunk extensions—whether quoted or unquoted. A strictly compliant parser should reject any request containing CR or LF bytes before the actual line terminator within a chunk extension with a400 Bad Requestresponse (as Squid does, for example).Vulnerability
Netty terminates chunk header parsing at
\r\ninside quoted strings instead of rejecting the request as malformed. This creates a parsing differential between Netty and RFC-compliant parsers, which can be exploited for request smuggling.Expected behavior (RFC-compliant):
A request containing CR/LF bytes within a chunk extension value should be rejected outright as invalid.
Actual behavior (Netty):
The root cause is that Netty does not validate that CR/LF bytes are forbidden inside chunk extensions before the terminating CRLF. Rather than attempting to parse through quoted strings, the appropriate fix is to reject such requests entirely.
Proof of Concept
Result: The server returns two HTTP responses from a single TCP connection, confirming request smuggling.
Parsing Breakdown
Impact
Reproduction
Suggested Fix
The parser should reject requests containing CR or LF bytes within chunk extensions rather than attempting to interpret them:
Acknowledgments
Credit to Ben Kallus for clarifying the RFC interpretation during discussion on the HAProxy mailing list.
Resources
Attachments
java_netty.zip
Severity
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:NReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Netty: Start-Line Injection in DefaultHttpRequest.setUri() Allows HTTP Request Smuggling and RTSP Request Injection
CVE-2026-41417 / GHSA-v8h7-rr48-vmmv
More information
Details
Summary
Netty allows request-line validation to be bypassed when a
DefaultHttpRequestorDefaultFullHttpRequestis created first and its URI is later changed viasetUri().The constructors reject CRLF and whitespace characters that would break the start-line, but
setUri()does not apply the same validation.HttpRequestEncoderandRtspEncoderthen write the URI into the request line verbatim. If attacker-controlled input reachessetUri(), this enables CRLF injection and insertion of additional HTTP or RTSP requests.In practice, this leads to HTTP request smuggling / desynchronization on the HTTP side and request injection on the RTSP side.
Details
The root issue is that URI validation exists only on the constructor path, but not on the public setter path.
io.netty.handler.codec.http.DefaultHttpRequestHttpUtil.validateRequestLineTokens(method, uri)setUri(String uri)only performscheckNotNulland does not validateio.netty.handler.codec.http.DefaultFullHttpRequestsetUri(String uri)delegates to the parent implementationio.netty.handler.codec.http.HttpRequestEncoderrequest.uri()directly into the request lineio.netty.handler.codec.rtsp.RtspEncoderrequest.uri()directly into the request lineThis creates the following bypass:
DefaultHttpRequestorDefaultFullHttpRequestwith a safe URIsetUri()HttpRequestEncoderorRtspEncoderencodes that value verbatimThis appears to be an incomplete fix pattern where start-line validation exists, but can still be bypassed through a mutable public API.
PoC (HTTP)
The following code first creates a normal request object and then injects a malicious request line using
setUri().When reproduced, the raw encoded request looks like this:
HttpServerCodecthen parses this as multiple HTTP messages rather than a single request:GET /s1POST /s2with bodyHello WorldGET /s1This confirms that the value supplied through
setUri()is interpreted on the wire as additional requests.PoC (RTSP)
The same root cause also affects
RtspEncoder. A minimal reproduction is shown below.When reproduced,
RtspEncodergenerates consecutive RTSP requests in a single encoded payload:RtspDecoderthen parses this as three separate RTSP requests:OPTIONS rtsp://cam/streamDESCRIBE rtsp://cam/secretOPTIONS rtsp://cam/finalThis confirms that the same setter bypass is exploitable for RTSP request injection as well.
Impact
The vulnerable conditions are:
DefaultHttpRequestorDefaultFullHttpRequestsetUri()setUri()is attacker-controlled or attacker-influencedHttpRequestEncoderorRtspEncoderUnder those conditions, an attacker may be able to:
The exact impact depends on how the application constructs URIs and how the upstream/downstream HTTP or RTSP components parse request boundaries, but the security impact is real and reproducible.
Root Cause
Validation is enforced only at object construction time, but not on the public mutation API that can break the same security invariant.
As a result, the constructors are safe while the public
setUri()path is not, and the encoders trust and serialize the mutated value without revalidation.Suggested Fix Direction
DefaultHttpRequest.setUri()and all delegating/inheriting paths should apply the same request-line token validation as the constructors.Recommended regression coverage:
setUri()rejects CRLF-containing input after object constructionDefaultFullHttpRequest.setUri()is blocked as well\r,\n, and request-smuggling payloads are rejectedHttpRequestEncoderandRtspEncoderare protected from setter-based bypassesAffected Area
netty-codec-httpio.netty.handler.codec.http.DefaultHttpRequestio.netty.handler.codec.http.DefaultFullHttpRequestio.netty.handler.codec.http.HttpRequestEncoderio.netty.handler.codec.rtsp.RtspEncoderSeverity
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:NReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Netty vulnerable to HTTP Request Smuggling due to incorrect chunk size parsing
CVE-2026-42580 / GHSA-m4cv-j2px-7723
More information
Details
Summary
Netty's chunk size parser silently overflows int, enabling request smuggling attacks.
Details
io.netty.handler.codec.http.HttpObjectDecoder#getChunkSize silently overflows int.
The size is accumulated as follows:
result *= 16;
result += digit;
The result is checked only for negative values. However, with a carefully crafted chunk size, the result can be a valid size.
PoC
The test below shows Netty successfully parsing the second request, demonstrating how an attacker can smuggle a second request inside a chunked body.
Impact
HTTP Request Smuggling: Attacker injects arbitrary HTTP requests
Severity
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:LReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Netty HTTP/1.0 TE+CL Coexistence Bypasses Smuggling Sanitization
CVE-2026-42581 / GHSA-xxqh-mfjm-7mv9
More information
Details
NETTY HTTP/1.0 TE+CL Coexistence Bypasses Smuggling Sanitization
io.netty:netty-codec-httpcodec-http—HttpObjectDecoder4f3533aeconfirmedSummary
HttpObjectDecoderstrips a conflictingContent-Lengthheader when a request carries bothTransfer-Encoding: chunkedandContent-Length, but only for HTTP/1.1 messages. The guard is absent for HTTP/1.0. An attacker that sends an HTTP/1.0 request with both headers causes Netty to decode the body as chunked while leavingContent-Lengthintact in the forwardedHttpMessage. Any downstream proxy or handler that trustsContent-LengthoverTransfer-Encodingwill disagree on message boundaries, enabling request smuggling.Root Cause
The conflict-resolution path is gated on
message.protocolVersion() == HttpVersion.HTTP_1_1. When the request declaresHTTP/1.0, the condition is false,handleTransferEncodingChunkedWithContentLengthis never called, and theContent-Lengthheader survives into the forwarded message. Netty still processes the body as chunked; a downstream component that is CL-first interprets the same bytes as a separate request.Proof of Concept
Netty consumes the full chunked body (5 bytes + terminator). A downstream CL-first proxy reads
Content-Length: 0, considers the request complete at the blank line, and treats5\r\nGPOST\r\n0\r\n\r\nas the start of a second request.Conditions Required
Content-Length-first (nginx, some HAProxy configs, AWS ALB in certain modes).Impact
Request smuggling at the Netty edge. Allows cache poisoning, session fixation against other users, unauthorized access to internal endpoints, and bypassing of WAF or authentication layers that inspect only the first logical request.
Confirmed PoC Test
Verified against HEAD (
4f3533ae) usingEmbeddedChannel. Both tests pass, confirming the vulnerability and the HTTP/1.1 contrast.Fix Guidance
Remove the
message.protocolVersion() == HttpVersion.HTTP_1_1guard inHttpObjectDecoder, applyinghandleTransferEncodingChunkedWithContentLengthunconditionally whenever bothTransfer-Encoding: chunkedandContent-Lengthare present, regardless of protocol version.Severity
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:N/I:L/A:NReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Netty has HttpClientCodec response desynchronization
CVE-2026-42584 / GHSA-57rv-r2g8-2cj3
More information
Details
Summary
If HttpClientCodec is configured, there are use cases when a response body from one request, can be parsed as another's.
Details
HttpClientCodec pairs each inbound response with an outbound request by
queue.poll()once per response, including for1xx. If the client pipelines GET then HEAD and the server sends 103, then 200 with GET body, then 200 for HEAD, the queue pairs HEAD with the first 200. The HEAD rule then skips reading that message’s body, so the GET entity bytes stay on the stream and the following 200 is parsed from the wrong offset.Prerequisites
PoC
Impact
Integrity/availability of HTTP parsing on that connection, unsafe reuse of the socket.
Severity
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:LReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Netty vulnerable to HTTP Request Smuggling due to malformed Transfer-Encoding
CVE-2026-42585 / GHSA-38f8-5428-x5cv
More information
Details
Summary
Netty incorrectly parses malformed Transfer-Encoding, enabling request smuggling attacks.
Details
Netty incorrectly marks a request as chunked when malformed "Transfer-Encoding: chunked, identity" is present.
According to RFC https://datatracker.ietf.org/doc/html/rfc9112#name-message-body-length
"
If a Transfer-Encoding header field is present in a request and the chunked transfer coding is not the final encoding,
the message body length cannot be determined reliably; the server MUST respond with the 400 (Bad Request)
status code and then close the connection.
"
A possible scenario is when Netty is behind a proxy that doesn't reject requests with "Transfer-Encoding: chunked, identity", but prefers "Content-Length" and forwards the content to Netty.
PoC
The test below shows Netty successfully parsing the second request, demonstrating how an attacker can smuggle a second request inside a request body.
Impact
HTTP Request Smuggling: Attacker injects arbitrary HTTP requests
Severity
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:NReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Netty: HttpContentDecompressor maxAllocation bypass when Content-Encoding set to br/zstd/snappy leads to decompression bomb DoS
CVE-2026-42587 / GHSA-f6hv-jmp6-3vwv
More information
Details
Summary
HttpContentDecompressoraccepts amaxAllocationparameter to limit decompression buffer size and prevent decompression bomb attacks. This limit is correctly enforced for gzip and deflate encodings viaZlibDecoder, but is silently ignored when the content encoding isbr(Brotli),zstd, orsnappy. An attacker can bypass the configured decompression limit by sending a compressed payload withContent-Encoding: brinstead ofContent-Encoding: gzip, causing unbounded memory allocation and out-of-memory denial of service.The same vulnerability exists in
DelegatingDecompressorFrameListenerfor HTTP/2 connections.Details
HttpContentDecompressorstores themaxAllocationvalue at construction time (HttpContentDecompressor.java:89) and uses it innewContentDecoder()to create the appropriate decompression handler.For gzip/deflate,
maxAllocationis forwarded toZlibCodecFactory.newZlibDecoder():ZlibDecoder.prepareDecompressBuffer()enforces this as a hard cap by setting the buffer'smaxCapacityand throwingDecompressionExceptionwhen the limit is reached:For brotli, zstd, and snappy, the decoders are created without any size limit:
BrotliDecoderhas nomaxAllocationparameter at all — there is no way to constrain its output. It streams decompressed data in chunks viafireChannelReadwith no total limit.ZstdDecoder()defaults to a 4MBmaximumAllocationSize, but this only constrains individual buffer allocations, not total output. The decode loop (ZstdDecoder.java:100-114) creates new buffers and fireschannelReadrepeatedly, so total decompressed output is unbounded.The identical pattern exists in
DelegatingDecompressorFrameListener.newContentDecompressor()at lines 188-210 for HTTP/2.PoC
Content-Encoding: zstdandContent-Encoding: snappy.Impact
maxAllocationfor decompression bomb protection, by simply using a non-gzip content encoding.maxAllocationto protect against decompression bombs are not actually protected for brotli, zstd, or snappy encodings. The API documentation implies all encodings are covered.Content-Encoding: brinstead ofContent-Encoding: gzip) to circumvent the protection entirely.HttpContentDecompressor(HTTP/1.1) andDelegatingDecompressorFrameListener(HTTP/2).Recommended Fix
Pass
maxAllocationto all decoder constructors. ForBrotliDecoder, which currently has nomaxAllocationsupport, add the parameter:HttpContentDecompressor.java — pass maxAllocation to all decoders:
DelegatingDecompressorFrameListener.java — same fix at lines 188-210.
BrotliDecoder — add
maxAllocationparameter with the same semantics asZlibDecoder.prepareDecompressBuffer(): set buffer maxCapacity and throwDecompressionExceptionwhen the total decompressed output exceeds the limit.SnappyFrameDecoder — add
maxAllocationparameter with equivalent enforcement.ZstdDecoder — ensure that when
maxAllocationis set, total output across all buffers is bounded (not just per-buffer allocation size).Severity
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:HReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Netty: HttpObjectDecoder skips arbitrary initial control characters when only initial CRLF characters are permitted
CVE-2026-50020 / GHSA-hvcg-qmg6-jm4c
More information
Details
Summary
Before reading the first request-line,
HttpObjectDecoderskips every byte for whichCharacter.isISOControl(b)istrue(0x00–0x1F and 0x7F) as well as all whitespace.RFC 9112 §2.2 only asks servers to ignore empty CRLF lines preceding the request-line —
a carefully scoped robustness allowance intended to handle HTTP/1.0 POST workarounds.
Silently absorbing NUL bytes, SOH, STX, and other non-CRLF control characters goes
significantly beyond this, and can be exploited for request-boundary confusion in pipelined
or multiplexed transports where a front-end component treats those bytes differently.
Affected Code
codec-http/src/main/java/io/netty/handler/codec/http/HttpObjectDecoder.javaISO_CONTROL_OR_WHITESPACEstatic initialiser — marks all ISO control charscodec-http/src/main/java/io/netty/handler/codec/http/HttpObjectDecoder.javaSKIP_CONTROL_CHARS_BYTESByteProcessor— skips the entire setcodec-http/src/main/java/io/netty/handler/codec/http/HttpObjectDecoder.javaLineParser.skipControlChars— advancesreaderIndexpast all matching bytesSpecification Analysis
RFC 9112 §2.2 — Message Parsing
Deviation
The RFC names a single permitted exception: an empty line (bare CRLF, i.e. the two-byte
sequence
\r\n). TheISO_CONTROL_OR_WHITESPACEtable is initialised as:Character.isISOControlreturnstruefor0x00–0x1Fand0x7F. This includes NUL(
0x00), SOH (0x01), STX (0x02), BEL (0x07), DEL (0x7F), and every other non-CRLFcontrol character. The
SKIP_CONTROL_CHARSstate runs this scan unconditionally before thefirst
READ_INITIAL, meaning any sequence of such bytes prepended to a request is silentlyconsumed.
A load balancer or TLS terminator that does not perform the same scan sees a different
message boundary than Netty does, which is the basis of a request-desync / smuggling attack.
Suggested Unit Test
Add to
HttpRequestDecoderTest.java.Current behaviour (unfixed):
skipControlCharsadvances past0x00and0x01becauseboth are in
ISO_CONTROL_OR_WHITESPACE; the request parses normally,isFailure()isfalse→ test fails.Expected behaviour after fix: only CRLF empty lines are tolerated; non-CRLF control
bytes produce an error,
isFailure()istrue→ test passes.Severity
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:NReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Netty vulnerable to request smuggling due to incorrect parsing of chunk extensions
CVE-2025-58056 / GHSA-fghv-69vj-qj49
More information
Details
Summary
A flaw in netty's parsing of chunk extensions in HTTP/1.1 messages with chunked encoding can lead to request smuggling issues with some reverse proxies.
Details
When encountering a newline character (LF) while parsing a chunk extension, netty interprets the newline as the end of the chunk-size line regardless of whether a preceding carriage return (CR) was found. This is in violation of the HTTP 1.1 standard which specifies that the chunk extension is terminated by a CRLF sequence (see the RFC).
This is by itself harmless, but consider an intermediary with a similar parsing flaw: while parsing a chunk extension, the intermediary interprets an LF without a preceding CR as simply part of the chunk extension (this is also in violation of the RFC, because whitespace characters are not allowed in chunk extensions). We can use this discrepancy to construct an HTTP request that the intermediary will interpret as one request but netty will interpret as two (all lines ending with CRLF, notice the LFs in the chunk extension):
The intermediary will interpret this as a single request. Once forwarded to netty, netty will interpret it as two separate requests. This is a problem, because attackers can then the intermediary, as well as perform standard request smuggling attacks against other live users (see this Portswigger article).
Impact
This is a request smuggling issue which can be exploited for bypassing front-end access control rules as well as corrupting the responses served to other live clients.
The impact is high, but it only affects setups that use a front-end which:
Disclosure
Discussion
Discussion for this vulnerability can be found here:
Credit
Severity
Low
References
This data is provided by OSV and the GitHub Advisory Database (CC-BY 4.0).
Netty has a CRLF Injection vulnerability in io.netty.handler.codec.http.HttpRequestEncoder
CVE-2025-67735 / GHSA-84h7-rjj3-6jx4
Details