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-R7WM-3CXJ-WFF9

GHSA-R7WM-3CXJ-WFF9: StreamReadConstraints Bypass in jackson-core Async Parser

Alon Barad
Alon Barad
Software Engineer

Jul 22, 2026·6 min read·2 visits

Executive Summary (TL;DR)

An incomplete security fix in Jackson-core allows remote attackers to bypass numeric length limits via slow-drip asynchronous JSON streaming, causing memory exhaustion and Denial of Service.

A critical validation bypass exists in FasterXML jackson-core due to an incomplete fix for GHSA-72hv-8253-57qq. When parsing JSON asynchronously using NonBlockingUtf8JsonParserBase, the StreamReadConstraints.maxNumberLength constraint is bypassed when numeric inputs are received in small, non-terminating chunks. The parser continually accumulates digit-only input in an internal buffer without triggering validation constraints, resulting in potential heap memory exhaustion and application-level Denial of Service.

Vulnerability Overview

The library jackson-core contains a resource consumption vulnerability in its asynchronous, non-blocking parsing implementation. This flaw allows an unauthenticated remote attacker to cause an application-level Denial of Service by bypassing the primary defense mechanism against numeric overflow attacks.

The affected component is NonBlockingUtf8JsonParserBase, which is responsible for parsing JSON payloads asynchronously without blocking execution threads. This parser is commonly used in reactive frameworks such as Spring WebFlux, Vert.x, and Netty. The attack surface is exposed via any reactive endpoint that parses untrusted user JSON inputs using Jackson's asynchronous parsing capabilities.

The vulnerability represents a validation bypass of StreamReadConstraints.maxNumberLength, which restricts the length of numeric values to a default of 1,000 characters. Because the asynchronous parser fails to validate intermediate state lengths during chunk suspensions, the internal text buffer accumulates data up to the maxStringLength threshold. This leads to excessive heap memory allocation and garbage collection thrashing under concurrent load.

Root Cause Analysis

To prevent memory exhaustion, Jackson-core implements StreamReadConstraints which bounds the maximum length of various incoming tokens. When parsing synchronous streams, Jackson validates numeric lengths using the resetInt or resetFloat methods. These methods check constraints against the configured maxNumberLength limit before expanding internal memory structures.

In the original vulnerability GHSA-72hv-8253-57qq, the non-blocking parser bypassed standard validation by completing tokens via a direct call to _valueComplete. The maintainers attempted to patch this by routing state modifications through validation helpers: _setIntLength, _setFractLength, and _setExpLength. These helpers throw a StreamConstraintsException if the accumulated length exceeds the allowed threshold.

The vulnerability GHSA-R7WM-3CXJ-WFF9 arises because the helper validations are only invoked when a number token is complete. In non-blocking parsing, if a data chunk terminates without a numeric delimiter, the parser enters a suspended state. Specifically, when handling MINOR_NUMBER_INTEGER_DIGITS at the end of a buffer, the parser calls _textBuffer.setCurrentLength(outPtr) and yields JsonToken.NOT_AVAILABLE without invoking _setIntLength.

This omission allows an attacker to bypass constraints by transmitting a continuous stream of digits split into multiple small chunks. The parser saves its state, updates the buffer length, and returns to wait for more data without verifying the total accumulated length. The internal character buffer _textBuffer continually expands up to the default string constraint of 20 MiB before any exception is thrown.

Code Analysis

The patch in commit 4cdd529749da396cc7edf6d4a2aad41d47902641 addresses the vulnerability by ensuring that constraint validation occurs during parser suspension states. Prior to this patch, when a buffer boundary was hit, the parser returned NOT_AVAILABLE without validating the accumulated digits.

Below is a comparison of the vulnerable code path versus the patched implementation within NonBlockingUtf8JsonParserBase.java.

// VULNERABLE CODE PATH
if (++_inputPtr >= _inputEnd) {
    _minorState = MINOR_NUMBER_INTEGER_DIGITS;
    _textBuffer.setCurrentLength(outPtr);
    // Missing: No validation check is conducted on outPtr before yielding
    return _updateTokenToNA();
}

The patch introduces the necessary validation calls using _setIntLength before the parser returns to a suspended state. The parameter is adjusted based on whether the number is negative or positive, ensuring precise character length counts are evaluated.

// PATCHED CODE PATH (Commit 4cdd529749da396cc7edf6d4a2aad41d47902641)
if (++_inputPtr >= _inputEnd) {
    _minorState = MINOR_NUMBER_INTEGER_DIGITS;
    _textBuffer.setCurrentLength(outPtr);
    // [core#1556]: validate accumulated integer length so far before yielding
    // NOT_AVAILABLE; otherwise a stream of digit-only chunks can grow the buffer
    _setIntLength(outPtr); 
    return _updateTokenToNA();
}

