CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



GHSA-43W5-MMXV-CPVH

GHSA-43W5-MMXV-CPVH: Denial of Service via Infinite Loop in Micronaut Data Binding

Alon Barad
Alon Barad
Software Engineer

Mar 17, 2026·6 min read·13 visits

Executive Summary (TL;DR)

A logic flaw in Micronaut's data binder allows unauthenticated attackers to cause an infinite loop by sending out-of-order array indices in form-urlencoded requests, leading to CPU exhaustion and application crashes.

The Micronaut Framework contains a Denial of Service (DoS) vulnerability within its form-urlencoded data binding mechanism. Specifically, the JsonBeanPropertyBinder class improperly handles descending array indices during parameter parsing, leading to an infinite loop and subsequent resource exhaustion. This flaw affects Micronaut 3.x versions prior to 3.10.5 and 4.x versions prior to 4.10.16.

Vulnerability Overview

The Micronaut Framework provides data binding capabilities to automatically map incoming HTTP request parameters to internal Java objects. This functionality simplifies controller logic by transforming raw application/x-www-form-urlencoded payloads into structured data types, including collections like lists and arrays.

The vulnerability resides in the io.micronaut:micronaut-json-core component, specifically within the JsonBeanPropertyBinder class. This class is responsible for expanding internal array structures to accommodate indexed parameters provided in the HTTP request body. When a client submits a payload containing array keys, the framework invokes the expandArrayToThreshold method to allocate sufficient space for the incoming data.

The core issue is a CWE-835 (Loop with Unreachable Exit Condition) vulnerability. The allocation logic relies on an unsafe comparison operator that fails to account for scenarios where the internal array is already larger than the required size. An attacker can exploit this oversight by supplying request parameters with descending indices, thereby triggering an infinite loop.

This flaw allows unauthenticated, remote attackers to degrade service availability. Successful exploitation directly causes CPU exhaustion and memory depletion, ultimately terminating the Java Virtual Machine (JVM) instance hosting the Micronaut application.

Root Cause Analysis

The root cause of this vulnerability is an improper loop termination condition in the expandArrayToThreshold method. The method accepts an arrayIndex integer and an ArrayBuilder object named arrayNode. Its purpose is to pad the arrayNode.values list with null elements until its size reaches arrayIndex + 1.

The original implementation utilized a while loop with a strict inequality check: while (arrayNode.values.size() != arrayIndex + 1). This logic implicitly assumes that arrayNode.values.size() will strictly start at a value less than arrayIndex + 1 and increment by exactly one during each iteration until equality is achieved.

This assumption holds true when clients provide array indices in ascending order (e.g., 0 then 1). However, the HTTP specification does not enforce parameter ordering. If a client provides indices in descending order, the arrayNode.values.size() can be greater than the required arrayIndex + 1 before the loop even begins.

When a lower index is processed after a higher index, the size() != arrayIndex + 1 condition evaluates to true. The loop executes, adding a new null element, which increments the size further away from the target value. The condition remains continuously true, resulting in an infinite loop that indefinitely allocates memory.

Code Analysis

The vulnerable code path is straightforward and localized entirely within the JsonBeanPropertyBinder.java file. The original method implementation exposes the exact unsafe != comparator responsible for the condition evasion.

private void expandArrayToThreshold(int arrayIndex, ArrayBuilder arrayNode) {
    if (arrayIndex < arraySizeThreshold) {
        while (arrayNode.values.size() != arrayIndex + 1) {
            arrayNode.values.add(FixedValue.NULL);
        }
    }
}

The patch addresses the vulnerability by modifying the loop condition to use a less-than (<) operator. This ensures that the loop only executes if the current array size is genuinely smaller than the target size.

