CVE-2026-33870
High · 7.5CVSS
7.5
EPSS
0.7%
Published
Mar 27, 2026
CISA due date
—
Cloudanix analysis
Some Java web services may misread specially crafted web requests, letting an attacker sneak in hidden requests that bypass normal front-door checks.
- Exploitation
- Remote Unauthenticated
- Attacker needs
- None
- Complexity
- Low
- Impact
- Data Tampering
- Component
- Library
- Class
- Improper Input Validation
- Remediation
- Upgrade
- Effort
- Medium
- Patch risk
- Low
What it actually does
CVE-2026-33870 is an HTTP/1.1 request parsing flaw in Netty before 4.1.132.Final and 4.2.10.Final. Netty incorrectly parses quoted strings inside chunked transfer encoding extension values, which can cause Netty and an upstream or downstream HTTP intermediary to disagree about where one request ends and the next begins. In deployments where Netty-based services sit behind or in front of proxies, gateways, load balancers, caches, or other HTTP parsers, this parser differential can enable HTTP request smuggling. The primary technical impact is integrity compromise: an attacker can desynchronize HTTP request streams, potentially injecting a hidden request, bypassing routing or security controls, poisoning queues or caches, or causing another user's request to be interpreted in an attacker-influenced context.
Why it matters to the business
Successful exploitation can allow attackers to manipulate how web requests are processed by Java services using vulnerable Netty versions. In practical terms, this may lead to unauthorized actions, bypass of access controls implemented at gateways or proxies, cache poisoning, request misrouting, or exposure of sensitive application behavior. The risk is highest for internet-facing services, API gateways, reverse proxies, service meshes, and custom Java applications that accept HTTP/1.1 chunked requests and use Netty directly or through frameworks built on Netty. Although this issue is not listed in CISA KEV and has low EPSS at this time, Netty is widely used in modern Java network stacks, so exposure may exist indirectly through application frameworks and dependencies.
How an attack unfolds
An attacker sends a specially crafted HTTP/1.1 request using Transfer-Encoding: chunked and includes malformed or ambiguous quoted strings in chunk extension values. Because vulnerable Netty versions parse those quoted chunk extensions differently than another HTTP component in the path, the frontend and backend can become desynchronized about the request boundary. The attacker then appends a second HTTP request in the same connection. One component may treat that appended data as part of the first request body, while the other treats it as a separate request. If the smuggled request reaches the application with trusted connection context or bypasses normal frontend enforcement, the attacker may be able to invoke unintended endpoints, alter request routing, poison shared responses, or interfere with subsequent users' requests on the same HTTP connection. Exploitation depends on the surrounding HTTP chain and is most plausible where Netty is combined with proxies, load balancers, gateways, caches, or other intermediaries that parse chunked encoding differently.
How to fix it
Upgrade Netty to a fixed release: 4.1.132.Final or later for the 4.1.x line, or 4.2.10.Final or later for the 4.2.x line. Because Netty is often pulled in transitively, review dependency trees for direct and indirect Netty artifacts and update parent frameworks or dependency management rules where necessary. If immediate upgrade is not possible, reduce exposure by disabling or restricting HTTP/1.1 chunked requests at the edge where feasible, normalizing requests at a trusted reverse proxy, rejecting chunk extensions with quoted values, avoiding mixed HTTP parser chains, and disabling backend connection reuse for high-risk paths as a temporary mitigation. Ensure all Netty-related modules are consistently upgraded rather than leaving mixed vulnerable artifacts in the application classpath.
How to confirm the fix worked
Confirm the deployed application no longer includes Netty versions earlier than 4.1.132.Final or 4.2.10.Final. Use build tooling such as Maven dependency:tree, Gradle dependencies, software composition analysis, container image scanning, and runtime classpath inspection to verify the effective Netty version. Test externally exposed HTTP endpoints to confirm ambiguous HTTP/1.1 chunked requests with quoted chunk extensions are rejected, normalized, or parsed consistently. Validate that reverse proxies, load balancers, API gateways, and backend Netty services agree on request boundaries and do not allow smuggled requests over reused connections. After deployment, monitor for a drop in malformed chunked-transfer parsing errors and ensure no service remains pinned to vulnerable transitive dependencies.
Typical attack path
- Identify a service or application stack using a vulnerable Netty version before 4.1.132.Final or 4.2.10.Final.
- Confirm the target accepts HTTP/1.1 requests with Transfer-Encoding: chunked.
- Probe for parser differentials by sending chunked requests containing quoted chunk extension values and observing timing, response splitting, connection reuse, or anomalous backend behavior.
- Craft a desynchronization payload where the frontend and Netty disagree about chunk boundaries or quoted extension parsing.
- Append a hidden HTTP request after the ambiguous chunked body.
- Use the smuggled request to reach internal routes, bypass frontend controls, poison a cache, alter request sequencing, or affect another request sharing the same connection.
- Repeat and tune the payload based on response behavior, proxy behavior, and whether connections are reused.
How to detect it
Investigate whether the service received malformed HTTP/1.1 chunked requests, especially requests containing Transfer-Encoding: chunked with chunk extension values that include quotes, escaped quotes, unusual semicolons, or malformed chunk-size lines. Review reverse proxy, load balancer, WAF, CDN, API gateway, and application access logs for repeated 400, 408, 413, 414, 431, 502, or 504 responses associated with unusual chunked requests or connection reuse anomalies. Look for sequences where a benign-looking request is followed immediately by an unexpected request on the same client connection, especially to administrative, internal, metadata, cacheable, or authentication-sensitive endpoints. Inspect Netty application logs for decoder exceptions, bad request parsing errors, premature connection closures, unexpected HTTP method tokens in request bodies, or invalid chunk extension parsing. Where full packet capture or HTTP telemetry is available, search for raw HTTP/1.1 payloads containing chunk extensions with quoted strings followed by additional HTTP request lines in the same TCP stream. No public exploitation campaigns or KEV listing are currently indicated in the provided data, so detection should focus on behavioral evidence of HTTP request smuggling and malformed chunked-transfer probing.
- Transfer-Encoding: chunked
- ;"
- =\"
- io.netty.handler.codec.http
- io.netty.handler.codec.http.HttpObjectDecoder
- io.netty.handler.codec.http.HttpRequestDecoder
- DecoderException
- invalid chunk
- malformed chunk
- bad chunk
- chunk extension
- GET / HTTP/1.1
- POST / HTTP/1.1
- HTTP/1.1 400
- HTTP/1.1 502
What your security team should do
- Inventory internet-facing and internal Java services, API gateways, RPC bridges, and frameworks that include Netty, including transitive dependencies.
- Prioritize upgrades for externally reachable services and systems behind reverse proxies, load balancers, CDNs, service meshes, or HTTP caches.
- Upgrade Netty to 4.1.132.Final or later, or 4.2.10.Final or later, and rebuild/redeploy affected applications and container images.
- Use dependency scanning and SBOM tooling to detect vulnerable Netty artifacts across source repositories, CI/CD pipelines, containers, and deployed packages.
- Add edge-layer controls to reject malformed chunked transfer encoding and suspicious chunk extension syntax while upgrades are in progress.
- Review proxy and gateway configurations for backend HTTP/1.1 connection reuse, request normalization, and inconsistent handling of Transfer-Encoding and Content-Length.
- Run request-smuggling validation tests in staging and, where authorized, against production edge endpoints.
- Monitor access logs, WAF logs, proxy logs, and application logs for malformed chunked requests, repeated 400/502 responses, desynchronization symptoms, and unexpected requests to sensitive paths.
The record
Netty is an asynchronous, event-driven network application framework. In versions prior to 4.1.132.Final and 4.2.10.Final, Netty incorrectly parses quoted strings in HTTP/1.1 chunked transfer encoding extension values, enabling request smuggling attacks. Versions 4.1.132.Final and 4.2.10.Final fix the issue.
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|---|---|---|
| Chainguard | akhq | 0 | 0.27.0-r0 |
| Chainguard | apache-pulsar-4.0 | 0 | 4.0.9-r10 |
| Chainguard | apache-pulsar-fips-4.0 | 0 | 4.0.9-r10 |
| Chainguard | apicurio-registry | 0 | 3.2.0-r2 |
| Chainguard | druid | 0 | 36.0.0-r11 |
| Chainguard | flyway-fips | 0 | 12.2.0-r1 |
| Chainguard | hono-adapter-mqtt | 0 | 2.7.0-r6 |
| Chainguard | hono-cli | 0 | 2.7.0-r6 |
| Chainguard | hono-service-auth | 0 | 2.7.0-r6 |
| Chainguard | hono-service-command-router | 0 | 2.7.0-r6 |
| Chainguard | hono-service-device-registry-jdbc | 0 | 2.7.0-r6 |
| Chainguard | infinispan-15.0 | 0 | 15.0.22-r3 |
| Chainguard | infinispan-15.1 | 0 | 15.1.7-r10 |
| Chainguard | infinispan-15.2 | 0 | 15.2.6-r11 |
| Chainguard | infinispan-16.0 | 0 | 16.0.8-r1 |
| Chainguard | infinispan-16.1 | 0 | 16.1.2-r1 |
| Chainguard | kafka-bridge | 0 | 0.33.1-r12 |
| Chainguard | kafka-bridge-fips | 0 | 0.33.1-r7 |
| Chainguard | keycloak-26.5 | 0 | 26.5.6-r2 |
| Chainguard | keycloak-26.5-iamguarded-compat | 0 | 26.5.6-r2 |
| Chainguard | keycloak-26.5-operator | 0 | 26.5.6-r2 |
| Chainguard | keycloak-fips-26.5 | 0 | 26.5.6-r2 |
| Chainguard | keycloak-fips-26.5-iamguarded-fips | 0 | 26.5.6-r2 |
| Chainguard | keycloak-fips-26.5-operator | 0 | 26.5.6-r2 |
| Chainguard | knative-kafka-broker-1.17-dispatcher-loom | 0 | 1.17.3-r12 |
| Chainguard | knative-kafka-broker-1.18-dispatcher-loom | 0 | 1.18.2-r6 |
| Chainguard | knative-kafka-broker-1.18-receiver-loom | 0 | 1.18.2-r6 |
| Chainguard | knative-kafka-broker-1.19-dispatcher-loom | 0 | 1.19.11-r6 |
| Chainguard | knative-kafka-broker-1.19-receiver-loom | 0 | 1.19.11-r6 |
| Chainguard | knative-kafka-broker-1.20-dispatcher-loom | 0 | 1.20.2-r6 |
| Chainguard | knative-kafka-broker-1.21-dispatcher-loom | 0 | 1.21.1-r6 |
| Chainguard | knative-kafka-broker-1.21-receiver-loom | 0 | 1.21.1-r6 |
| Chainguard | knative-kafka-broker-fips-1.17-dispatcher-loom | 0 | 1.17.3-r2 |
| Chainguard | knative-kafka-broker-fips-1.17-receiver-loom | 0 | 1.17.3-r2 |
| Chainguard | knative-kafka-broker-fips-1.18-dispatcher-loom | 0 | 1.18.2-r2 |
| Chainguard | knative-kafka-broker-fips-1.18-receiver-loom | 0 | 1.18.2-r2 |
| Chainguard | knative-kafka-broker-fips-1.19-dispatcher-loom | 0 | 1.19.11-r3 |
| Chainguard | knative-kafka-broker-fips-1.19-receiver-loom | 0 | 1.19.11-r3 |
| Chainguard | knative-kafka-broker-fips-1.20-dispatcher-loom | 0 | 1.20.2-r3 |
| Chainguard | knative-kafka-broker-fips-1.20-receiver-loom | 0 | 1.20.2-r3 |
| Chainguard | knative-kafka-broker-fips-1.21-dispatcher-loom | 0 | 1.21.1-r3 |
| Chainguard | knative-kafka-broker-fips-1.21-receiver-loom | 0 | 1.21.1-r3 |
| Chainguard | management-api-for-apache-cassandra-4.0 | 0 | 0.1.114-r0 |
| Chainguard | management-api-for-apache-cassandra-4.1 | 0 | 0.1.114-r0 |
| Chainguard | management-api-for-apache-cassandra-5.0 | 0 | 0.1.114-r1 |
| Chainguard | pinot | 0 | 1.4.0-r4 |
| Chainguard | spark-3.5-scala-2.12 | 0 | 3.5.8-r10 |
| Chainguard | spark-3.5-scala-2.13 | 0 | 3.5.8-r10 |
| Chainguard | spark-4.0-scala-2.13 | 0 | 4.0.2-r9 |
| Chainguard | spark-4.1-scala-2.13 | 0 | 4.1.1-r10 |
| Chainguard | spark-fips-3.5-scala-2.12 | 0 | 3.5.8-r0 |
| Chainguard | spark-fips-3.5-scala-2.13 | 0 | 3.5.8-r0 |
| Chainguard | spark-fips-4.1-scala-2.13 | 0 | 4.1.1-r8 |
| Chainguard | strimzi-kafka-operator-cluster-operator | 0 | 0.51.0-r6 |
| Chainguard | strimzi-kafka-operator-kafka-agent | 0 | 0.51.0-r6 |
| Chainguard | strimzi-kafka-operator-kafka-init | 0 | 0.51.0-r6 |
| Chainguard | strimzi-kafka-operator-topic-operator | 0 | 0.51.0-r6 |
| Chainguard | strimzi-kafka-operator-tracing-agent | 0 | 0.51.0-r6 |
| Chainguard | strimzi-kafka-operator-user-operator | 0 | 0.51.0-r6 |
| Chainguard | tez | 0 | 0.10.5-r10 |
| Chainguard | thingsboard-tb-mqtt-transport | 0 | 4.3.1-r4 |
| Chainguard | thingsboard-tb-node | 0 | 4.3.1-r4 |
| Chainguard | trino-plugin-delta-lake | 0 | 480-r1 |
| Chainguard | trino-plugin-elasticsearch | 0 | 480-r1 |
| Chainguard | trino-plugin-exchange-filesystem | 0 | 480-r1 |
| Chainguard | trino-plugin-exchange-hdfs | 0 | 480-r1 |
| Chainguard | trino-plugin-hive | 0 | 480-r1 |
| Chainguard | trino-plugin-hudi | 0 | 480-r1 |
| Chainguard | trino-plugin-iceberg | 0 | 480-r1 |
| Chainguard | trino-plugin-lakehouse | 0 | 480-r1 |
| Chainguard | trino-plugin-opensearch | 0 | 480-r1 |
| Chainguard | trino-plugin-pinot | 0 | 480-r1 |
| Chainguard | trino-plugin-redshift | 0 | 480-r1 |
| Chainguard | trino-plugin-spooling-filesystem | 0 | 480-r1 |
| Chainguard | trino-plugin-thrift | 0 | 480-r1 |
| Chainguard | wavefront-proxy | 0 | 13.9-r11 |
| Chainguard | wildfly-openjdk-17 | 0 | 39.0.1-r2 |
| Chainguard | wildfly-openjdk-21 | 0 | 39.0.1-r2 |
| SUSE:Linux Enterprise Module for Development Tools 15 SP7 | netty-tcnative | 0 | 2.0.75-150200.3.36.1 |
| SUSE:Linux Enterprise Module for Package Hub 15 SP7 | netty | 0 | 4.1.132-150200.4.43.1 |
| Wolfi | akhq | 0 | 0.27.0-r0 |
| Wolfi | apicurio-registry | 0 | 3.2.0-r2 |
| Wolfi | druid | 0 | 36.0.0-r11 |
| Wolfi | infinispan-15.2 | 0 | 15.2.6-r11 |
| Wolfi | infinispan-16.0 | 0 | 16.0.8-r1 |
| Wolfi | infinispan-16.1 | 0 | 16.1.2-r1 |
| Wolfi | keycloak-26.5 | 0 | 26.5.6-r2 |
| Wolfi | keycloak-26.5-iamguarded-compat | 0 | 26.5.6-r2 |
| Wolfi | keycloak-26.5-operator | 0 | 26.5.6-r2 |
| Wolfi | management-api-for-apache-cassandra-4.1 | 0 | 0.1.114-r0 |
| Wolfi | management-api-for-apache-cassandra-5.0 | 0 | 0.1.114-r1 |
| Wolfi | spark-3.5-scala-2.12 | 0 | 3.5.8-r10 |
| Wolfi | spark-3.5-scala-2.13 | 0 | 3.5.8-r10 |
| Wolfi | spark-4.0-scala-2.13 | 0 | 4.0.2-r9 |
| Wolfi | spark-4.1-scala-2.13 | 0 | 4.1.1-r10 |
| Wolfi | strimzi-kafka-operator-cluster-operator | 0 | 0.51.0-r6 |
| Wolfi | strimzi-kafka-operator-kafka-agent | 0 | 0.51.0-r6 |
| Wolfi | strimzi-kafka-operator-kafka-init | 0 | 0.51.0-r6 |
| Wolfi | strimzi-kafka-operator-topic-operator | 0 | 0.51.0-r6 |
| Wolfi | strimzi-kafka-operator-tracing-agent | 0 | 0.51.0-r6 |
| Wolfi | strimzi-kafka-operator-user-operator | 0 | 0.51.0-r6 |
| Wolfi | tez | 0 | 0.10.5-r10 |
| Wolfi | thingsboard-tb-mqtt-transport | 0 | 4.3.1-r4 |
| Wolfi | thingsboard-tb-node | 0 | 4.3.1-r4 |
| Wolfi | trino-plugin-delta-lake | 0 | 480-r1 |
| Wolfi | trino-plugin-elasticsearch | 0 | 480-r1 |
| Wolfi | trino-plugin-exchange-filesystem | 0 | 480-r1 |
| Wolfi | trino-plugin-exchange-hdfs | 0 | 480-r1 |
| Wolfi | trino-plugin-hive | 0 | 480-r1 |
| Wolfi | trino-plugin-hudi | 0 | 480-r1 |
| Wolfi | trino-plugin-iceberg | 0 | 480-r1 |
| Wolfi | trino-plugin-lakehouse | 0 | 480-r1 |
| Wolfi | trino-plugin-opensearch | 0 | 480-r1 |
| Wolfi | trino-plugin-pinot | 0 | 480-r1 |
| Wolfi | trino-plugin-redshift | 0 | 480-r1 |
| Wolfi | trino-plugin-spooling-filesystem | 0 | 480-r1 |
| Wolfi | trino-plugin-thrift | 0 | 480-r1 |
| Wolfi | wavefront-proxy | 0 | 13.9-r11 |
| Wolfi | wildfly-openjdk-17 | 0 | 39.0.1-r2 |
| Wolfi | wildfly-openjdk-21 | 0 | 39.0.1-r2 |
| openSUSE:Leap 15.6 | netty | 0 | 4.1.132-150200.4.43.1 |
| openSUSE:Leap 15.6 | netty-tcnative | 0 | 2.0.75-150200.3.36.1 |
| openSUSE:Tumbleweed | netty | 0 | 4.1.132-1.1 |
Related vulnerabilities
- CVE-2026-33871 Netty is an asynchronous, event-driven network application framework. Also affects akhq
- CVE-2026-24281 Hostname verification in Apache ZooKeeper ZKTrustManager falls back to reverse DNS (PTR)… Also affects akhq
- CVE-2026-24308 Improper handling of configuration values in ZKConfig in Apache ZooKeeper 3.8.5 and 3.9.4… Also affects akhq
- CVE-2025-11143 The Jetty URI parser has some key differences to other common parsers when evaluating… Also affects akhq
- CVE-2025-33042 Improper Control of Generation of Code ('Code Injection') vulnerability in Apache Avro… Also affects akhq
- CVE-2026-1225 ACE vulnerability in configuration file processing by QOS.CH logback-core up to and… Also affects akhq
- CVE-2025-67735 Netty has a CRLF Injection vulnerability in io.netty.handler.codec.http.HttpRequestEncoder Also affects akhq
- CVE-2025-11226 ACE vulnerability in conditional configuration file processing by QOS.CH logback-core up… Also affects akhq