Jun 15, 2026·7 min read·25 visits
Netty's HTTP decoder silently skips leading non-CRLF control characters (like SOH or NUL), allowing attackers to smuggle HTTP requests through reverse proxies.
CVE-2026-50020 is a medium-severity HTTP Request Smuggling/Response Smuggling vulnerability (CWE-444) within the Netty asynchronous network application framework. The flaw resides in Netty's HTTP codec implementation, specifically the HttpObjectDecoder class, which silently consumes arbitrary ISO control bytes preceding the first request line.
Netty is an asynchronous, event-driven network application framework used extensively in the enterprise Java ecosystem for building high-performance protocol servers and clients. The framework serves as the underlying networking layer for major projects, including Spring Boot WebFlux, Vert.x, Quarkus, and various API gateways. Because Netty handles raw socket parsing directly, flaws within its parsing logic expose a highly critical attack surface to the public internet.
This specific vulnerability, tracked as CVE-2026-50020 and natively as GHSA-hvcg-qmg6-jm4c, resides in Netty's HTTP codec module, specifically inside the HttpObjectDecoder class. The component is responsible for parsing raw incoming byte streams into structured HTTP request and response objects. A parsing inconsistency in this decoder allows remote attackers to perform HTTP request smuggling, a class of vulnerability categorized under CWE-444.
The vulnerability occurs when Netty acts as a backend server positioned behind an intermediary reverse proxy, load balancer, or web application firewall (WAF). If the upstream proxy handles invalid leading control characters differently than Netty, an attacker can exploit this discrepancy to bypass front-end security controls. The impact is restricted to architectures where persistent TCP connections are shared or reused between the proxy and the backend server.
The root cause of CVE-2026-50020 lies in Netty's overly lenient handling of leading characters preceding the first HTTP request line. According to the HTTP/1.1 specification outlined in RFC 9112 §2.2, a robust HTTP parser is permitted to tolerate empty lines before a request. Specifically, the specification states that a server expecting to parse a request line should ignore at least one empty line (CRLF) received prior to that request line. This allowance is restricted strictly to carriage return and line feed characters.
In vulnerable versions of Netty, the parser implements a broader robustness logic that goes far beyond the RFC mandate. The HttpObjectDecoder class attempts to skip what it classifies as control characters and whitespace before beginning the extraction of the request method, URI, and version. To identify these bytes, Netty utilizes the static array ISO_CONTROL_OR_WHITESPACE initialized using Java's Character.isISOControl(b) helper method.
The application of Character.isISOControl introduces a major security deviation. In the Java language specification, this method evaluates to true for any byte value within the range of 0x00 through 0x1F, as well as 0x7F. This range includes characters such as NUL (0x00), SOH (0x01), STX (0x02), and other control sequences that are completely distinct from standard CRLF whitespace characters. When Netty encounters these bytes preceding an HTTP request line, it silently discards them instead of rejecting the stream as malformed.
To understand the architectural defect, we must examine the implementation of LineParser.skipControlChars in the vulnerable versions. The method utilizes a ByteProcessor to loop over the inbound buffer, advancing the reader index past any byte that matches the ISO_CONTROL_OR_WHITESPACE map. This processing logic effectively ignores illegal bytes, shifting the starting index of the actual HTTP request line forward.
// Vulnerable logic in HttpObjectDecoder.java
private static void skipControlChars(ByteBuf buffer) {
for (;;) {
int i = buffer.forEachByte(SKIP_CONTROL_CHARS_BYTES);
if (i == -1) {
buffer.readerIndex(buffer.writerIndex());
break;
}
buffer.readerIndex(i);
// Arbitrary control characters (0x00-0x1F) are silently consumed
}
}The patch introduced in versions 4.1.135.Final and 4.2.15.Final addresses this behavior by replacing the generic ISO control check with a strict validation routine. The updated logic verifies that only valid CRLF sequences are bypassed. Any occurrence of non-CRLF control characters preceding the request line now immediately terminates the parsing sequence and registers a decoder failure, preventing the smuggling of subsequent requests.
By ensuring that non-CRLF bytes trigger an immediate protocol violation, the updated parser aligns with RFC 9112 §2.2. The fix effectively eliminates the semantic gap between the proxy and Netty. Because the backend now rejects any leading bytes that are not CRLF, the proxy's view of the request stream remains synchronized with the backend's interpretation.
Exploitation of CVE-2026-50020 relies on establishing a desynchronized state between the front-end reverse proxy and the backend Netty server. An attacker begins by crafting an HTTP pipelined payload containing two logical requests. The first request is a standard, syntactically valid HTTP POST request containing a body, while the second is a smuggled request prefixed with an arbitrary non-CRLF control character like SOH (0x01).
The front-end proxy inspects the initial POST request, reads the Content-Length header, and maps the entire body (including the smuggled request and its leading SOH byte) as payload data. It does not parse the payload as an independent HTTP request because it is contained within the POST request boundary. The proxy then routes the combined byte stream to the Netty backend over a shared, persistent connection.
When the Netty backend receives the stream, it processes the first POST request and executes the associated application handler. Once completed, Netty looks for the next request on the same TCP channel. It encounters the SOH byte, identifies it as an ISO control character, and silently ignores it. Netty then processes the immediate subsequent bytes as a brand new, independent HTTP request, allowing the attacker to bypass the proxy's routing restrictions.
The direct impact of CVE-2026-50020 is a complete bypass of front-end security controls. In modern architectures, reverse proxies are frequently used to enforce authentication, inspect authorization headers, and restrict access to administrative endpoints. By smuggling requests, an attacker can query these restricted endpoints directly because the proxy only validates the outer POST request.
Beyond access control bypasses, this request smuggling flaw can lead to cache poisoning if the front-end proxy caches responses based on request URIs. An attacker can orchestrate a scenario where a smuggled request causes the backend to return a malicious response, which the proxy then associates with a public URI. Consequently, subsequent legitimate users requesting that public URI are served the poisoned cache content.
The CVSS v3.1 base score is calculated at 5.3 (Medium) with the vector CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N. While the technical severity is medium because the vulnerability requires a specific proxy-backend configuration, the operational risk is high due to the ubiquity of Netty in cloud-native Java environments. Organizations employing Netty backends behind load balancers must prioritize patching to maintain boundary integrity.
Remediation requires upgrading Netty components to secure versions. For environments utilizing the 4.1.x release line, teams must update netty-codec-http to version 4.1.135.Final or higher. For applications built on the 4.2.x release line, the dependency must be updated to version 4.2.15.Final or higher. Transitive dependency resolution tools should be configured to enforce these versions globally.
In scenarios where immediate upgrading is unfeasible, several defense-in-depth mitigations can reduce the threat vector. The most effective workaround is to disable connection keep-alive or pipeline reuse between the proxy and the Netty backend. If the proxy establishes a fresh TCP socket for every individual backend request, the boundary desynchronization necessary for request smuggling cannot occur.
Additionally, migrating the backend connection protocol from HTTP/1.1 to HTTP/2 offers robust protection. HTTP/2 utilizes binary framing to separate requests, rendering the protocol immune to text-delimited parsing errors like leading-byte smuggling. Finally, security teams can configure their front-end proxies or WAFs to detect and reject any request payloads containing raw binary control characters in the body of HTTP/1.1 requests.
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N| Product | Affected Versions | Fixed Version |
|---|---|---|
netty-codec-http Netty Project | >= 4.1.0, < 4.1.135.Final | 4.1.135.Final |
netty-codec-http Netty Project | >= 4.2.0, < 4.2.15.Final | 4.2.15.Final |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-444 |
| Attack Vector | Network |
| CVSS v3.1 Score | 5.3 (Medium) |
| EPSS Score | 0.00232 (0.23%) |
| EPSS Percentile | 13.85% |
| Exploit Status | Proof of Concept (PoC) |
| CISA KEV Status | Not Listed |
The application fails to properly parse or validate incoming HTTP requests in a uniform manner, leading to request boundary confusion.
A logic vulnerability exists in @dynatrace-oss/dynatrace-mcp-server prior to version 1.8.7. The create_dynatrace_notebook tool lacks a human-approval gate, allowing an attacker to exploit indirect prompt injection to force the underlying LLM client to create persistent Dynatrace notebooks without the operator's consent.
A critical authentication and authorization bypass vulnerability in the Quarkus Java framework exists due to a parser differential mismatch between the HTTP security policy layer and downstream handlers. By leveraging encoded reserved characters such as semicolons, slashes, and backslashes, attackers can bypass configured path-based security policies to gain unauthorized access to secure administrative endpoints and static resources.
A critical code injection vulnerability exists in @aws/agentcore CLI (AWS AgentCore CLI) during the Bedrock Agent import lifecycle. An authenticated remote attacker with permissions to configure Bedrock collaborator attributes can inject python code by embedding triple-double-quotes (""") inside the collaborationInstruction metadata field. The CLI formats this metadata directly into a Python docstring in a generated main.py file without adequate escaping, leading to arbitrary code execution when the imported agent is run or deployed.
GHSA-WCHH-9X6H-7F6P documents the critical deprecation of the cryptographic library libolm (Olm) and its Python binding wrapper python-olm, which matrix-commander depended upon via its downstream client library matrix-nio. Multiple cryptographic vulnerabilities (timing leaks, side-channels, signature malleability, and protocol confusion) were disclosed in 2022 and 2024. Because libolm is unmaintained, Python clients using matrix-commander are considered cryptographically unsafe until migrating to vodozemac.
An Excessive Data Exposure vulnerability in Easy!Appointments v1.5.2 allows low-privileged administrative users, such as restricted Providers and Secretaries, to harvest unique, stateless appointment hashes belonging to other providers. These hashes act as capability tokens, granting full authorization to reschedule, take over, or delete appointments via stateless endpoints, resulting in a complete Broken Object Level Authorization (BOLA) scenario.
Easy!Appointments prior to version 1.6.0 is vulnerable to Server-Side Request Forgery (SSRF) within its CalDAV integration module. The system handles user-supplied URLs in the connection test endpoint without verifying host constraints or network schemes, allowing authenticated backend users to probe internal infrastructure.