Skip to main content
Vulnerability Database/CVE-2026-91777

CVE-2026-91777: FasterXML jackson-databind DOS Vulnerability

CVE-2026-91777 is a denial of service flaw in FasterXML jackson-databind causing quadratic CPU work during deserialization of identity-enabled collections. This post explains its impact, affected versions, and mitigation steps.

Published:

CVE-2026-91777 Overview

CVE-2026-91777 is an algorithmic complexity vulnerability in FasterXML jackson-databind affecting forward-reference completion for @JsonIdentityInfo object IDs. The flaw resides in CollectionDeserializer.CollectionReferringAccumulator.resolveForwardReference() and the equivalent path in MapDeserializer. When a JSON document creates unresolved object-ID references in an identity-enabled collection or map and then defines those IDs in reverse order, the deserializer performs a linear scan of the pending-reference accumulator for every resolved ID. This produces quadratic CPU work relative to input size, enabling denial of service through modestly sized JSON payloads.

Critical Impact

Attacker-influenced JSON deserialized into an identity-enabled collection or map triggers O(N²) CPU consumption, exhausting server resources without deep nesting or unusual syntax.

Affected Products

  • FasterXML jackson-databind (versions using the vulnerable CollectionReferringAccumulator and MapDeserializer forward-reference paths)
  • Java applications deserializing untrusted JSON into @JsonIdentityInfo-enabled collections or maps
  • Downstream libraries and frameworks bundling the affected jackson-databind versions

Discovery Timeline

  • 2026-09-23 - CVE-2026-91777 published to the National Vulnerability Database (NVD)
  • 2026-09-23 - Last updated in NVD database

Technical Details for CVE-2026-91777

Vulnerability Analysis

The vulnerability is an algorithmic complexity flaw classified under [CWE-400] Uncontrolled Resource Consumption. Jackson's @JsonIdentityInfo feature allows objects to be referenced by an identifier before their definition appears in the JSON stream. Unresolved references accumulate in a pending-reference list until the target ID is parsed. When a target ID resolves, the deserializer walks the accumulator linearly and calls equals() on each entry's ID.

If a document produces N unresolved references and then resolves them in reverse order, each resolution scans a shrinking list, but the total identity comparisons grow as N * (N + 1) / 2. The reporter instrumented the ID class and measured exactly 2,003,000 equals() calls at N = 2,000, compared to zero comparisons in a control input where every reference was already resolved. The input requires no deep nesting and no malformed JSON, which makes payload construction trivial for an attacker.

Root Cause

The root cause is the use of a linear data structure for the pending-reference accumulator combined with per-resolution linear scans. Neither CollectionReferringAccumulator.resolveForwardReference() nor the MapDeserializer equivalent indexes pending references by ID. Every resolution therefore incurs O(N) work, and adversarial ordering forces the worst case on every resolved ID.

Attack Vector

Exploitation requires an application that deserializes attacker-influenced JSON into an identity-enabled collection or map. The attack vector is network-based and requires no authentication or user interaction. An attacker submits a shallow, syntactically ordinary JSON document containing N forward references followed by N target objects in reverse order. CPU utilization on the deserializing thread scales quadratically with N, degrading or halting service availability.

No verified proof-of-concept code is published. Refer to GitHub Issue #6204 and GHSA-cxp5-3px4-pw24 for the reporter's instrumentation details.

Detection Methods for CVE-2026-91777

Indicators of Compromise

  • Sustained single-thread CPU saturation on JVM processes handling JSON deserialization endpoints
  • Request latency growth that correlates with payload size rather than nesting depth
  • Thread dumps showing extended time in CollectionReferringAccumulator.resolveForwardReference() or MapDeserializer forward-reference paths
  • Repeated inbound JSON payloads containing many @id / @ref pairs with references preceding definitions

Detection Strategies

  • Enable JVM profiling or async-profiler sampling on deserialization services and alert on hot frames inside jackson-databind referring-accumulator code
  • Add application-layer request size and parsing-time budgets, logging any deserialization exceeding the budget
  • Inspect API gateway logs for JSON bodies with disproportionate identity-reference density relative to object count

Monitoring Recommendations

  • Instrument deserialization endpoints with per-request CPU time metrics and alert on quadratic growth patterns
  • Track jackson-databind version inventory across build manifests using software composition analysis
  • Correlate CPU spikes with request payloads to identify candidate exploitation attempts

How to Mitigate CVE-2026-91777

Immediate Actions Required

  • Upgrade jackson-databind to the fixed release identified in GHSA-cxp5-3px4-pw24
  • Audit application code for @JsonIdentityInfo usage on collections and maps that deserialize external input
  • Enforce strict maximum request body sizes on endpoints that accept JSON
  • Apply request timeouts and per-thread CPU budgets on deserialization workers

Patch Information

The upstream fix replaces the linear pending-reference lookup with a keyed pending-reference structure, reducing forward-reference resolution to expected O(1) per ID. Apply the fixed jackson-databind version referenced in the vendor advisory and rebuild dependent artifacts. Refer to GitHub Issue #6204 for the technical fix discussion.

Workarounds

  • Disable @JsonIdentityInfo on types that deserialize untrusted input where the feature is not required
  • Front deserialization endpoints with a reverse proxy that caps JSON body size and array element counts
  • Route deserialization onto bounded thread pools with aggressive timeouts to contain CPU exhaustion
  • Validate incoming JSON with a schema that rejects unbounded arrays of identity references
bash
# Configuration example
# Refer to vendor advisory GHSA-cxp5-3px4-pw24 for the fixed version identifier
# Example Maven dependency pin (replace VERSION with the patched release):
# <dependency>
#   <groupId>com.fasterxml.jackson.core</groupId>
#   <artifactId>jackson-databind</artifactId>
#   <version>VERSION</version>
# </dependency>

Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.

Experience the Most Advanced Cybersecurity Platform

See how the world’s most intelligent, autonomous cybersecurity platform can protect your organization today and into the future.