Cloudanix VulnDB

CVE-2024-29025

Medium · 5.3

CVSS

5.3

EPSS

1.4%

Published

Mar 25, 2024

CISA due date

—

Cloudanix analysis

Next patch cycle SSVC: Track

A flaw in a common Java networking component can let someone knock affected web services offline by sending specially crafted form submissions.

Exploitation
Remote Unauthenticated
Attacker needs
None
Complexity
Low
Impact
Denial Of Service
Component
Library
Class
Denial of service
Remediation
Upgrade
Effort
Medium
Patch risk
Low

What it actually does

This is a network-reachable denial-of-service flaw in Netty's HTTP multipart/form POST decoding logic. Applications that use vulnerable Netty versions and parse attacker-supplied form POST bodies with HttpPostRequestDecoder can be forced to retain an unbounded number of form fields in bodyListHttpData and to accumulate bytes in the undecodedChunk buffer. By sending a chunked HTTP POST containing many small fields, an unauthenticated remote attacker can drive excessive heap or direct memory consumption, increased garbage collection, request-processing stalls, and potentially process termination. The issue affects availability only; it does not directly provide code execution, privilege escalation, or data disclosure.

Why it matters to the business

Public-facing services built on affected Netty versions may become slow, unstable, or unavailable if targeted with crafted HTTP POST traffic. Because Netty is widely used as an embedded networking framework in Java services, the exposure may exist indirectly through applications, gateways, APIs, or products that bundle or shade Netty. The vulnerability has a moderate CVSS score, low EPSS, is not listed in CISA KEV, and has no known mature public exploit in the provided data, but it has been public since March 2024, so remediation should be handled as standard dependency hygiene for internet-facing and high-availability services.

How an attack unfolds

An attacker identifies an HTTP endpoint backed by a vulnerable Netty stack that accepts form-encoded or multipart POST requests and invokes HttpPostRequestDecoder. The attacker then opens one or more connections and sends chunked POST bodies made up of many small form fields. Because vulnerable decoder logic does not adequately limit the number of fields accumulated in bodyListHttpData or the amount of undecoded data buffered in undecodedChunk, memory usage grows as the request is processed. Repeating this across connections or requests can cause high memory pressure, garbage-collection churn, slow responses, connection resets, OutOfMemoryError conditions, or service crashes. No authentication or user interaction is required if the vulnerable endpoint is reachable anonymously.

How to fix it

Upgrade Netty to version 4.1.108.Final or later. For source-based tracking, ensure the fix containing commit 3a3f9d13b129555802de5652667ca0af662f554e is present. Review direct and transitive dependencies such as netty-codec-http, netty-all, and framework dependencies that embed Netty; also check for shaded or vendored Netty copies inside application artifacts. Where immediate upgrade is not possible, mitigate by enforcing request body size limits, form field count limits, multipart limits, reverse-proxy buffering limits, connection and request rate limits, and aggressive timeouts for slow or oversized POST bodies. Prefer rejecting unexpectedly large or highly fragmented chunked POST requests before they reach Netty-based application code.

How to confirm the fix worked

Confirm that all deployed Java artifacts resolve Netty 4.1.108.Final or later, or include the fixed commit if built from source. Use dependency tooling such as Maven dependency:tree, Gradle dependencies, SCA/SBOM scanners, and container image scanners to find vulnerable or shaded Netty components. At runtime, verify application startup logs, dependency manifests, JAR metadata, or build information for the active Netty version. Test exposed endpoints with safe, controlled negative tests that send chunked form POSTs with high field counts and confirm requests are rejected by configured limits without abnormal heap growth, direct memory growth, excessive garbage collection, or process instability.

Typical attack path

  1. Discover an application or service using a vulnerable Netty version for HTTP request handling.
  2. Identify an endpoint that accepts HTTP POST requests with form or multipart body parsing.
  3. Send crafted chunked POST requests containing a very large number of small form fields or data fragments.
  4. Force HttpPostRequestDecoder to accumulate excessive HttpData entries and undecoded bytes in memory.
  5. Repeat or parallelize requests until the service experiences memory exhaustion, latency spikes, failed requests, or process termination.

How to detect it

