Bug 2536966 (CVE-2026-93574)

Summary: CVE-2026-93574 io.netty/netty-codec-http: Netty: HTTP request smuggling via post-digit whitespace in chunk-size parsing
Product: [Other] Security Response Reporter: OSIDB Bzimport <bzimport>
Component: vulnerabilityAssignee: Product Security <prodsec-ir-bot>
Status: NEW --- QA Contact:
Severity: medium Docs Contact:
Priority: medium    
Version: unspecifiedCC: ant, anujha, aschwart, asoldano, aszczucz, ataylor, bbaranow, bmaxwell, boliveir, bstansbe, ccranfor, cescoffi, csuconic, dbruscin, dlofthou, drichtar, ehugonne, ewittman, fmariani, fmongiar, gmalinko, gsmet, gtully, istudens, ivassile, iweiss, janstey, jmartisk, jnethert, jpechane, jsherman, jwon, kvanderr, manderse, mcarlett, mosmerov, mposolda, msvehla, nipatil, nwallace, olubyans, ozzy, pantinor, pberan, pdelbell, pesilva, pjindal, pmackay, rgemmell, rgodfrey, rguimara, rkubis, rmartinc, rstancel, rstepani, sbiarozk, ssilvert, sthorger, tbish, tcunning, thjenkin, tlavocat, varjain, vdosoudi, vmuzikar, yfang
Target Milestone: ---Keywords: Security
Target Release: ---   
Hardware: All   
OS: Linux   
Whiteboard:
Fixed In Version: Doc Type: ---
Doc Text:
A flaw was found in Netty's `netty-codec-http` component. A remote attacker could exploit this vulnerability by sending a specially crafted HTTP/1.1 chunk-size token that includes post-digit whitespace. This incorrect parsing of the chunk size can lead to HTTP request smuggling. This allows an attacker to bypass security controls or access unauthorized resources in proxy/backend deployments.
Story Points: ---
Clone Of: Environment:
Last Closed: Type: ---
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: --- RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: --- Target Upstream Version:
Embargoed:

Description OSIDB Bzimport 2026-09-18 10:31:35 UTC
HTTP request smuggling via post-digit whitespace in chunk-size parsing

A public GitHub Security Advisory (GHSA-j4mg-hqgv-34qc) describes the following issue:

## Summary

`io.netty:netty-codec-http` accepts post-digit whitespace inside an HTTP/1.1 chunk-size token, truncates parsing at that whitespace/control byte, and does not validate the remaining bytes on the line. A malformed chunk line such as `5 c\r\n` is parsed as size `0x5` instead of being rejected. The attached local PoV shows Netty then parsing `GET /smuggled` as a second request on the same connection.

## PoC

Run:

```sh
bash poc/reproduce.sh
```

The important case is:

```text
POST / HTTP/1.1\r\n
Host: example\r\n
Transfer-Encoding: chunked\r\n
\r\n
5 c\r\n
GPOST\r\n
0\r\n
\r\n
GET /smuggled HTTP/1.1\r\n
Host: example\r\n
\r\n
```

Expected output:

```text
CASE internal-space-smuggle-shape
httpContent class=DefaultHttpContent bytes=5 text=GPOST decoderSuccess=true
lastContent=true
httpRequest uri=/smuggled path=/smuggled decoderSuccess=true
```

The PoV also includes:

- `5 x`, showing that arbitrary suffix bytes after post-digit whitespace are ignored for sizing.
- `5 c;foo=bar`, showing that the ambiguity survives when chunk-extension validation is invoked.

## Impact

This is an HTTP request-smuggling primitive in proxy/backend deployments where another HTTP component interprets the same malformed chunk-size line differently. Netty is the component that accepts the malformed chunked body and splits the stream into two requests.

No live services were probed. The PoV uses only `EmbeddedChannel` and `HttpRequestDecoder`.

This report is not about leading/trailing whitespace compatibility around a chunk-size line. It targets post-digit internal whitespace followed by additional token bytes.

## Suggested Fix

Reject internal whitespace/control characters in the `chunk-size` token. If Netty wants to preserve compatibility for leading/trailing SP/HTAB, the parser should transition to a trailing-whitespace state after the first post-digit whitespace byte and reject any later hex digit or token byte before `;`/CRLF.

## Affected Package/Versions

Verified affected:

- `4.2.15.Final`
- `4.2.14.Final`
- `4.2.13.Final`
- `4.1.135.Final`
- `4.1.133.Final`
- `4.1.90.Final`
- `4.1.87.Final`
- current `4.2` branch at `7bae566a93e69409697fe57fa807910ba5c9720e`

Verified not affected by this exact PoV:

- `4.1.89.Final`
- `4.1.88.Final`

## References

- Netty security policy: `https://github.com/netty/netty/security/policy`
- RFC 9112 chunked transfer coding: `https://www.rfc-editor.org/rfc/rfc9112#name-chunked-transfer-coding`
- Netty `HttpDecoderConfig` framing-validation documentation: `https://netty.io/4.2/api/io/netty/handler/codec/http/HttpDecoderConfig.html`
- Adjacent Netty chunk-size advisory: `https://github.com/netty/netty/security/advisories/GHSA-m4cv-j2px-7723`
- Adjacent Netty initial-control-character advisory: `https://github.com/netty/netty/security/advisories/GHSA-hvcg-qmg6-jm4c`
- Adjacent Netty start-line injection advisory: `https://github.com/advisories/GHSA-v8h7-rr48-vmmv`
- CWE-444: `https://cwe.mitre.org/data/definitions/444.html`

## Classification

- CWE-444
- Suggested severity: Moderate
- Suggested CVSS v3.1: `CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:L`

## Non-Duplicate Boundary

This is distinct from prior Netty request-smuggling advisories:

- `GHSA-m4cv-j2px-7723` fixed chunk-size integer overflow in `getChunkSize`; this candidate reproduces on its patched versions `4.2.13.Final` and `4.1.133.Final`.
- `GHSA-hvcg-qmg6-jm4c` / `CVE-2026-50020` fixed non-CRLF control-character skipping before the request line; this candidate is in chunk-size parsing after a normal `POST` request has already started, and it reproduces on that advisory's patched versions `4.2.15.Final` and `4.1.135.Final`.
- `GHSA-v8h7-rr48-vmmv` / `CVE-2026-41417` fixed `setUri()` start-line injection during outbound encoding; this candidate is inbound chunk-size parsing and does not require `DefaultHttpRequest.setUri()`.
- `GHSA-fghv-69vj-qj49` and `GHSA-pwqr-wmgm-9rr8` concern chunk-extension parsing; this candidate is in the chunk-size token before extension parsing.
- `GHSA-38f8-5428-x5cv` concerns malformed `Transfer-Encoding`; this candidate uses a normal `Transfer-Encoding: chunked` header and a malformed chunk-size line.

Affected:
- maven:io.netty:netty-codec-http affected >=4.2.13.Final, <=4.2.17.Final; fixed unknown
- maven:io.netty:netty-codec-http affected >=4.1.90.Final, <=4.1.137.Final; fixed unknown

Fixed versions: see advisory

Advisory: https://github.com/netty/netty/security/advisories/GHSA-j4mg-hqgv-34qc