En bref

  • CVE-2026-40478 (CVSS 9.1) — contournement du sandbox d'expressions de Thymeleaf, permettant un Server-Side Template Injection (SSTI) non authentifié.
  • Versions affectées : Thymeleaf < 3.1.4.RELEASE. Le patch officiel corrige un filtrage incomplet exploitable via un simple caractère de tabulation.
  • Action urgente : mettre à jour vers Thymeleaf 3.1.4.RELEASE dans toutes les applications Spring Boot / Spring MVC qui passent des données utilisateur au moteur de templates.

Les faits

La vulnérabilité CVE-2026-40478, divulguée à la mi-avril 2026 et analysée en détail par les chercheurs d'Endor Labs, affecte Thymeleaf, le moteur de templates Java utilisé par défaut dans la majorité des applications Spring Boot. La faille obtient un score CVSS v3.1 de 9.1 (Critical) selon l'advisory publié sur NVD/NIST et relayé par GitLab Advisory Database. Elle est distincte mais étroitement liée à CVE-2026-40477, publiée simultanément et traitée dans notre dossier dédié. Ici, le vecteur d'attaque est un contournement du sandbox d'expressions : Thymeleaf propose un mécanisme censé bloquer l'évaluation d'expressions dangereuses dans les templates, mais ce filtre ne neutralise pas correctement certains motifs syntaxiques. Résultat : un attaquant non authentifié peut atteindre un Server-Side Template Injection (SSTI) complet, avec création de fichiers sur disque et, dans plusieurs scénarios documentés, exécution de code côté serveur.

La cause racine est minuscule mais instructive. Le filtre de sécurité interdit explicitement les expressions contenant la chaîne new (mot-clé new suivi d'un espace classique), afin de bloquer l'instanciation d'objets Java arbitraires. Mais le parseur en aval accepte n'importe quel caractère blanc — y compris le caractère tabulation. Un payload contenant new\t au lieu de new franchit le filtre sans difficulté, puis instancie des classes Spring arbitraires : ProcessBuilder, File, URLClassLoader, etc. La liste noire ne couvrait par ailleurs que le namespace java.*, laissant libre accès aux paquets org.springframework.* et tiers.

Selon l'analyse Endor Labs et les rapports DailyCVE et CSO Online, le patch officiel — Thymeleaf 3.1.4.RELEASE — corrige à la fois la normalisation des espaces et étend la liste noire des classes interdites. Aucune exploitation in-the-wild n'est encore publiquement documentée à la date de publication, mais la proximité de CVE-2026-40477 (également corrigée en 3.1.4.RELEASE) et la simplicité du payload rendent l'apparition de PoC publics imminente.

Impact et exposition

L'impact potentiel est considérable : Thymeleaf est intégré par défaut à Spring Boot et équipe une part significative des applications web Java en production dans les secteurs bancaire, assurance, télécom et e-commerce. Toute application qui injecte des données utilisateur non validées directement dans un template — champ de recherche affiché dynamiquement, email de notification personnalisé, portail admin avec rendu conditionnel — est vulnérable. L'anti-pattern le plus répandu reste l'utilisation de th:utext ou l'interpolation directe d'entrée utilisateur dans les expressions ${...} côté contrôleur.

Les environnements les plus à risque sont les applications internes héritées, les back-offices d'administration, et les couches d'email transactionnel où la validation d'entrée est souvent relâchée au motif que « l'utilisateur est déjà authentifié ». Dans une architecture microservices, une SSTI sur un composant de templating peut servir de point de pivot vers des services backend via les propriétés Spring exposées (variables d'environnement, secrets montés). À lire également, notre dossier CVE-2026-40477 Thymeleaf, publié simultanément par le même éditeur.

Recommandations immédiates

  • Mettre à jour Thymeleaf vers 3.1.4.RELEASE ou supérieur — release officielle du 11 avril 2026, corrige conjointement CVE-2026-40477 et CVE-2026-40478.
  • Auditer les templates pour identifier les interpolations d'entrée utilisateur non échappée : rechercher les occurrences de th:utext, de concaténation d'entrée dans les expressions, et de templates générés dynamiquement côté contrôleur.
  • Durcir le sandbox même après patch : activer StandardEnforcedDialect au lieu du dialect standard, et restreindre la liste blanche des classes autorisées aux besoins strictement métier.
  • Déployer une règle WAF bloquant les motifs new<whitespace>org. et new<whitespace>java.lang. dans les paramètres HTTP, en attendant la complétion du déploiement du patch sur toute la flotte.
  • Scanner les dépendances avec OWASP Dependency-Check ou Dependency-Track pour identifier tous les projets embarquant Thymeleaf < 3.1.4.RELEASE, y compris en transitif.

⚠️ Urgence

SSTI = RCE dans la plupart des déploiements Spring Boot standards. Le bypass via tabulation est trivial à écrire et sera rapidement intégré aux scanners automatisés (sqlmap-like SSTI scanners, tplmap, burp extensions). Les applications exposées sur Internet doivent être patchées dans la semaine — celles manipulant des données personnelles ou financières dans la journée.

Comment savoir quelle version de Thymeleaf mon application utilise ?

Pour un projet Maven : mvn dependency:tree | grep thymeleaf. Pour Gradle : ./gradlew dependencies | grep thymeleaf. Pour une application déjà déployée, inspecter le WAR/JAR : unzip -l monapp.war | grep thymeleaf. Si la version est < 3.1.4.RELEASE, l'application est vulnérable. Spring Boot 3.2.x embarque Thymeleaf 3.1.2 par défaut — un upgrade explicite de la dépendance est nécessaire.

Comment tester si mon application est exploitable ?

Dans un environnement de test isolé uniquement, injecter un payload SSTI minimal dans un champ utilisateur affiché dans un template : ${7*7} — si le rendu contient 49, l'interpolation se fait côté serveur. Escalader ensuite avec ${T(java.lang.Runtime).getRuntime().exec('id')} pour confirmer la RCE. Ne jamais tester en production. Voir notre analyse d'un cas similaire dans CVE-2026-3094 GitLab SQLi, et la dynamique d'exploitation massive documentée dans CVE-2026-39987 Marimo.

Un sandbox Java classique suffit-il contre l'exploitation ?

Non. Le SecurityManager Java est déprécié depuis Java 17 et sa suppression est programmée. La seule mitigation fiable reste la mise à jour de Thymeleaf combinée à une validation stricte des entrées avant tout passage au moteur de templates. Voir aussi CVE-2026-39888 PraisonAI sandbox escape pour un exemple récent de contournement de sandbox applicatif.

Votre infrastructure est-elle exposée ?

Ayi NEDJIMI réalise des audits ciblés pour identifier et corriger vos vulnérabilités.

Demander un audit