There is no single definitive on-host artifact proving exploitation, so detection should correlate HTTP access logs, reverse-proxy logs, application logs, JVM telemetry, and infrastructure metrics. Look for bursts of HTTP POST requests using Transfer-Encoding: chunked and Content-Type values associated with form parsing, especially requests with extremely high parameter counts, many tiny chunks, long request durations, repeated connection resets, or unusually large request bodies relative to normal traffic. On application hosts, investigate time-correlated increases in heap usage, direct memory usage, garbage collection pauses, thread starvation, 5xx responses, container restarts, JVM crashes, or OutOfMemoryError events. Useful log sources include web server and load balancer access logs, API gateway logs, WAF logs, application logs containing Netty exceptions, JVM GC logs, container orchestrator restart events, APM traces, and host memory telemetry. For forensic review, correlate suspicious POST traffic with Java process memory growth and service instability; absence of these artifacts does not rule out attempted exploitation if upstream devices dropped or normalized the traffic.

  • io.netty.handler.codec.http.multipart.HttpPostRequestDecoder
  • bodyListHttpData
  • undecodedChunk
  • java.lang.OutOfMemoryError: Java heap space
  • java.lang.OutOfMemoryError: Direct buffer memory
  • io.netty.util.internal.OutOfDirectMemoryError
  • Transfer-Encoding: chunked
  • Content-Type: application/x-www-form-urlencoded
  • Content-Type: multipart/form-data
  • POST

What your security team should do

  • Inventory applications, gateways, APIs, and vendor products that include Netty, especially internet-facing Java services that accept POST form uploads or multipart data.
  • Prioritize upgrade to Netty 4.1.108.Final or later for externally reachable and high-availability services.
  • Search dependency trees and SBOMs for netty-codec-http, netty-all, and shaded Netty copies that may not be obvious from top-level package names.
  • Add or verify request body size, multipart/form field count, chunked transfer, timeout, and rate-limit controls at the reverse proxy, API gateway, and application layers.
  • Monitor for memory pressure, OutOfMemoryError, direct memory exhaustion, abnormal garbage collection, and bursts of chunked POST requests with unusually high parameter counts.
  • If upgrade is delayed, deploy compensating controls to reject excessive form fields and oversized or highly fragmented chunked POST bodies before Netty parsing occurs.
  • Treat exploitation as availability-focused: prepare runbooks for traffic blocking, endpoint throttling, heap dump collection, and rapid service restart if active denial-of-service behavior is observed.

The record

Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. The `HttpPostRequestDecoder` can be tricked to accumulate data. While the decoder can store items on the disk if configured so, there are no limits to the number of fields the form can have, an attacher can send a chunked post consisting of many small fields that will be accumulated in the `bodyListHttpData` list. The decoder cumulates bytes in the `undecodedChunk` buffer until it can decode a field, this field can cumulate data without limits. This vulnerability is fixed in 4.1.108.Final.

Affected packages

