
Auto-vérification des 11 bulletins de sécurité jackson-databind de 2026 : analyse les annotations du code source pour réduire le bruit et vous indique combien vous concernent réellement ; calcule l'intersection bulletin par bulletin pour donner les versions réellement adéquates (2.18.9/2.21.5/3.1.5, et non le 2.21.4 le plus courant dans l'avis de sécurité). CVE-2026-54515 / CVE-2026-54512
Outil d'auto-vérification des 11 avis de sécurité jackson-databind 2026. Jar unique zéro dépendance, sans connexion réseau.
Il répond à deux questions auxquelles Dependabot ne peut pas répondre :
@JsonView / types polymorphes / correspondance insensible à la casse…), pour passer de « version affectée installée » à « cette fonctionnalité est réellement utilisée ».java -jar jackson-check.jar ./target ./src
Sur les 11 avis de 2026, 8 indiquent une version corrigée en 2.21.4 / 2.18.8 / 3.1.4. Ceux qui suivent ces versions pensent avoir tout corrigé.
La réponse réelle, en calculant l'intersection avis par avis, est la suivante :
Les trois avis qui imposent la cible la plus élevée sont ceux-ci :
CVE-2026-54515 — contournement de la désérialisation insensible à la casse pour @JsonIgnoreProperties propriété par propriété
CVE-2026-59889 — @JsonView inefficace sur les propriétés de conteneur @JsonUnwrapped
🔴 GHSA-mhm7-754m-9p8w — aucun numéro CVE, le texte même de l'avis l'indique :
le correctif n'a jamais été rétroporté vers 2.21 ou 2.18 … les utilisateurs de 2.21.4 et 2.18.8 qui ont fait la mise à jour conformément aux avis publiés restent vulnérables
C'est une lacune de correctif : la branche 3.x a corrigé, mais le rétroportage vers 2.18 / 2.21 a été oublié. Comme il n'y a pas de numéro CVE, une recherche par numéro CVE ne le trouve pas.
Un simple lancement suffit pour le voir :
# Projet déjà monté en 2.21.4
java -jar jackson-check.jar ./lib ./src
# Dependabot vous signale : 3 avis
# 🔥 Attention : si vous montez vers la version corrigée la plus fréquente dans les avis, les 3 suivants restent concernés
| Coordonnée | Réellement publié sur Maven Central |
|---|---|
com.fasterxml.jackson.core:jackson-databind | uniquement 2.x |
tools.jackson.core:jackson-databind | uniquement 3.x |
Dans les champs structurés des avis, en revanche :
com.fasterxml.jackson.core porte 6 plages 3.x, avec une version corrigée 3.1.4 → HTTP 404 pour cette coordonnéetools.jackson.core porte 1 plage 2.x, avec une version corrigée 2.21.4 → là encore HTTP 404Un outil qui recopie les avis vous fera installer un artefact qui n'existe pas. Lors de la génération de la table de décision, cet outil vérifie la disponibilité réelle par des requêtes HEAD individuelles ; ce qui est introuvable est signalé dans le rapport, jamais proposé comme mise à jour.
Pour les deux coordonnées, l'artifactId et le nom du fichier jar sont strictement identiques ; seul META-INF permet de les distinguer — c'est pourquoi cet outil juge sur la coordonnée, et non sur le nom de fichier.
Pour un même 2.18.5, deux codes donnent des résultats totalement différents :
Un code utilisant types polymorphes + @JsonView → Dependabot signale 7 avis, 6 réellement applicables
Un code qui ne fait que new ObjectMapper → Dependabot signale 7 avis, 0 réellement applicable
Les deux sens doivent être précisés ; n'en mentionner qu'un seul serait trompeur :
① « Aucune condition déclenchante trouvée » ne veut pas dire sûr. Trois situations peuvent rendre cette conclusion faussement rassurante :
ObjectMapper.addMixIn) etc., le terme n'apparaissant pas du tout dans le code source ;② « Toutes les conditions déclenchantes sont réunies » ne veut pas non plus dire que vous êtes touché. Les marqueurs sont agrégés sur l'ensemble du dépôt de code, pas sur la même classe ni le même champ. Par exemple, un avis exige que @JsonView et @JsonUnwrapped soient posés sur la même propriété, alors que nous pouvons seulement constater que ces deux termes apparaissent dans votre code.
Cet outil ne fait que de la correspondance textuelle, pas d'analyse AST. C'est un compromis délibéré : le chemin critique doit pouvoir être lu et vérifié par un humain — une décision basée sur un AST incompréhensible, si elle est erronée, ne serait détectée par personne.
La détermination de version (première étape) est fiable ; la détermination des conditions déclenchantes (deuxième étape) sert uniquement à hiérarchiser, pas à écarter le risque.
Sur l'angle mort de Dependabot : aucun des 11 avis de cette fournée n'y échappe. La page des avis du dépôt officiel en contient 11, et l'interrogation inverse sur les deux coordonnées en totalise également 11 : l'écart est de 0 — c'est une conclusion obtenue après avoir consulté les deux sources, pas une valeur par défaut issue d'une seule source (le ASSERT2 de tools/gen_rules.py revérifie à chaque exécution). Les alertes de version de Dependabot sont donc exactes pour cette fournée ; la valeur de cet outil réside dans la réduction du bruit et le calcul de l'intersection, pas dans le comblement des lacunes.
java -jar jackson-check.jar <chemin...> [options]
<chemin> jar / war / répertoire. Le répertoire recherche à la fois les artefacts de construction (pour la version) et les sources .java (pour les conditions déclenchantes)
--src <chemin> indique en plus un répertoire de sources
--no-src ne pas analyser les sources (jugement par version uniquement, granularité identique à Dependabot)
--all liste aussi les entrées non concernées
-v, --version affiche la version
-h, --help affiche l'aide
Codes de sortie : 0 = aucune version affectée · 2 = version affectée mais aucune condition déclenchante trouvée dans le code source (ou sources non analysées) · 3 = conditions déclenchantes également présentes. Utilisable directement en CI.
Formats reconnus : jar ordinaire, fat jar Spring Boot (BOOT-INF/lib/), WAR classique (WEB-INF/lib/), jackson intégré par shading dans un jar hôte (coordonnée de dépendance invisible, mais META-INF/maven toujours présent).
# Projet Maven
mvn package && java -jar jackson-check.jar target src
# Un seul jar final
java -jar jackson-check.jar app.jar
# Projet Gradle
java -jar jackson-check.jar build/libs src/main/java
Nécessite Java 17+. Zéro dépendance à l'exécution — en particulier, ne dépend pas de jackson lui-même.
tools/gen_rules.py génère CveTable.java à partir de deux sources primaires :
/repos/FasterXML/jackson-databind/security-advisories — l'ensemble complet des avis publiés par les mainteneurs + le texte original des descriptions/advisories?ecosystem=maven&affects=<coordonnée> — l'index des coordonnées réellement utilisé par Dependabot (une requête pour chaque groupId)Les 11 avis sont déployés en 37 règles « avis × coordonnée × plage de versions », avec 13 assertions ; si l'une d'elles n'est pas satisfaite, le processus s'arrête et aucun fichier n'est écrit — afin d'éviter qu'un échec d'analyse ne génère une table vide alors que les tests restent tous verts :
python tools/gen_rules.py # nécessite une CLI gh authentifiée
56 tests unitaires + 7 scénarios de bout en bout sur de vrais artefacts (vrais jars : 2.13.0 / 2.18.5 / 2.21.2 / 2.21.4 / 2.21.5 / 3.1.2 / 3.1.5).
Apache-2.0
| Branche maintenue | La plus fréquente dans les avis | Version réellement correcte |
|---|
| 2.18.x | 2.18.8 | 2.18.9 |
| 2.21.x | 2.21.4 | 2.21.5 |
| 2.22.x | — | 2.22.1 |
| 3.1.x | 3.1.4 | 3.1.5 |
| 3.2.x | — | 3.2.1 |
| Condition déclenchante | Avis associés |
|---|
@JsonView | CVE-2026-54517 / 54518 / 59889 / GHSA-mhm7 |
@JsonTypeInfo / activateDefaultTyping / PolymorphicTypeValidator | CVE-2026-54512 / 54513 |
@JsonIgnoreProperties + ACCEPT_CASE_INSENSITIVE_PROPERTIES | CVE-2026-54515 |
@JsonIgnore + renommage @JsonProperty | CVE-2026-54516 |
Java Record + PropertyNamingStrategy + @JsonIgnore | CVE-2026-59888 |
champ InetSocketAddress | CVE-2026-54514 |
readTree() + JsonNode.toString() | CVE-2026-50193 |
| Assertion | Vérifie |
|---|
| ASSERT2 | ⭐ comparaison de l'angle mort entre les deux sources : l'écart doit être 0 ou être expliqué ligne par ligne |
| ASSERT6 | les deux groupId doivent être couverts |
| ASSERT7 | chaque version corrigée est sondée par requête HEAD individuelle pour vérifier sa disponibilité sur Maven Central |
| ASSERT8 | fantôme bidirectionnel : récupère maven-metadata.xml pour prouver que toute la ligne de version majeure n'existe pas pour cette coordonnée |
| ASSERT9 | calcule l'intersection branche par branche, et doit réellement dépasser la version corrigée minimale de la même branche |
| ASSERT11 | la chaîne d'ancrage de chaque condition déclenchante doit apparaître mot pour mot dans le texte original de la description officielle |
| ASSERT12 | chaque avis doit avoir un score CVSS (union des deux sources) |
| Identifiant | Sévérité | Sujet |
|---|
| CVE-2026-54512 | high 8.1 | contournement des paramètres génériques de PolymorphicTypeValidator |
| CVE-2026-54513 | high 8.1 | contournement de la liste blanche pour les sous-types de tableaux allowIfSubTypeIsArray() |
| CVE-2026-50193 | medium 7.5 | débordement de pile JsonNode.toString() sur imbrication profonde |
| CVE-2026-54514 | medium 5.3 | la désérialisation d'InetSocketAddress déclenche une résolution DNS (SSRF) |
| CVE-2026-54515 | medium 5.3 | la reconstruction insensible à la casse écrase @JsonIgnoreProperties |
| CVE-2026-54516 | medium 5.3 | un setter @JsonIgnore renommé reste accessible en écriture via le champ privé |
| CVE-2026-54517 | medium 5.3 | @JsonView inefficace sur les propriétés de creator sans setter |
| CVE-2026-54518 | medium 6.5 | @JsonView inefficace sur les paramètres de creator unwrapped |
| CVE-2026-59888 | medium 6.5 | @JsonIgnore sur une propriété de Record contourné par la stratégie de nommage |
| CVE-2026-59889 | medium 6.5 | @JsonView inefficace sur les propriétés de conteneur @JsonUnwrapped |
| GHSA-mhm7-754m-9p8w | medium 6.5 | Aucun numéro CVE · lacune de correctif @JsonView + As.EXTERNAL_PROPERTY |