Description
NumberInput.looksLikeValidNumber() in FasterXML jackson-core pre-validates "stringified numbers" with two regular expressions: PATTERN_FLOAT ([+-]?[0-9]*[\.]?[0-9]+([eE][+-]?[0-9]+)?), present since 2.17.0, and PATTERN_FLOAT_TRAILING_DOT, added in 2.17.2. PATTERN_FLOAT places adjacent quantifiers over the same character class -- an optional [0-9]* run, an optional dot, then a required [0-9]+ run -- so input that ultimately fails to match forces Java's backtracking engine to retry every possible split point of the digit run. 



Matching cost therefore grows with the square of the input length. 



An attacker who can supply JSON that an application deserializes into a numeric target type reaches this method through jackson-databind's default String-to-number coercion (StdDeserializer and NumberDeserializers for BigDecimal, BigInteger, Double and Float). 



Because StreamReadConstraints.maxStringLength defaults to 20,000,000 characters, no constraint bounds the input before it reaches the regex. 



Testing by the reporter confirmed O(n^2) growth across five consecutive input-size doublings, with a single 160,000-character string consuming roughly 74 seconds in one call; a small number of concurrent requests of ordinary body size can therefore exhaust a server's request-handling thread pool. 



The affected method does not exist before 2.17.0, so 2.16.x and earlier releases are not affected. 



The fix replaces both regular expressions with a hand-rolled single-pass scan.
Published: 2026-09-22
Score: 7.5 High
EPSS: n/a
KEV: No
Impact: Denial of Service via Regular Expression ReDoS
Action: Upgrade
AI Analysis

Impact

NumberInput.looksLikeValidNumber() in jackson-core validates stringized numeric values using two regular expressions that contain adjacent optional and required quantifiers. When a string does not match, Java’s regex engine backtracks through every possible split point of the digit run, causing quadratic runtime cost in the length of the token. This can be exploited by an attacker who sends a very long string that is coerced to a numeric type during JSON deserialization, consuming significant CPU time and exhausting a server’s request‑handling threads. The weakness is classified as CWE‑1333 (Regular Expression Denial of Service) and CWE‑400 (Uncontrolled Resource Consumption).

Affected Systems

Affected systems include any application that incorporates FasterXML jackson‑core versions from 2.17.0 up through the 2.20.x and 3.0.x lines that have not received the fix. The vulnerability is present in the two PATTERN_FLOAT regular expressions used by NumberInput.looksLikeValidNumber(); earlier releases prior to 2.17.0 are unaffected. Because the default StreamReadConstraints.maxStringLength is 20 000 000 characters, there is no size limitation imposed before the string reaches the regex, allowing malicious payloads of arbitrarily large length.

Risk and Exploitability

The CVSS base score is 7.5, indicating high severity. The EPSS score is not available, so the likelihood of exploitation cannot be quantified, and the vulnerability is not listed in the CISA KEV catalog, suggesting no known public exploits at this time. The likely attack vector is an application that deserializes JSON containing large numeric strings and coerces them to a numeric target type via jackson-databind. Attackers could send dozens of such payloads concurrently to tie up server threads and cause a denial of service.

Generated by OpenCVE AI on September 22, 2026 at 17:44 UTC.

Remediation

Vendor Solution

Upgrade to com.fasterxml.jackson.core:jackson-core 2.18.11, 2.21.7 or 2.22.3, or to tools.jackson.core:jackson-core 3.1.7 or 3.2.2. The 2.17.x, 2.19.x, 2.20.x and 3.0.x lines received no fix on their own branch and are no longer maintained upstream; consumers of those lines must move forward to a maintained release.


Vendor Workaround

Until upgrading, lower StreamReadConstraints.maxStringLength well below its default of 20,000,000 characters so that oversized string tokens are rejected before number coercion, and apply wall-clock timeouts to parse and coercion operations. Because matching cost is quadratic in token length, a tight length bound substantially reduces worst-case cost. These are mitigations, not a complete fix.


OpenCVE Recommended Actions

  • Apply the latest fixed version of jackson‑core: upgrade to 2.18.11, 2.21.7, 2.22.3 or to tools.jackson.core:jackson-core 3.1.7 or newer.
  • If immediate upgrade is not possible, configure StreamReadConstraints.maxStringLength to a tight value – for example a few thousand characters – so that oversized tokens are rejected before the regex is executed.
  • Set application or infrastructure‑level wall‑clock timeouts on JSON parsing and coercion operations to prevent long‑running evaluations from tying up request threads.

Generated by OpenCVE AI on September 22, 2026 at 17:44 UTC.

Tracking

Sign in to view the affected projects.

Advisories

No advisories yet.

History

Tue, 22 Sep 2026 17:30:00 +0000

Type Values Removed Values Added
First Time appeared Fasterxml
Fasterxml jackson-core
Vendors & Products Fasterxml
Fasterxml jackson-core
Metrics ssvc

{'options': {'Automatable': 'yes', 'Exploitation': 'poc', 'Technical Impact': 'partial'}, 'version': '2.0.3'}


Tue, 22 Sep 2026 15:00:00 +0000

Type Values Removed Values Added
Description NumberInput.looksLikeValidNumber() in FasterXML jackson-core pre-validates "stringified numbers" with two regular expressions: PATTERN_FLOAT ([+-]?[0-9]*[\.]?[0-9]+([eE][+-]?[0-9]+)?), present since 2.17.0, and PATTERN_FLOAT_TRAILING_DOT, added in 2.17.2. PATTERN_FLOAT places adjacent quantifiers over the same character class -- an optional [0-9]* run, an optional dot, then a required [0-9]+ run -- so input that ultimately fails to match forces Java's backtracking engine to retry every possible split point of the digit run.  Matching cost therefore grows with the square of the input length.  An attacker who can supply JSON that an application deserializes into a numeric target type reaches this method through jackson-databind's default String-to-number coercion (StdDeserializer and NumberDeserializers for BigDecimal, BigInteger, Double and Float).  Because StreamReadConstraints.maxStringLength defaults to 20,000,000 characters, no constraint bounds the input before it reaches the regex.  Testing by the reporter confirmed O(n^2) growth across five consecutive input-size doublings, with a single 160,000-character string consuming roughly 74 seconds in one call; a small number of concurrent requests of ordinary body size can therefore exhaust a server's request-handling thread pool.  The affected method does not exist before 2.17.0, so 2.16.x and earlier releases are not affected.  The fix replaces both regular expressions with a hand-rolled single-pass scan.
Title jackson-core: quadratic backtracking in NumberInput.PATTERN_FLOAT via looksLikeValidNumber() enables ReDoS
Weaknesses CWE-1333
CWE-400
References
Metrics cvssV3_1

{'score': 7.5, 'vector': 'CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H'}


Subscriptions

Fasterxml Jackson-core
cve-icon MITRE

Status: PUBLISHED

Assigner: HeroDevs

Published:

Updated: 2026-09-22T15:52:44.881Z

Reserved: 2026-09-11T16:07:58.141Z

Link: CVE-2026-89407

cve-icon Vulnrichment

Updated: 2026-09-22T15:52:32.473Z

cve-icon NVD

Status : Deferred

Published: 2026-09-22T15:17:21.053

Modified: 2026-09-22T20:00:03.713

Link: CVE-2026-89407

cve-icon Redhat

No data.

cve-icon OpenCVE Enrichment

Updated: 2026-09-22T17:45:17Z

Weaknesses
  • CWE-1333

    Inefficient Regular Expression Complexity

  • CWE-400

    Uncontrolled Resource Consumption