Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
jackson — Ce dépôt fournit une correction de sécurité complète des vulnérabilités de déni de service et d'allocation de ressources sans limites ou limitation signalées dans CVE-2025-52999, GHSA-2m67-wjpj-xhg9 et sonatype-2022-6438 tout en maintenant une compatibilité totale avec jackson‑core 2.13.5. | Kitploit
Outils/GitHubGitHub/sassoftware/jackson
Utilitaires GénérauxAnalyse StatiqueAnalyse des VulnérabilitésAnalyse de CodeSécurité de la Chaîne Logistique
GitHubsassoftware/jackson

jackson

Voir le dépôt
111il y a 5 moisPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →

À propos

Ce dépôt fournit une correction de sécurité complète des vulnérabilités de déni de service et d'allocation de ressources sans limites ou limitation signalées dans CVE-2025-52999, GHSA-2m67-wjpj-xhg9 et sonatype-2022-6438 tout en maintenant une compatibilité totale avec jackson‑core 2.13.5.

Partager

Analyse et correction des vulnérabilités de sécurité dans Jackson core 2.13.5

  • CVE-2025-52999
  • SNYK-JAVA-COMFASTERXMLJACKSONCORE-15365924
  • SNYK-JAVA-COMFASTERXMLJACKSONCORE-15907551 (GHSA-2m67-wjpj-xhg9)
  • SNYK-JAVA-COMFASTERXMLJACKSONCORE-7569538 (Sonatype-2022-6438)

Cette branche (2.13.5-CVE-2025-52999-sonatype-2022-6438-GHSA-2m67-wjpj-xhg9) contient une correction de sécurité complète des vulnérabilités de déni de service (DoS) et d'allocation de ressources sans limites ou sans limitation ciblant jackson-core 2.13.5. Elle introduit l'API StreamReadConstraints — alignée avec l'API introduite dans jackson-core 2.15.0 mais étendue avec une couverture de parseur plus large et des protections supplémentaires contre les vecteurs d'attaque — en corrigeant une attaque par épuisement de la profondeur d'imbrication (CVE-2025-52999), une allocation de ressources sans limites ou sans limitation (SNYK-JAVA-COMFASTERXMLJACKSONCORE-15365924), un contournement de la contrainte de longueur de document (SNYK-JAVA-COMFASTERXMLJACKSONCORE-15907551 / GHSA-2m67-wjpj-xhg9) et une attaque par épuisement de la longueur des jetons numériques (Sonatype-2022-6438), tout en restant compatible avec la surface de l'API publique de jackson-core version 2.13.5.

Historique des branches

BrancheVulnérabilités corrigées
2.13.5-CVE-2025-52999-sonatype-2022-6438CVE-2025-52999, Sonatype-2022-6438, SNYK-JAVA-COMFASTERXMLJACKSONCORE-15365924
2.13.5-CVE-2025-52999-sonatype-2022-6438-GHSA-2m67-wjpj-xhg9Toutes les précédentes + GHSA-2m67-wjpj-xhg9 (contournement de la contrainte de longueur de document)

La branche originale (2.13.5-CVE-2025-52999-sonatype-2022-6438) corrige trois vulnérabilités et est conservée sur le dépôt distant sasso. Cette branche l'étend avec la correction supplémentaire de GHSA-2m67-wjpj-xhg9, qui applique maxDocumentLength sur tous les chemins de parseur.


Aperçu des vulnérabilités

IDTypeGravitéCVSSCorrectif en amont
CVE-2025-52999Déni de service — profondeur d'imbrication illimitéeÉlevée7.5 (AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H)jackson-core 2.15.0
Sonatype-2022-6438 / SNYK-JAVA-COMFASTERXMLJACKSONCORE-7569538Déni de service — longueur de jeton numérique illimitéeÉlevée7.5 (AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H)jackson-core 2.15.0
SNYK-JAVA-COMFASTERXMLJACKSONCORE-15365924Allocation de ressources sans limites ou sans limitationÉlevée8.7 (AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H)jackson-core 2.18.6, 2.21.1 ou supérieur.
SNYK-JAVA-COMFASTERXMLJACKSONCORE-15907551 / GHSA-2m67-wjpj-xhg9Allocation de ressources sans limites ou sans limitation — contournement de la contrainte de longueur de documentÉlevée8.7 (AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H)jackson-core 2.18.7, 2.21.2 ou supérieur.

Versions concernées et corrigées

VersionCVE-2025-52999Sonatype-2022-6438 / SNYK-JAVA-COMFASTERXMLJACKSONCORE-7569538SNYK-JAVA-COMFASTERXMLJACKSONCORE-15365924SNYK-JAVA-COMFASTERXMLJACKSONCORE-15907551
2.13.5VulnérableVulnérableVulnérableVulnérable
2.13.5-CVE-2025-52999-sonatype-2022-6438CorrigéCorrigéCorrigéVulnérable
2.13.5-CVE-2025-52999-sonatype-2022-6438-GHSA-2m67-wjpj-xhg9CorrigéCorrigéCorrigéCorrigé
2.14.xVulnérableVulnérableVulnérableVulnérable
2.15.xCorrigéCorrigéVulnérableVulnérable
2.16.xCorrigéCorrigéVulnérableVulnérable
2.17.xCorrigéCorrigéVulnérableVulnérable
2.18.6+CorrigéCorrigéCorrigéVulnérable
2.18.7+CorrigéCorrigéCorrigéCorrigé
2.21.1+CorrigéCorrigéCorrigéVulnérable
2.21.2+CorrigéCorrigéCorrigéCorrigé

Description des vulnérabilités

CVE-2025-52999 — Profondeur d'imbrication JSON illimitée

Entrée NVD