--- a/json-core/src/main/java/io/micronaut/json/bind/JsonBeanPropertyBinder.java
+++ b/json-core/src/main/java/io/micronaut/json/bind/JsonBeanPropertyBinder.java
@@ -224,7 +224,7 @@
 
     private void expandArrayToThreshold(int arrayIndex, ArrayBuilder arrayNode) {
         if (arrayIndex < arraySizeThreshold) {
-            while (arrayNode.values.size() != arrayIndex + 1) {
+            while (arrayNode.values.size() < arrayIndex + 1) {
                 arrayNode.values.add(FixedValue.NULL);
             }
         }

By replacing != with <, the method gracefully handles descending indices. If expandArrayToThreshold is called with an arrayIndex of 0 when the arrayNode size is already 2, the condition 2 < 0 + 1 evaluates to false immediately. The loop is bypassed, preventing the infinite execution cycle and memory exhaustion.

Exploitation Mechanism

Exploitation requires the attacker to identify an endpoint that accepts HTTP POST requests with an application/x-www-form-urlencoded body. The target controller method must bind this request body to a Java object containing a collection, such as a List or array property.

The attacker crafts a payload specifying array parameters in descending order. The minimum requirement to trigger the bug is two parameters corresponding to the same array, where the first parameter has an index greater than the second parameter.

POST /poc/book HTTP/1.1
Content-Type: application/x-www-form-urlencoded
 
authors%5B1%5D.name=high&authors%5B0%5D.name=low

When the framework parses authors[1].name=high, it invokes expandArrayToThreshold(1, arrayNode). The arrayNode size increases from 0 to 2. When the framework subsequently parses authors[0].name=low, it invokes expandArrayToThreshold(0, arrayNode).

The loop evaluates 2 != 1 (true) and adds an element. The size becomes 3. The loop evaluates 3 != 1 (true) and adds another element. This sequence continues indefinitely. The request handling thread becomes permanently locked in this method execution.

Impact Assessment

The immediate consequence of this vulnerability is severe CPU exhaustion. The infinite loop operates without any blocking I/O calls or thread yielding, causing the affected thread to consume 100% of the CPU core it occupies. A relatively small number of malicious requests can quickly saturate all available request-processing threads, denying service to legitimate users.

Simultaneously, the infinite loop continuously appends FixedValue.NULL objects to the arrayNode.values list. This results in rapid and unbounded heap memory allocation. The garbage collector cannot reclaim this memory because the list remains actively referenced within the execution scope of the vulnerable method.

The application will inevitably throw a java.lang.OutOfMemoryError (OOM). Depending on the JVM configuration and the hosting environment, an OOM exception typically leads to process termination. In containerized environments like Kubernetes, the pod will fail its liveness probes and be restarted, causing brief but repeated service outages if the attack is sustained.

Remediation and Mitigation

The definitive remediation for this vulnerability is upgrading the Micronaut Framework to a patched version. Development teams must update their dependency manifests to require Micronaut 3.10.5 (for the 3.x release line) or Micronaut 4.10.16 (for the 4.x release line).

For environments where immediate patching is not feasible, network-level mitigation is challenging. Traditional Web Application Firewalls (WAFs) often lack the capability to validate the sequential ordering of array indices within form-urlencoded request bodies. Attempting to write regular expressions to block descending indices is highly prone to bypasses and false positives.

Organizations unable to patch immediately should implement strict rate limiting on endpoints known to bind complex objects from form-urlencoded data. Additionally, monitoring infrastructure should be configured to alert on sudden spikes in CPU utilization correlated with rapid heap growth.

Configuring the JVM with -XX:+HeapDumpOnOutOfMemoryError and -XX:+ExitOnOutOfMemoryError ensures that the application cleanly restarts upon memory exhaustion rather than lingering in a degraded, unstable state.

Official Patches

MicronautFix commit in micronaut-core
MicronautPull request addressing the vulnerability

Fix Analysis (1)

Technical Appendix

CVSS Score
7.5/ 10
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H

Affected Systems

Micronaut Framework 3.xMicronaut Framework 4.xio.micronaut:micronaut-json-core

Affected Versions Detail

Product
Affected Versions
Fixed Version
Micronaut Framework
Micronaut
3.0.0 <= 3.10.43.10.5
Micronaut Framework
Micronaut
4.0.0 <= 4.10.154.10.16
AttributeDetail
Vulnerability TypeDenial of Service (DoS)
CWE IDCWE-835
Attack VectorNetwork (HTTP POST)
ImpactCPU Exhaustion and OutOfMemoryError (Crash)
Authentication RequiredNone
Patched Versions3.10.5, 4.10.16

MITRE ATT&CK Mapping

T1499Endpoint Denial of Service
Impact
T1190Exploit Public-Facing Application
Initial Access
CWE-835
Loop with Unreachable Exit Condition

The program contains an iteration or loop with an exit condition that cannot be reached, i.e., an infinite loop.

Vulnerability Timeline

Fix commit merged into micronaut-core repository
2026-02-25

References & Sources

  • [1]GitHub Advisory GHSA-43W5-MMXV-CPVH
  • [2]Micronaut 3.10.5 Release Notes
  • [3]Micronaut 4.10.16 Release Notes

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•23 minutes ago•GHSA-PW6J-QG29-8W7F
5.9

GHSA-pw6j-qg29-8w7f: State Persistence and Sensitive Credential Leakage in Tornado CurlAsyncHTTPClient

A state persistence vulnerability exists in Tornado's CurlAsyncHTTPClient component where pooled pycurl.Curl handles are reused across asynchronous requests without a complete state reset. Consequently, sensitive per-request configurations, such as client TLS certificates or proxy basic authentication credentials, persist on the shared handle. This behavior leads to subsequent requests leaking these credentials to unauthorized remote servers.

Amit Schendel
Amit Schendel
0 views•7 min read
•about 1 hour ago•CVE-2026-48748
7.5

CVE-2026-48748: Netty HTTP/3 QPACK Blocked Streams Memory Exhaustion

CVE-2026-48748 is a denial-of-service vulnerability in Netty's HTTP/3 codec (netty-codec-http3) occurring when QPACK dynamic tables are enabled but the blocked streams limit is not explicitly configured. A bug in limit checking and a memory leak in stream tracking allow unauthenticated remote attackers to exhaust the JVM heap memory and crash the server.

Amit Schendel
Amit Schendel
2 views•6 min read
•about 1 hour ago•CVE-2026-50009
4.8

CVE-2026-50009: Stateless Reset Token Exposure in Netty QUIC

CVE-2026-50009 is a cryptographic design vulnerability in the Netty network application framework. Prior to version 4.2.15.Final, the framework's QUIC protocol implementation fails to cryptographically segregate the generated Connection IDs and the associated Stateless Reset Tokens. An on-path network attacker who sniffs traffic during a Connection ID rotation can extract secret token material from cleartext headers, enabling them to inject spoofed reset packets and terminate active connections.

Alon Barad
Alon Barad
2 views•6 min read
•about 2 hours ago•CVE-2026-50010
7.5

CVE-2026-50010: Hostname Verification Bypass in Netty TLS Client

A critical hostname verification bypass vulnerability exists in the Netty network application framework when configured as a TLS client. When a developer registers a custom plain X509TrustManager, Netty wraps it inside an X509TrustManagerWrapper to adapt it to the X509ExtendedTrustManager API. However, this wrapper discards the SSLEngine context, bypassing critical hostname checks. Because the wrapper is identified as an X509ExtendedTrustManager, standard cryptographic engines and Netty's OpenSSL wrappers do not re-wrap it, failing to execute any hostname validation. Consequently, clients silently accept certificates for any host, enabling unauthenticated Man-in-the-Middle (MitM) attacks.

Amit Schendel
Amit Schendel
1 views•8 min read
•about 2 hours ago•CVE-2026-50011
7.5

CVE-2026-50011: Unbounded Resource Pre-Allocation in Netty Redis Codec

An uncontrolled resource pre-allocation flaw in the Netty Redis codec module allows remote unauthenticated attackers to cause a denial of service (OutOfMemoryError) by sending a crafted Redis Serialization Protocol (RESP) array header.

Amit Schendel
Amit Schendel
2 views•7 min read
•about 3 hours ago•CVE-2026-50020
5.3

CVE-2026-50020: HTTP Request Smuggling in Netty HttpObjectDecoder via Arbitrary Leading Control Bytes

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.

Alon Barad
Alon Barad
3 views•7 min read