By invoking _setIntLength(outPtr) at each suspension point, the parser asserts that the accumulated digit count remains within the configured maxNumberLength boundary. If the limit is exceeded during an intermediate chunk state, a StreamConstraintsException is immediately thrown, terminating the connection and freeing the associated resources.

Exploitation Methodology

Exploitation of GHSA-R7WM-3CXJ-WFF9 requires an unauthenticated network path to an endpoint that processes asynchronous JSON payloads. The target application must be configured to utilize Jackson's non-blocking parser. This is typical in reactive microservice architectures utilizing the Spring WebFlux framework.

The attack is executed by initiating an HTTP POST request and streaming the JSON payload slowly over multiple TCP segments or HTTP chunks. The body starts with a standard key-value layout such as {\"v\": followed by an unbroken sequence of numerical digits without any trailing delimiter.

Because the parser suspends state waiting for additional input, it does not validate the total numeric length until a terminating character is found. An attacker can drip small packets containing only digits, inflating memory usage for each active request. Under concurrent execution, sending many such slow-drip streams simultaneously causes rapid heap memory consumption, resulting in high CPU usage due to garbage collection loops and eventual JVM failure.

Impact Assessment

The concrete security impact of this vulnerability is a complete application-level Denial of Service. While the flaw does not facilitate arbitrary code execution or unauthorized access to sensitive data, it permits unauthenticated users to crash target services with minimal bandwidth overhead.

The parent vulnerability, GHSA-72hv-8253-57qq, carries a CVSS v4.0 score of 5.3 (Medium). This rating reflects a localized availability impact. However, because GHSA-R7WM-3CXJ-WFF9 represents a complete validation bypass of the primary defensive boundary, the practical risk is elevated for high-throughput reactive microservices.

A successful attack forces the JVM to allocate large buffers (up to 20 MiB per stream) that cannot be garbage collected while the connection remains active. When multiple requests are processed in parallel, the combined memory footprint triggers an OutOfMemoryError. This results in service unavailability, termination of containerized application pods, and downstream operational disruption.

Remediation and Mitigation

The primary remediation strategy is upgrading the jackson-core dependency to a patched version. For applications operating on the 2.19.x release branch, upgrade to version 2.19.2 or later. For applications utilizing the 2.20.x or 2.21.x branches, upgrade to 2.21.1 or later. If running the 3.x.x pre-release branch, upgrade to 3.1.0.

In environments where immediate dependency upgrades are not feasible, temporary mitigation can be achieved by decreasing the maxStringLength parameter within StreamReadConstraints. Because the unchecked numeric accumulation is capped by the maximum allowed string length, lowering this limit from its default of 20 MiB restricts the worst-case heap allocation per connection.

// Example mitigation by configuring custom StreamReadConstraints
StreamReadConstraints constraints = StreamReadConstraints.builder()
    .maxNumberLength(1000)
    .maxStringLength(50000) // Restricted to limit maximum memory consumption
    .build();
 
JsonFactory factory = JsonFactory.builder()
    .streamReadConstraints(constraints)
    .build();

Additionally, deploying web application firewalls (WAF) or reverse proxies (such as NGINX or HAProxy) configured with strict read timeouts and minimum incoming data rate limits helps block slow-drip attacks. Enforcing a minimum upload rate ensures that client connections streaming data in excessively small chunks are prematurely closed, mitigating resource exhaustion before the payload reaches the application parser.

Official Patches

FasterXMLPull Request #1611 resolving the async suspension length validation bypass

Fix Analysis (2)

Technical Appendix

CVSS Score
5.3/ 10
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N

Affected Systems

Applications utilizing FasterXML jackson-core async parsing on WebFlux/Netty/Vert.x infrastructure

Affected Versions Detail

Product
Affected Versions
Fixed Version
jackson-core (Maven Standard)
FasterXML
>= 2.18.6, < 2.19.22.19.2
jackson-core (Maven Standard)
FasterXML
>= 2.20.0, < 2.21.12.21.1
jackson-core (Maven Tools)
FasterXML
>= 3.0.0, < 3.1.03.1.0
AttributeDetail
CWE IDCWE-770
Attack VectorNetwork
CVSS5.3
EPSS ScoreN/A
ImpactDenial of Service (DoS)
Exploit StatusProof of Concept
KEV StatusNot Listed

MITRE ATT&CK Mapping

T1499Endpoint Denial of Service
Impact
T1190Exploit Public-Facing Application
Initial Access
CWE-770
Allocation of Resources Without Limits or Throttling

The product allocates memory or storage without checking the constraints or sizes of inputs, allowing remote actors to drain memory.

Vulnerability Timeline

Original fix for GHSA-72hv-8253-57qq is committed (PR #1555)
2026-02-22
GHSA-72hv-8253-57qq is officially published in advisory database
2026-02-28
PR #1611 bypass fix is merged and released under GHSA-R7WM-3CXJ-WFF9
2026-05-20

References & Sources

  • [1]GHSA-R7WM-3CXJ-WFF9 Advisory Page
  • [2]Parent Security Advisory GHSA-72hv-8253-57qq
  • [3]Jackson Core Main Project Repository

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

•about 1 hour ago•CVE-2026-20779
7.1

CVE-2026-20779: TOTP Single-Use Enforcement Defect in Gitea

Gitea versions from 1.5.0 before 1.26.3 contain a security vulnerability in their multi-factor authentication (MFA) logic. This vulnerability allows valid TOTP codes to be accepted multiple times across web authentication flows and the Basic Auth X-Gitea-OTP header path. Due to a TOCTOU race condition and a lack of state tracking in programmatic auth pathways, attackers with valid credentials can replay single-use OTP codes.

Amit Schendel
Amit Schendel
0 views•6 min read
•about 3 hours ago•GHSA-2RP8-MM9Q-FP49
8.0

GHSA-2RP8-MM9Q-FP49: Remote Code Execution via Template-Literal Code Injection in TypeORM migration:generate

A critical second-order code injection vulnerability exists in the migration generation engine of TypeORM. When TypeORM introspects a database schema to automatically generate migration files, it writes schema metadata directly into JavaScript/TypeScript migration files inside ES2015 template literals. Because the generator failed to sanitize template literal string interpolation markers and backslashes, attackers with control over database metadata can execute arbitrary code on the developer environment or within a CI/CD pipeline.

Amit Schendel
Amit Schendel
3 views•5 min read
•about 4 hours ago•GHSA-9WJQ-CP2P-HRGF
4.7

GHSA-9WJQ-CP2P-HRGF: SVG href Attribute Bypass in Loofah HTML/XML Sanitizer

A security logic flaw in Loofah, a Ruby HTML/XML sanitization library, allowed unauthenticated attackers to bypass local-reference restrictions on SVG elements. Prior to version 2.25.2, Loofah only sanitized the legacy namespaced "xlink:href" attribute when enforcing local URI fragments on SVG elements like "<use>". It did not validate or sanitize the plain, non-namespaced "href" attribute introduced in the SVG 2 standard. This structural omission allowed attackers to construct SVG elements referencing external domains, paving the way for arbitrary resource loading and cross-site scripting (XSS).

Alon Barad
Alon Barad
4 views•5 min read
•about 5 hours ago•GHSA-5QHF-9PHG-95M2
8.8

GHSA-5QHF-9PHG-95M2: Stored Cross-Site Scripting via Parser Differential in Loofah allowed_uri?

A critical HTML sanitization bypass vulnerability in the Ruby library Loofah allows unauthenticated remote attackers to execute Stored Cross-Site Scripting (XSS) attacks. By using semicolon-less numeric character references (NCRs) to encode protocol characters, attackers can evade backend URI verification filters while ensuring the malicious protocol is successfully decoded and executed by client-side web browsers.

Amit Schendel
Amit Schendel
6 views•9 min read
•about 6 hours ago•GHSA-HRXH-6V49-42GF
8.6

GHSA-HRXH-6V49-42GF: HTTP/2 Control Buffer Flooding and xDS RBAC Parsing Weaknesses in gRPC-Go

GHSA-HRXH-6V49-42GF is a critical security advisory addressing two distinct vulnerabilities within gRPC-Go: an HTTP/2 Control Buffer Flooding weakness that allows unauthenticated denial of service, and xDS Role-Based Access Control parser weaknesses that lead to authorization bypasses and application panics.

Alon Barad
Alon Barad
8 views•8 min read
•about 7 hours ago•GHSA-9MQV-5HH9-4CGG
7.5

GHSA-9MQV-5HH9-4CGG: Unauthenticated Memory-Leak Denial of Service in @hono/node-server WebSocket Handshake Parser

An unauthenticated memory-leak Denial of Service (DoS) vulnerability exists in the Node.js Adapter for Hono (@hono/node-server) during the WebSocket handshake upgrade process. If a client initiates a WebSocket upgrade but the process is aborted or fails, resources are permanently retained in memory, leading to heap exhaustion.

Alon Barad
Alon Barad
6 views•6 min read