ChampValeur
Identifiant CVECVE-2025-52999
Publié2025-06-25
Dernière modification2025-06-26
Source (CNA)GitHub, Inc.
Score CVSS v4.08.7 ÉLEVÉ — CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N
CWECWE-121 — Débordement de tampon basé sur la pile (Stack-based Buffer Overflow)
Avis GitHubGHSA-h46c-h94j-95f3
Correctif PR en amontjackson-core#943

Description officielle NVD

jackson-core contient les abstractions de base de bas niveau du processeur incrémental (« streaming ») pour l'analyse et la génération utilisées par Jackson Data Processor. Dans les versions antérieures à 2.15.0, si un utilisateur analyse un fichier d'entrée et que celui-ci contient des données profondément imbriquées, Jackson peut finir par générer une StackOverflowError si la profondeur est particulièrement grande. jackson-core 2.15.0 inclut une limite configurable pour la profondeur jusqu'à laquelle Jackson parcourra un document d'entrée, avec une valeur par défaut de 1 000. jackson-core lèvera une StreamConstraintsException si la limite est atteinte. jackson-databind bénéficie également de ce changement car il utilise jackson-core pour analyser les entrées JSON. En guise de contournement, les utilisateurs devraient éviter d'analyser des fichiers d'entrée provenant de sources non fiables.

Contournement : éviter d'analyser des entrées JSON provenant de sources non fiables jusqu'à ce que la version corrigée soit déployée.