Ecosystem Package Introduced Fixed
Maven io.netty:netty-codec-http 0 4.1.108.Final
Chainguard apache-nifi 0 1.26.0-r2
Chainguard apache-nifi 0 2.6.0-r2
Chainguard apache-nifi-compat 0 2.6.0-r2
Chainguard apache-nifi-toolkit 0 2.6.0-r2
Chainguard cloudwatch-exporter 0 0.15.5-r1
Chainguard docker-selenium-jre-bcfips 0 4.19.0.20240328-r0
Chainguard docker-selenium-jre-bcfips-supervisor-config 0 4.19.0.20240328-r0
Chainguard elasticsearch-7 0 7.17.20-r0
Chainguard elasticsearch-7-bitnami 0 7.17.20-r0
Chainguard elasticsearch-7-iamguarded 0 7.17.20-r0
Chainguard elasticsearch-8 0 8.13.2-r1
Chainguard elasticsearch-8-bitnami 0 8.13.2-r1
Chainguard elasticsearch-8-config 0 8.13.2-r1
Chainguard elasticsearch-8-iamguarded 0 8.13.2-r1
Chainguard elasticsearch-config 0 8.13.2-r1
Chainguard grpc-java-fips-1.56.0 0 0
Chainguard grpc-java-fips-1.56.0-m2 0 0
Chainguard hadoop-fips-3.3.6 0 3.3.6-r15
Chainguard keycloak 0 24.0.2-r1
Chainguard keycloak-bitnami-compat 0 24.0.2-r1
Chainguard keycloak-bitnami-fips 0 24.0.3-r0
Chainguard keycloak-compat 0 24.0.2-r1
Chainguard keycloak-fips 0 24.0.3-r0
Chainguard keycloak-fips-bitnami-compat 0 24.0.3-r0
Chainguard keycloak-fips-policy-140-2 0 24.0.3-r0
Chainguard keycloak-fips-policy-140-3 0 24.0.3-r0
Chainguard keycloak-iamguarded-compat 0 24.0.2-r1
Chainguard keycloak-iamguarded-fips 0 24.0.3-r0
Chainguard management-api-for-apache-cassandra 0 0.1.80-r0
Chainguard management-api-for-apache-cassandra-4.0 0 0.1.74-r1
Chainguard management-api-for-apache-cassandra-4.0-compat 0 0.1.74-r1
Chainguard management-api-for-apache-cassandra-compat 0 0.1.80-r0
Chainguard neo4j 0 5.20.0-r0
Chainguard neo4j-oci-entrypoint 0 5.20.0-r0
Chainguard opensearch-2 0 2.13.0-r0
Chainguard opensearch-2-alerting 0 2.13.0-r0
Chainguard opensearch-2-analysis-icu 0 2.13.0-r0
Chainguard opensearch-2-analysis-kuromoji 0 2.13.0-r0
Chainguard opensearch-2-analysis-nori 0 2.13.0-r0
Chainguard opensearch-2-analysis-phonetic 0 2.13.0-r0
Chainguard opensearch-2-analysis-smartcn 0 2.13.0-r0
Chainguard opensearch-2-analysis-stempel 0 2.13.0-r0
Chainguard opensearch-2-analysis-ukrainian 0 2.13.0-r0
Chainguard opensearch-2-anomaly-detection 0 2.13.0-r0
Chainguard opensearch-2-asynchronous-search 0 2.13.0-r0
Chainguard opensearch-2-cross-cluster-replication 0 2.13.0-r0
Chainguard opensearch-2-crypto-kms 0 2.13.0-r0
Chainguard opensearch-2-custom-codecs 0 2.13.0-r0
Chainguard opensearch-2-discovery-azure-classic 0 2.13.0-r0
Chainguard opensearch-2-discovery-ec2 0 2.13.0-r0
Chainguard opensearch-2-discovery-gce 0 2.13.0-r0
Chainguard opensearch-2-entrypoint-compat 0 2.13.0-r0
Chainguard opensearch-2-geospatial 0 2.13.0-r0
Chainguard opensearch-2-identity-shiro 0 2.13.0-r0
Chainguard opensearch-2-index-management 0 2.13.0-r0
Chainguard opensearch-2-ingest-attachment 0 2.13.0-r0
Chainguard opensearch-2-job-scheduler 0 2.13.0-r0
Chainguard opensearch-2-jre-bcfips 0 2.14.0-r0
Chainguard opensearch-2-jre-bcfips-alerting 0 2.14.0-r0
Chainguard opensearch-2-jre-bcfips-analysis-icu 0 2.14.0-r0
Chainguard opensearch-2-jre-bcfips-analysis-kuromoji 0 2.14.0-r0
Chainguard opensearch-2-jre-bcfips-analysis-nori 0 2.14.0-r0
Chainguard opensearch-2-jre-bcfips-analysis-phonetic 0 2.14.0-r0
Chainguard opensearch-2-jre-bcfips-analysis-smartcn 0 2.14.0-r0
Chainguard opensearch-2-jre-bcfips-analysis-stempel 0 2.14.0-r0
Chainguard opensearch-2-jre-bcfips-analysis-ukrainian 0 2.14.0-r0
Chainguard opensearch-2-jre-bcfips-anomaly-detection 0 2.14.0-r0
Chainguard opensearch-2-jre-bcfips-asynchronous-search 0 2.14.0-r0
Chainguard opensearch-2-jre-bcfips-cross-cluster-replication 0 2.14.0-r0
Chainguard opensearch-2-jre-bcfips-crypto-kms 0 2.14.0-r0
Chainguard opensearch-2-jre-bcfips-custom-codecs 0 2.14.0-r0
Chainguard opensearch-2-jre-bcfips-discovery-azure-classic 0 2.14.0-r0
Chainguard opensearch-2-jre-bcfips-discovery-ec2 0 2.14.0-r0
Chainguard opensearch-2-jre-bcfips-discovery-gce 0 2.14.0-r0
Chainguard opensearch-2-jre-bcfips-geospatial 0 2.14.0-r0
Chainguard opensearch-2-jre-bcfips-identity-shiro 0 2.14.0-r0
Chainguard opensearch-2-jre-bcfips-index-management 0 2.14.0-r0
Chainguard opensearch-2-jre-bcfips-ingest-attachment 0 2.14.0-r0
Chainguard opensearch-2-jre-bcfips-job-scheduler 0 2.14.0-r0
Chainguard opensearch-2-jre-bcfips-k-nn 0 2.14.0-r0
Chainguard opensearch-2-jre-bcfips-mapper-annotated-text 0 2.14.0-r0
Chainguard opensearch-2-jre-bcfips-mapper-murmur3 0 2.14.0-r0
Chainguard opensearch-2-jre-bcfips-mapper-size 0 2.14.0-r0
Chainguard opensearch-2-jre-bcfips-ml-commons 0 2.14.0-r0
Chainguard opensearch-2-jre-bcfips-neural-search 0 2.14.0-r0
Chainguard opensearch-2-jre-bcfips-notifications 0 2.14.0-r0
Chainguard opensearch-2-jre-bcfips-observability 0 2.14.0-r0
Chainguard opensearch-2-jre-bcfips-performance-analyzer 0 2.14.0-r0
Chainguard opensearch-2-jre-bcfips-reporting 0 2.14.0-r0
Chainguard opensearch-2-jre-bcfips-repository-azure 0 2.14.0-r0
Chainguard opensearch-2-jre-bcfips-repository-gcs 0 2.14.0-r0
Chainguard opensearch-2-jre-bcfips-repository-s3 0 2.14.0-r0
Chainguard opensearch-2-jre-bcfips-security 0 2.14.0-r0
Chainguard opensearch-2-jre-bcfips-security-analytics 0 2.14.0-r0
Chainguard opensearch-2-jre-bcfips-sql 0 2.14.0-r0
Chainguard opensearch-2-jre-bcfips-store-smb 0 2.14.0-r0
Chainguard opensearch-2-jre-bcfips-telemetry-otel 0 2.14.0-r0
Chainguard opensearch-2-jre-bcfips-transport-nio 0 2.14.0-r0
Chainguard opensearch-2-k-nn 0 2.13.0-r0
Chainguard opensearch-2-mapper-annotated-text 0 2.13.0-r0
Chainguard opensearch-2-mapper-murmur3 0 2.13.0-r0
Chainguard opensearch-2-mapper-size 0 2.13.0-r0
Chainguard opensearch-2-ml-commons 0 2.13.0-r0
Chainguard opensearch-2-neural-search 0 2.13.0-r0
Chainguard opensearch-2-notifications 0 2.13.0-r0
Chainguard opensearch-2-observability 0 2.13.0-r0
Chainguard opensearch-2-performance-analyzer 0 2.13.0-r0
Chainguard opensearch-2-reporting 0 2.13.0-r0
Chainguard opensearch-2-repository-azure 0 2.13.0-r0
Chainguard opensearch-2-repository-gcs 0 2.13.0-r0
Chainguard opensearch-2-repository-s3 0 2.13.0-r0
Chainguard opensearch-2-security 0 2.13.0-r0
Chainguard opensearch-2-security-analytics 0 2.13.0-r0
Chainguard opensearch-2-sql 0 2.13.0-r0
Chainguard opensearch-2-store-smb 0 2.13.0-r0
Chainguard opensearch-2-telemetry-otel 0 2.13.0-r0
Chainguard opensearch-2-transport-nio 0 2.13.0-r0
Chainguard pyspark-scala-2.13 0 3.5.1-r3
Chainguard request-1277 0 0.1.89-r0
Chainguard selenium 0 4.19.0-r0
Chainguard selenium-jre-bcfips 0 4.19.0-r0
Chainguard selenium-server 0 4.19.0-r0
Chainguard selenium-server-compat 0 4.19.0-r0
Chainguard selenium-server-jre-bcfips 0 4.19.0-r0
Chainguard selenium-server-jre-bcfips-compat 0 4.19.0-r0
Chainguard selenium-server-standalone 0 4.19.0-r0
Chainguard selenium-server-standalone-jre-bcfips 0 4.19.0-r0
Chainguard sonarqube 0 25.10.0.114319-r0
Chainguard sonarqube-10 0 25.3.0.104237-r0
Chainguard sonarqube-10-docker-compat 0 25.3.0.104237-r0
Chainguard sonarqube-10-scripts 0 25.3.0.104237-r0
Chainguard sonarqube-docker-compat 0 25.10.0.114319-r0
Chainguard sonarqube-scripts 0 25.10.0.114319-r0
Chainguard spark-3.5 0 3.5.1-r3
Chainguard spark-3.5-bitnami-compat 0 3.5.1-r3
Chainguard spark-3.5-compat 0 3.5.1-r3
Chainguard spark-3.5-minimal 0 3.5.1-r3
Chainguard spark-3.5-minimal-openjdk-11 0 3.5.1-r3
Chainguard spark-3.5-minimal-openjdk-17 0 3.5.1-r3
Chainguard spark-3.5-minimal-openjdk-8 0 3.5.1-r3
Chainguard spark-3.5-openjdk-11 0 3.5.1-r3
Chainguard spark-3.5-openjdk-17 0 3.5.1-r3
Chainguard spark-3.5-openjdk-8 0 3.5.1-r3
Chainguard spark-3.5-scala-2.12 0 3.5.1-r3
Chainguard spark-3.5-scala-2.12-bitnami-compat 0 3.5.1-r3
Chainguard spark-3.5-scala-2.12-compat 0 3.5.1-r3
Chainguard spark-3.5-scala-2.12-iamguarded-compat 0 3.5.1-r3
Chainguard spark-3.5-scala-2.12-minimal-openjdk-11 0 3.5.1-r3
Chainguard spark-3.5-scala-2.12-minimal-openjdk-17 0 3.5.1-r3
Chainguard spark-3.5-scala-2.12-minimal-openjdk-8 0 3.5.1-r3
Chainguard spark-3.5-scala-2.12-openjdk-11 0 3.5.1-r3
Chainguard spark-3.5-scala-2.12-openjdk-17 0 3.5.1-r3
Chainguard spark-3.5-scala-2.12-openjdk-8 0 3.5.1-r3
Chainguard spark-3.5-scala-2.13 0 3.5.1-r3
Chainguard spark-3.5-scala-2.13-compat 0 3.5.1-r3
Chainguard spark-3.5-scala-2.13-openjdk-11 0 3.5.1-r3
Chainguard spark-3.5-scala-2.13-openjdk-17 0 3.5.1-r3
Chainguard spark-3.5-scala-2.13-openjdk-8 0 3.5.1-r3
Chainguard stargate 0 1.0.79-r2
Chainguard tez 0 0.10.4-r6
Chainguard trino 0 444-r0
Chainguard trino 0 478-r2
Chainguard trino-config 0 478-r2
Chainguard trino-oci-entrypoint 0 478-r2
Chainguard trino-plugin-ai-functions 0 478-r2
Chainguard trino-plugin-bigquery 0 478-r2
Chainguard trino-plugin-blackhole 0 478-r2
Chainguard trino-plugin-cassandra 0 478-r2
Chainguard trino-plugin-clickhouse 0 478-r2
Chainguard trino-plugin-delta-lake 0 478-r2
Chainguard trino-plugin-druid 0 478-r2
Chainguard trino-plugin-duckdb 0 478-r2
Chainguard trino-plugin-elasticsearch 0 478-r2
Chainguard trino-plugin-exasol 0 478-r2
Chainguard trino-plugin-exchange-filesystem 0 478-r2
Chainguard trino-plugin-exchange-hdfs 0 478-r2
Chainguard trino-plugin-faker 0 478-r2
Chainguard trino-plugin-functions-python 0 478-r2
Chainguard trino-plugin-geospatial 0 478-r2
Chainguard trino-plugin-google-sheets 0 478-r2
Chainguard trino-plugin-hive 0 478-r2
Chainguard trino-plugin-http-event-listener 0 478-r2
Chainguard trino-plugin-hudi 0 478-r2
Chainguard trino-plugin-iceberg 0 478-r2
Chainguard trino-plugin-ignite 0 478-r2
Chainguard trino-plugin-jmx 0 478-r2
Chainguard trino-plugin-kafka 0 478-r2
Chainguard trino-plugin-kafka-event-listener 0 478-r2
Chainguard trino-plugin-lakehouse 0 478-r2
Chainguard trino-plugin-ldap-group-provider 0 478-r2
Chainguard trino-plugin-loki 0 478-r2
Chainguard trino-plugin-mariadb 0 478-r2
Chainguard trino-plugin-memory 0 478-r2
Chainguard trino-plugin-ml 0 478-r2
Chainguard trino-plugin-mongodb 0 478-r2
Chainguard trino-plugin-mysql 0 478-r2
Chainguard trino-plugin-mysql-event-listener 0 478-r2
Chainguard trino-plugin-opa 0 478-r2
Chainguard trino-plugin-openlineage 0 478-r2

Related vulnerabilities