Cause racine : Avant la version 2.15.0, JsonParser n'imposait aucune limite sur la profondeur d'imbrication possible d'un document JSON. Chaque jeton de tableau [ ou d'objet { provoquait l'appel de JsonReadContext.createChildArrayContext() / createChildObjectContext(), allouant un nouveau nœud de contexte sur le tas et incrémentant une chaîne de références. Un attaquant peut créer un document avec des dizaines de milliers de niveaux d'imbrication, ce qui fait que la machine virtuelle Java épuise la pile de son thread ou la mémoire du tas.

Chemin de code vulnérable :

Le même contrôle manquant est atteint via chacune des quatre implémentations de parseur :``` JsonParser.nextToken() // common entry point │ ├─ ReaderBasedJsonParser → _parsePunctuationMark() ├─ UTF8StreamJsonParser → _parsePunctuationMark() ├─ UTF8DataInputJsonParser → _parsePunctuationMark() └─ NonBlockingJsonParserBase → _startArrayScope() / _startObjectScope() │ ▼ _parsingContext.createChildArrayContext() // '[' encountered _parsingContext.createChildObjectContext() // '{' encountered ⚠ no depth check — context chain grows without bound

root@kitploit:~
Toutes les quatre implémentations de `JsonParser` partagent cette faille. L'attaque est également exploitable via
n'importe laquelle d'entre elles — que l'entrée arrive via `InputStream`, `Reader`, `DataInput` ou l'API
non-bloquante 'feeder' asynchrone.

**Vecteurs d'attaque :**

| # | Stratégie | Exemple de charge utile | Incrément de profondeur | Analyseurs affectés |
|---|-----------|------------------------|-------------------------|---------------------|
| 1 | Imbrication de tableaux | `[[[…]]]` — 1 001 jetons `[` consécutifs | +1 par `[` | Les quatre |
| 2 | Imbrication d'objets | `{"k":{"k":{…}}}` — 1 001 jetons `{` consécutifs | +1 par `{` | Les quatre |
| 3 | Imbrication alternée | `[{"k":[{"k":…}]}]` — 1 001 jetons `[`/`{` mélangés | +1 par `[` ou `{` | Les quatre |

Observations clés :

- **Imbrication de tableaux — surcharge minimale :** seuls les jetons `[` et `]` sont nécessaires ; aucune clé, valeur ou espace blanc. Une charge utile de 2 002 octets de 1 001 paires de crochets suffit pour dépasser la limite par défaut de 1 000.
- **Imbrication d'objets — pression mémoire amplifiée :** chaque `{` alloue en plus un emplacement de clé `JsonReadContext` en plus du nœud de chaîne de profondeur, ce qui aggrave la consommation mémoire à des profondeurs extrêmes.
- **Imbrication alternée — contournement du pare-feu d'applications Web (WAF) :** les défenses basées sur la reconnaissance de motifs qui détectent les séquences répétées `[[[` ou `{{{` sont aveugles à l'imbrication alternée de jetons ; le compteur de profondeur de l'analyseur s'incrémente à l'identique quel que soit le type de jeton.
- **'Feeder' non-bloquant — même charge utile, surface de livraison distincte :** les trois stratégies d'imbrication sont également exploitables via `NonBlockingJsonParser` et l'API `ByteArrayFeeder`. Le document peut être livré en morceaux arbitrairement petits ; `NonBlockingJsonParserBase._startArrayScope()` / `_startObjectScope()` incrémente le compteur de profondeur à chaque jeton d'ouverture de contexte, quelle que soit la manière dont les octets arrivent, accumulant la profondeur sur plusieurs appels à `feedInput()`.

Les trois stratégies d'imbrication sont accessibles via n'importe laquelle des quatre implémentations de `JsonParser`.
Avec la version 2.13.5, l'analyse réussit silencieusement ; avec cette correction, les trois vecteurs lèvent
`StreamConstraintsException: Depth (1001) exceeds the maximum allowed nesting depth (1000)`.

---

### Sonatype-2022-6438 — Longueur illimitée des jetons numériques

**Détails de sécurité**

| Champ | Valeur |
|-------|--------|
| ID Sonatype | [sonatype-2022-6438](https://guide.sonatype.com/vulnerability/sonatype-2022-6438/security-details) |
| Description | jackson-core — Déni de service (DoS) |
| Publié le | 2022-12-07 |
| Source | Sonatype |
| Score CVSS v3.1 | **7.5 HIGH** — `CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H` |
| CWE | [CWE-770](https://cwe.mitre.org/data/definitions/770.html) — Allocation de ressources sans limites ni régulation |
| Score EPSS | 0% |
| Correctifs en amont | [jackson-core#827](https://github.com/FasterXML/jackson-core/pull/827), [jackson-core#846](https://github.com/FasterXML/jackson-core/pull/846) |

**Méthodes vulnérables (telles qu'identifiées par Sonatype)**

| Méthode | Notes |
|---------|-------|
| `com.fasterxml.jackson.core.base.ParserBase._parseSlowInt(I)V` | Paramètre vulnérable : index 0 |
| `com.fasterxml.jackson.core.base.ParserBase.convertNumberToBigDecimal()V` | |
| `com.fasterxml.jackson.core.base.ParserMinimalBase.getValueAsDouble(D)D` | Paramètre vulnérable : index 0 |
| `com.fasterxml.jackson.core.util.TextBuffer.contentsAsDecimal()` | Retourne `BigDecimal` |
| `com.fasterxml.jackson.core.util.TextBuffer.contentsAsDouble(Z)D` | |
| `com.fasterxml.jackson.core.util.TextBuffer.contentsAsFloat(Z)F` | |

Chacune de ces méthodes traite le tampon de chiffres bruts sans d'abord valider sa longueur. Passer un
jeton numérique suffisamment long déclenche une allocation de tas illimitée et une épuisement du processeur lorsque la JVM
tente d'instancier un `BigInteger` ou un `BigDecimal` à partir du contenu non contraint du tampon.

---

**Cause racine :** Avant la version 2.15.0, `JsonParser` n'imposait aucune limite sur la longueur en octets des jetons entiers, en notation scientifique, à virgule flottante simple ou composée. Lorsqu'un analyseur alloue son `_textBuffer` interne pour accumuler les chiffres, un
attaquant peut fournir un nombre avec des millions de chiffres, ce qui fait croître le tampon sans limite et
finit par épuiser la mémoire de tas.

**Chemins de code vulnérables :**

Il existe deux chemins vulnérables structurellement distincts — l'un partagé par les trois analyseurs synchrones,
et un second chemin indépendant via l'analyseur asynchrone.

**Chemin A — analyseurs synchrones** (trois implémentations, un seul point d'arrivée commun) :```
JsonParser.nextToken()                         // common entry point
  │
  ├─ ReaderBasedJsonParser   ─┐
  ├─ UTF8StreamJsonParser     ├─→ ParserBase.resetInt() / resetFloat()
  └─ UTF8DataInputJsonParser ─┘         │
                                        ▼
                               _textBuffer.contentsAsString()
                               ⚠  no length check — buffer grows without bound

Chemin B — analyseur asynchrone (chemin de code indépendant, non protégé séparément) :``` NonBlockingJsonParser.nextToken() │ ├─ _startPositiveNumber() / _startNegativeNumber() // integer paths ├─ _finishNumberIntegralPart() ├─ _startFloat() // floating-point paths ├─ _finishFloatFraction() └─ _finishFloatExponent() │ ▼ writes _intLength / _fractLength / _expLength directly ⚠ never calls ParserBase.resetInt() / resetFloat() ⚠ constraint validation bypassed entirely

root@kitploit:~
Le parseur non bloquant (asynchrone) représente une surface d'attaque particulièrement notable : il contient ses propres boucles d'accumulation de chiffres dans `_startPositiveNumber`, `_startNegativeNumber`, `_finishNumberIntegralPart`, `_startFloat`, `_finishFloatFraction` et `_finishFloatExponent` qui définissent `_intLength` / `_fractLength` / `_expLength` directement sans jamais passer par `ParserBase.resetInt()` ou `resetFloat()`. Cela signifie que le correctif du PR #827 en amont (qui ajoutait une validation uniquement dans `ParserBase`) **a laissé `NonBlockingJsonParser` complètement sans protection**. Cela a été découvert lors d'une analyse étendue de la surface d'attaque et corrigé dans cette branche.

**Vecteurs d'attaque :**

| # | Forme du jeton | Exemple de charge utile | `intLen` | `fractLen` | `expLen` | Total | Contrainte |
|---|----------------|-------------------------|----------|------------|----------|-------|------------|
| 1 | Entier | `999…` — 199 999 chiffres consécutifs | 199 999 | 0 | 0 | 199 999 | `validateIntegerLength` |
| 2 | Fraction décimale | `0.999…` — entier à 1 chiffre, fraction à 1 001 chiffres | 1 | 1 001 | 0 | 1 002 | `validateFPLength` |
| 3 | Notation scientifique | `1e999…` — significande à 1 chiffre, exposant à 1 001 chiffres | 1 | 0 | 1 001 | 1 002 | `validateFPLength` |
| 4 | Virgule flottante composée | `0.999…e999…` — fraction à 500 chiffres, exposant à 500 chiffres | 1 | 500 | 500 | 1 001 | `validateFPLength` |

Observations clés :

- **Entier — le signe n'est pas un chiffre :** le `-` initial est exclu de l'accumulation des chiffres ; `-999…` et `999…` produisent des valeurs `intLen` identiques et déclenchent la contrainte au même seuil.
- **Fraction décimale — entier court, fraction illimitée :** la partie entière peut être un seul chiffre (0) tandis que la partie fractionnaire croît sans limite ; le point décimal lui-même est exclu du comptage.
- **Notation scientifique — compacte mais catastrophique :** avec environ 1 004 octets, c'est la charge utile la plus petite et la plus efficace ; elle force l'instanciation d'un `BigDecimal` avec une échelle de ±10^1001, demandant une allocation intermédiaire en tas illimitée malgré la petite taille du jeton.
- **Virgule flottante composée — contournement par division des limites :** avec `fractLen = 500` et `expLen = 500`, aucun composant n'atteint individuellement le seuil des 1 000 chiffres. La vérification unifiée `validateFPLength(intLen + fractLen + expLen)` est la seule défense qui comble cette lacune.
- **Parseur non bloquant — contournement indépendant :** les quatre formes de jetons ci-dessus sont exploitable indépendamment via `NonBlockingJsonParser` via `ByteArrayFeeder`. Contrairement aux parseurs synchrones, `NonBlockingJsonParser` accumule les chiffres dans des boucles privées (`_startPositiveNumber`, `_finishNumberIntegralPart`, `_startFloat`, `_finishFloatFraction`, `_finishFloatExponent`) qui écrivent directement `_intLength` / `_fractLength` / `_expLength`, contournant entièrement `ParserBase.resetInt()` et `resetFloat()`. Le PR #827 en amont — qui n'avait modifié que `ParserBase` — a donc laissé ce parseur totalement sans protection, nécessitant six correctifs distincts sur les sites d'appel dans cette correction.

Les quatre formes de jetons et le contournement du parseur non bloquant sont rejetés au moment de la tokenisation — avant que tout `BigDecimal` ou `BigInteger` ne soit construit — par `validateIntegerLength` et `validateFPLength` dans `ParserBase` (parseurs synchrones) et sur six sites d'appel dédiés dans `NonBlockingJsonParser` (parseur asynchrone). Avec la version 2.13.5, les quatre formes de jetons sont acceptées silencieusement ; avec cette correction, chaque parseur lève `StreamConstraintsException: Number length (N) exceeds the maximum length (1000)`.

> **Remarque sur `UTF8DataInputJsonParser` avec des charges utiles volumineuses :** Le parseur DataInput a une limite de tampon interne préexistante de 65 536 octets ([jackson-core#493](https://github.com/FasterXML/jackson-core/issues/493)). Les documents dépassant cette taille (par exemple, charges utiles de 199 999 chiffres ≈ 200 Ko) déclenchent une `ArrayIndexOutOfBoundsException` avant que la contrainte de longueur puisse s'appliquer. La protection de la longueur numérique pour `UTF8DataInputJsonParser` est donc vérifiée avec des charges utiles plus courtes (≤ 1 001 chiffres) où le bogue est encore reproductible.

---

### SNYK-JAVA-COMFASTERXMLJACKSONCORE-15907551 / GHSA-2m67-wjpj-xhg9 — Contournement de la contrainte de longueur de document

**Détails de sécurité**

| Champ | Valeur |
|-------|--------|
| ID Snyk | [SNYK-JAVA-COMFASTERXMLJACKSONCORE-15907551](https://security.snyk.io/vuln/SNYK-JAVA-COMFASTERXMLJACKSONCORE-15907551) |
| Avis GitHub | [GHSA-2m67-wjpj-xhg9](https://github.com/FasterXML/jackson-core/security/advisories/GHSA-2m67-wjpj-xhg9) |
| Description | Allocation de ressources sans limites ni limitation |
| Divulgué | 2026-04-04 |
| Score CVSS v4.0 | **8.7 ÉLEVÉ** |
| CWE | [CWE-770](https://cwe.mitre.org/data/definitions/770.html) — Allocation de ressources sans limites ni limitation |
| Versions affectées | [2.8.0, 2.21.2) |
| Correctif amont | jackson-core 2.18.7, 2.21.2 ou supérieur |
| Commits de correction | [74c9ee25](https://github.com/FasterXML/jackson-core/commit/74c9ee25) (3.x), [7ce3622f](https://github.com/FasterXML/jackson-core/commit/7ce3622f) (2.18.x) |

**Cause racine :** Même lorsque `StreamReadConstraints.maxDocumentLength` est configuré, les versions antérieures à 2.18.7 / 2.21.2 n'appliquent pas la limite de longueur du document dans aucun chemin de parseur. Les parseurs bloquants (`UTF8StreamJsonParser`, `ReaderBasedJsonParser`) ne valident jamais le nombre cumulé d'octets lus par rapport à la limite configurée. Le parseur asynchrone (`NonBlockingJsonParser`) manque également de validation dans `feedInput()`. Le `UTF8DataInputJsonParser` n'a aucun mécanisme pour suivre le total d'octets consommés.

Dans jackson-core 2.13.5, `maxDocumentLength` n'existait pas du tout, ce qui signifie qu'il n'y avait aucun moyen de limiter la taille du document. Cette correction introduit le champ `maxDocumentLength` dans `StreamReadConstraints` et l'applique dans tous les chemins de parseur.

**Chemins de parseur vulnérables :**

| Parseur | Chemin | Point d'application |
|---------|--------|---------------------|
| `UTF8StreamJsonParser` | `InputStream` → `_loadMore()` | Valide `_currInputProcessed + count` après chaque rechargement du tampon et à la fin du fichier |
| `ReaderBasedJsonParser` | `Reader` → `_loadMore()` | Même motif que `UTF8StreamJsonParser` |
| `NonBlockingJsonParser` | `feedInput()` | Valide `_currInputProcessed + _origBufferLen` après chaque bloc d'entrée |
| `UTF8DataInputJsonParser` | `DataInput` | Échec rapide : lève `StreamConstraintsException` si `maxDocumentLength` est configuré |

**Scénario d'attaque :** Un attaquant envoie un document JSON valide mais surdimensionné (par exemple, une structure profondément imbriquée ou hautement répétitive occupant des gigaoctets) à un service qui a configuré `maxDocumentLength` pour éviter l'épuisement des ressources. Sans application, le parseur traite l'intégralité du document indépendamment de la limite configurée, consommant une mémoire et un CPU illimités.

---

## Impact sur la sécurité

Les quatre vulnérabilités sont exploitables à distance sans authentification :

- Tout service qui analyse du JSON contrôlé par un attaquant via un `JsonParser` (directement ou via Jackson Databind, qui encapsule `jackson-core`) est à risque.
- L'attaque est trivialement constructible — quelques centaines d'octets de JSON suffisent pour déclencher une consommation illimitée de ressources.
- Aucun impact sur la confidentialité ou l'intégrité ; la disponibilité (DoS) est la seule classe d'impact.

---

## Détails de la correction

### Mise à niveau officielle (recommandée)

Mettez à niveau vers **jackson-core 2.15.4** ou toute version stable ultérieure. Toutes les versions 2.15.x et 2.16+ incluent l'API `StreamReadConstraints` avec des valeurs par défaut sûres.```xml
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.15.4</version>
</dependency>

Cette branche (Correction de sécurité pour 2.13.5)

Si la mise à niveau vers une version ultérieure n'est pas immédiatement possible, cette branche applique une correction complète à la base de code 2.13.5. Elle introduit StreamReadConstraints et StreamConstraintsException avec une API compatible avec 2.15.x, intègre les contraintes dans les quatre implémentations de JsonParser — y compris l'analyseur non bloquant, qui n'était pas couvert par le correctif en amont — et applique les limites par défaut suivantes :

ContrainteLimite par défaut
Profondeur d'imbrication maximale1,000
Longueur maximale du jeton numérique1,000 chiffres
Longueur maximale du jeton chaîne1,000,000 caractères
Amplitude d'échelle maximale de BigDecimal100,000

Détails de l'implémentation du correctif

Nouvelles classes

StreamReadConstraints (356 lignes)

Objet de valeur immuable contenant les limites de lecture de flux par analyseur, construit via un Builder :```java // Default constraints (used by all parsers unless overridden) StreamReadConstraints defaults = StreamReadConstraints.defaults();

// Custom constraints StreamReadConstraints custom = StreamReadConstraints.builder() .maxNestingDepth(500) .maxNumberLength(2000) .maxStringLength(5000000) .build();

root@kitploit:~
Méthodes de validation (appelées par les analyseurs à chaque nouveau jeton) :```java
void validateNestingDepth(int depth) throws StreamConstraintsException;
void validateIntegerLength(int length) throws StreamConstraintsException;
void validateFPLength(int length) throws StreamConstraintsException;
void validateStringLength(int length) throws StreamConstraintsException;
void validateBigIntegerScale(int scale) throws StreamConstraintsException;

Format du message d'exception :

  • "Depth (%d) exceeds the maximum allowed nesting depth (%d)" : "Profondeur (%d) dépasse la profondeur d'imbrication maximale autorisée (%d)"
  • "Number length (%d) exceeds the maximum length (%d)" : "Longueur du nombre (%d) dépasse la longueur maximale (%d)"
  • "String length (%d) exceeds the maximum length (%d)" : "Longueur de la chaîne (%d) dépasse la longueur maximale (%d)"
  • "BigDecimal scale (%d) magnitude exceeds maximum allowed (%d)" : "L'échelle BigDecimal (%d) dépasse la magnitude maximale autorisée (%d)"

StreamConstraintsException (52 lignes)

Étend StreamReadException (elle-même une JsonProcessingException). Levée exclusivement par les méthodes de validation de StreamReadConstraints.


Fichiers modifiés

base/ParserBase.java

Ajout du champ _streamReadConstraints (par défaut StreamReadConstraints.defaults()).

resetInt() et resetFloat() valident désormais la longueur du jeton numérique immédiatement après que le jeton a été accumulé :```java protected void resetInt(boolean negative, int intLen) throws IOException { _streamReadConstraints.validateIntegerLength(intLen); // … existing reset logic … }

protected void resetFloat(boolean negative, int intLen, int decLen, int expLen) throws IOException { int totalLen = intLen + decLen + expLen; _streamReadConstraints.validateFPLength(totalLen); // … existing reset logic … }

root@kitploit:~
Nouvelles méthodes d'assistance `_createChildArrayContext()` et `_createChildObjectContext()` encapsulent la création de contexte
avec une vérification de profondeur :```java
protected JsonReadContext _createChildArrayContext(int line, int col) throws IOException {
    _streamReadConstraints.validateNestingDepth(_parsingContext.getNestingDepth() + 1);
    return _parsingContext.createChildArrayContext(line, col);
}

Parser Implementations

All four parsers now call the new depth-checking helpers instead of accessing _parsingContext.createChild*() directly:

  • json/ReaderBasedJsonParser.java
  • json/UTF8StreamJsonParser.java
  • json/UTF8DataInputJsonParser.java
  • json/async/NonBlockingJsonParserBase.java

JsonStreamContext.java

Ajout de getNestingDepth() qui parcourt la chaîne parente pour calculer la profondeur absolue :```java public int getNestingDepth() { int depth = 0; JsonStreamContext curr = this; while ((curr = curr.getParent()) != null) { depth++; } return depth; }

root@kitploit:~
#### `json/JsonReadContext.java`

Les signatures de `createChildArrayContext()` et `createChildObjectContext()` ont été mises à jour pour propager `throws IOException`.

#### `json/async/NonBlockingJsonParser.java` (Sonatype-2022-6438 seulement)

Il s'agit du correctif supplémentaire principal découvert au-delà du périmètre du PR #827 en amont. Six sites de complétion de nombres qui contournaient `ParserBase.resetInt()` ont été corrigés individuellement :

| Méthode | Validation ajoutée |
|--------|------------------|
| `_startPositiveNumber()` — retour rapide | `validateIntegerLength(_intLength)` |
| `_startNegativeNumber()` — retour rapide | `validateIntegerLength(_intLength)` |
| `_finishNumberIntegralPart()` — retour final | `validateIntegerLength(_intLength)` |
| `_finishToken()` cas `MINOR_NUMBER_INTEGER_DIGITS` | `validateIntegerLength(_intLength)` |
| `_startFloat()` / `_finishFloatFraction()` / `_finishFloatExponent()` retours finaux | `validateFPLength(_intLength + _fractLength + _expLength)` |
| `_finishToken()` cas `MINOR_NUMBER_FRACTION_DIGITS` / `MINOR_NUMBER_EXPONENT_DIGITS` | `validateFPLength(...)` |

Tous les sites sont atteignables : les méthodes de chemin rapide gèrent le cas où le nombre complet est disponible en un seul appel `feedInput()` ; les cas d'état de reprise `MINOR_*` gèrent le cas morcelé où les chiffres arrivent en plusieurs appels. Les deux chemins doivent être protégés.

---

## Couverture de test

### CVE-2025-52999 — Tests de profondeur d'imbrication

| Fichier de test | Méthode de test | Modes d'analyseur | Couvre |
|-----------|-------------|-------------|--------|
| `read/ArrayParsingTest.java` | `testCVE_2025_52999` | flux | Parcours récursif simulant une utilisation réelle de l'application ; confirme `StreamConstraintsException` à la profondeur 1001 (corrigé) et `StackOverflowError` à la profondeur 20 000 (2.13.5) |
| `read/ArrayParsingTest.java` | `testCustomNestingDepthConstraint` | API directe | `StreamReadConstraints.builder().maxNestingDepth(5)` — accesseur, à la limite passe, au-delà de la limite lève une exception |
| `read/ArrayParsingTest.java` | `testObjectNestingDepthLimit` | flux | Objets exactement à la limite 1000 (passent), objets de niveau 1001 lèvent une exception |
| `read/ArrayParsingTest.java` | `testDataInputParserDepthLimit` | `UTF8DataInputJsonParser` | `UTF8DataInputJsonParser` impose une limite de profondeur de niveau 1001 |
| `read/ArrayParsingTest.java` | `testNonBlockingParserDepthLimit` | non-bloquant | `NonBlockingJsonParser` impose une limite de profondeur de niveau 1001 |

### Sonatype-2022-6438 — Tests de longueur numérique

| Fichier de test | Méthode de test | Modes d'analyseur | Couvre |
|-----------|-------------|-------------|--------|
| `read/NumberOverflowTest.java` | `testSonatype_2022_6438` | `ALL_MODES` | Entier à la limite (réussite), entier au-delà de la limite (échec), flottant à la limite (réussite), flottant au-delà de la limite (échec), exposant en notation scientifique à la limite (réussite), exposant au-delà de la limite (échec) — les quatre analyseurs |
| `read/NumberOverflowTest.java` | `testNonBlockingParserNumericLengthLimit` | non-bloquant | `NonBlockingJsonParser` impose la longueur numérique |
| `read/NumberOverflowTest.java` | `testNonBlockingParserExponentLengthLimit` | non-bloquant | `NonBlockingJsonParser` impose la longueur de l'exposant en notation scientifique via `validateFPLength` |
| `read/NumberOverflowTest.java` | `testCustomMaxNumberLengthConstraint` | API directe | `StreamReadConstraints.builder().maxNumberLength(5)` — accesseur, à la limite passe, au-delà lève une exception pour `validateIntegerLength()` et `validateFPLength()`, format du message d'erreur |

> **Clé des modes d'analyseur :**
> - `ALL_STREAMING_MODES` = `UTF8StreamJsonParser` (flux), `UTF8StreamJsonParser` (limité), `ReaderBasedJsonParser`
> - `ALL_MODES` = les trois ci-dessus + `UTF8DataInputJsonParser`
> - `non-bloquant` = `NonBlockingJsonParser` via `ByteArrayFeeder`
> - `flux` = `UTF8StreamJsonParser` (par défaut `JsonFactory.createParser`)

### SNYK-JAVA-COMFASTERXMLJACKSONCORE-15907551 — Tests de longueur de document

| Fichier de test | Méthode de test | Modes d'analyseur | Couvre |
|-----------|-------------|-------------|--------|
| `constraints/LargeDocReadTest.java` | `testInputStreamExceedsLimit` | `UTF8StreamJsonParser` | L'analyseur `InputStream` impose `maxDocumentLength` — document 20K rejeté avec limite 10K |
| `constraints/LargeDocReadTest.java` | `testInputStreamUnderLimitSucceeds` | `UTF8StreamJsonParser` | L'analyseur `InputStream` accepte un document dans la limite |
| `constraints/LargeDocReadTest.java` | `testReaderExceedsLimit` | `ReaderBasedJsonParser` | L'analyseur `Reader` impose `maxDocumentLength` — document 20K rejeté avec limite 10K |
| `constraints/LargeDocReadTest.java` | `testReaderUnderLimitSucceeds` | `ReaderBasedJsonParser` | L'analyseur `Reader` accepte un document dans la limite |
| `constraints/LargeDocReadTest.java` | `testAsyncExceedsLimit` | `NonBlockingJsonParser` | L'analyseur asynchrone impose `maxDocumentLength` — document 20K rejeté dans `feedInput()` |
| `constraints/LargeDocReadTest.java` | `testAsyncUnderLimitSucceeds` | `NonBlockingJsonParser` | L'analyseur asynchrone accepte un document dans la limite |
| `constraints/LargeDocReadTest.java` | `testDataInputWithDocLengthLimitFails` | `UTF8DataInputJsonParser` | L'analyseur `DataInput` échoue rapidement lorsque `maxDocumentLength` est configuré |
| `constraints/LargeDocReadTest.java` | `testDataInputWithoutDocLengthLimitWorks` | `UTF8DataInputJsonParser` | L'analyseur `DataInput` fonctionne normalement sans `maxDocumentLength` configuré |
| `constraints/LargeDocReadTest.java` | `testDefaultFactoryNoLimit` | `UTF8StreamJsonParser` | La fabrique par défaut (sans limite) accepte les grands documents |

---

## Résultats complets de la suite de tests```
Tests run: 957, Failures: 0, Errors: 0, Skipped: 0

Les 957 tests réussissent sur la construction corrigée. Répartition des nouveaux tests de sécurité ajoutés :

Fichier de testNouvelles / Méthodes étendues
read/ArrayParsingTest.javatestCVE_2025_52999, testCustomNestingDepthConstraint, testObjectNestingDepthLimit, testDataInputParserDepthLimit, testNonBlockingParserDepthLimit
read/NumberOverflowTest.javatestSonatype_2022_6438 (étendu pour inclure les cas d'exposant), testNonBlockingParserNumericLengthLimit, testCustomMaxNumberLengthConstraint, testNonBlockingParserExponentLengthLimit
constraints/LargeDocReadTest.javatestInputStreamExceedsLimit, testInputStreamUnderLimitSucceeds, testReaderExceedsLimit, testReaderUnderLimitSucceeds, testAsyncExceedsLimit, testAsyncUnderLimitSucceeds, testDataInputWithDocLengthLimitFails, testDataInputWithoutDocLengthLimitWorks, testDefaultFactoryNoLimit

Commande de build:```bash ./mvnw test

root@kitploit:~
---

## Résultats de validation

### Test de régression contre jackson-core 2.13.5

Les méthodes de test CVE ont été conçues pour **échouer** sur le codebase 2.13.5 et **réussir** sur le build corrigé.

`NumberOverflowTest#testSonatype_2022_6438` contre 2.13.5 :```
FAIL — Sonatype-2022-6438 VULNERABILITY PRESENT: parser returned VALUE_NUMBER_INT
       for a 1001-digit integer — number length limit is not enforced

ArrayParsingTest#testCVE_2025_52999 contre 2.13.5:``` FAIL — CVE-2025-52999 VULNERABILITY PRESENT: StackOverflowError after 20000 nesting levels — parser enforces no depth limit (2.13.5)

root@kitploit:~
**Les deux tests sur la version corrigée : RÉUSSI.**

---

## Preuve de concept

### CVE-2025-52999 — Déni de service par profondeur d'imbrication```java
// Build a 1001-level nested array document (just over the limit)
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1001; i++) sb.append('[');
for (int i = 0; i < 1001; i++) sb.append(']');

JsonFactory factory = new JsonFactory();
JsonParser parser = factory.createParser(sb.toString());
try {
    while (parser.nextToken() != null) { }       // ← throws on 1001st '['
    System.err.println("VULNERABLE: no exception thrown");
} catch (StreamConstraintsException e) {
    System.out.println("REMEDIATED: " + e.getMessage());
    // Depth (1001) exceeds the maximum allowed nesting depth (1000)
} finally {
    parser.close();
}

Sonatype-2022-6438 — Numeric Token Length DoS

Les quatre formes de jeton déclenchent validateFPLength / validateIntegerLength avant que toute conversion BigDecimal / BigInteger ne soit tentée.```java JsonFactory factory = new JsonFactory();

// ── 1. Long integer ────────────────────────────────────────────────────────── String longInt = "9".repeat(1001); // 1001-digit integer // Negative form works identically: "-" + "9".repeat(1001)

// ── 2. Long fractional part (floating-point) ───────────────────────────────── // intLen=1, fractLen=1001, total=1002 String longFloat = "0." + "9".repeat(1001);

// ── 3. Long exponent / scientific notation ─────────────────────────────────── // intLen=1, fractLen=0, expLen=1001, total=1002 — only 1,004 bytes on the wire String longExp = "1e" + "9".repeat(1001);

// ── 4. Combined fractional + exponent ──────────────────────────────────────── // intLen=1, fractLen=500, expLen=500, total=1001 — neither part alone is over the limit String combined = "0." + "9".repeat(500) + "e" + "9".repeat(500);

for (String payload : new String[]{ longInt, longFloat, longExp, combined }) { JsonParser parser = factory.createParser("[" + payload + "]"); try { parser.nextToken(); // START_ARRAY parser.nextToken(); // ← throws on the number token System.err.println("VULNERABLE: " + payload.substring(0, 20) + "…"); } catch (StreamConstraintsException e) { System.out.println("REMEDIATED: " + e.getMessage()); // Number length (N) exceeds the maximum length (1000) } finally { parser.close(); } }

root@kitploit:~
---

## Guide de migration

### Option 1: Mise à niveau vers jackson-core 2.15.4+ (Recommandé)```xml
<!-- Maven -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.15.4</version>
</dependency>

<!-- Or with Jackson BOM -->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.fasterxml.jackson</groupId>
            <artifactId>jackson-bom</artifactId>
            <version>2.15.4</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

Avec 2.15+, vous pouvez également ajuster les limites à l'exécution si votre application a légitimement besoin d'une imbrication plus profonde ou de nombres plus longs :```java JsonFactory factory = JsonFactory.builder() .streamReadConstraints(StreamReadConstraints.builder() .maxNestingDepth(2000) .maxNumberLength(10000) .maxDocumentLength(50_000_000L) .build()) .build();

root@kitploit:~
### Option 2: Appliquer cette remédiation de sécurité```bash
git clone https://github.com/sassoftware/jackson-core.git
cd jackson-core
git checkout 2.13.5-CVE-2025-52999-sonatype-2022-6438-GHSA-2m67-wjpj-xhg9
./mvnw install -DskipTests

Ensuite, mettez à jour la dépendance de votre projet pour utiliser l’artefact 2.13.5-SNAPSHOT installé localement, ou déployez-le dans votre dépôt d’artefacts interne.


Résumé des fichiers modifiés clés

FichierType de modificationLignes modifiéesDescription
src/main/java/.../StreamReadConstraints.javaNouveau+356Configuration des contraintes + 5 méthodes de validation
src/main/java/.../exc/StreamConstraintsException.javaNouveau+52Type d’exception pour les violations de contraintes
src/main/java/.../base/ParserBase.javaModifié+44Crochets de profondeur/longueur dans les assistants de réinitialisation et de contexte
src/main/java/.../json/JsonReadContext.javaModifié+6Propagation de throws IOException
src/main/java/.../json/ReaderBasedJsonParser.javaModifié+30Utilisation des assistants _createChild* vérifiant la profondeur
src/main/java/.../json/UTF8StreamJsonParser.javaModifié+26Utilisation des assistants _createChild* vérifiant la profondeur
src/main/java/.../json/UTF8DataInputJsonParser.javaModifié+26Utilisation des assistants _createChild* vérifiant la profondeur
src/main/java/.../json/async/NonBlockingJsonParserBase.javaModifié+4Utilisation des assistants _createChild* vérifiant la profondeur
src/main/java/.../json/async/NonBlockingJsonParser.javaModifié+9NOUVEAU — validateIntegerLength / validateFPLength à 6 sites d’achèvement de nombre ; validateDocumentLength dans feedInput()
src/main/java/.../JsonStreamContext.javaModifié+20Ajout de getNestingDepth()
src/main/java/.../TSFBuilder.javaModifié+15Ajout du champ _streamReadConstraints et du setter

Total : 16 fichiers modifiés, 1 606 insertions (tel que rapporté par git diff jackson-core-2.13.5 --stat).


Références

CVE-2025-52999

  • Entrée NVD : https://nvd.nist.gov/vuln/detail/CVE-2025-52999
  • Avis de sécurité GitHub : https://github.com/FasterXML/jackson-core/security/advisories/GHSA-h46c-h94j-95f3
  • CWE-121 : Débordement de tampon basé sur la pile (selon NVD / GitHub CNA)

Sonatype-2022-6438

  • Avis Sonatype : https://guide.sonatype.com/vulnerability/sonatype-2022-6438
  • CWE-770 : Allocation de ressources sans limites ou limitation

SNYK-JAVA-COMFASTERXMLJACKSONCORE-15907551 / GHSA-2m67-wjpj-xhg9

  • Avis Snyk : https://security.snyk.io/vuln/SNYK-JAVA-COMFASTERXMLJACKSONCORE-15907551
  • Avis de sécurité GitHub : https://github.com/FasterXML/jackson-core/security/advisories/GHSA-2m67-wjpj-xhg9
  • Problème GitHub : https://github.com/FasterXML/jackson-core/issues/1570
  • CWE-770 : Allocation de ressources sans limites ou limitation
  • Commits de correction : 74c9ee25 (3.x), 7ce3622f (2.18.x)

Jackson Core

  • Notes de version : https://github.com/FasterXML/jackson-core/blob/2.15/release-notes/VERSION-2.x
  • API StreamReadConstraints (javadoc 2.15) : https://javadoc.io/doc/com.fasterxml.jackson.core/jackson-core/2.15.4/com/fasterxml/jackson/core/StreamReadConstraints.html

Considérations de sécurité

Qui est à risque

Toute application qui :

  1. Analyse du JSON provenant d’une source non fiable ou externe (corps de requête HTTP, données de file d’attente, téléchargements de fichiers, réponses API tierces), ET
  2. Utilise jackson-core 2.x antérieur à 2.15.0 (directement ou transitivement via jackson-databind)

est vulnérable aux deux attaques.

Défense en profondeur

Même après correction, pensez à :

  • Des limites de taille d’entrée au niveau de la couche HTTP/transport (par ex. maxRequestSize dans les conteneurs Servlet) pour rejeter les corps de requête extrêmement volumineux avant l’appel de l’analyseur.
  • Des délais d’attente de requête pour limiter le temps de traitement total par requête.
  • Des StreamReadConstraints personnalisées si votre application nécessite légitimement des documents plus volumineux ou plus profonds – ajustez les limites au minimum nécessaire pour votre cas d’utilisation.

Compatibilité

DimensionExigence
JDK de constructionJava 8 (JDK 1.8) ou ultérieur – cette branche nécessite Java 8+ pour la construction et les tests
JRE d’exécution minimalJava 8 ou ultérieur
Maven3.6.3 ou ultérieur (le wrapper intégré ./mvnw satisfait cette condition automatiquement)

Remarque : La version originale jackson-core 2.13.5 ciblait Java 6 (-source 1.6 -target 1.6). À partir de cette branche de sécurité, Java 8 ou ultérieur est requis à la fois pour la construction et l’exécution. Aucune surface d’API publique Jackson 2.13 n’est modifiée ; seuls les environnements JDK 6/7 perdent la compatibilité en raison des exigences Maven et JDK.


Environnement de développement

ComposantVersion
Tag de basejackson-core-2.13.5
Branche2.13.5-CVE-2025-52999-sonatype-2022-6438-GHSA-2m67-wjpj-xhg9
Outil de constructionMaven (wrapper : ./mvnw)
Cadre de testJUnit 3 / style TestCase
Nombre de tests957

Construction et test```bash

Full build and test

./mvnw test

Install to local Maven repository

./mvnw install -DskipTests

root@kitploit:~
---

## Licence

Sous licence [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0).```
Copyright 2024–2025 The Jackson Authors

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

Contact

Auteur de recherche et de correction de vulnérabilités de sécurité : Jinwoo Hwang (https://JinwooHwang.com)

Télécharger l’outil
streamReadConstraints()
src/main/java/.../JsonFactory.javaModifié+12Intégration des contraintes du constructeur dans les constructeurs ; échec rapide pour maxDocumentLength avec DataInput
src/test/java/.../read/NumberOverflowTest.javaModifié+241testSonatype_2022_6438 (incl. cas d’exposant), testNonBlockingParserNumericLengthLimit, testNonBlockingParserExponentLengthLimit, testCustomMaxNumberLengthConstraint
src/test/java/.../read/NumberParsingTest.javaModifié+39Mise à jour de 3 sites d’appel verifyException
src/test/java/.../read/ArrayParsingTest.javaModifié+143testCVE_2025_52999, testCustomNestingDepthConstraint
src/test/java/.../constraints/LargeDocReadTest.javaNouveau+2009 tests pour l’application de maxDocumentLength dans tous les chemins d’analyse