
Vérificateur hors ligne pour Thymeleaf CVE-2026-40477 / CVE-2026-41901 — vous indique à laquelle des deux failles SSTI de CVSS 9.0 vous êtes exposé, et si votre ligne de version dispose d’un correctif (3.0.x : ce n’est pas le cas).
Outil de diagnostic hors ligne pour Thymeleaf CVE-2026-40477 / CVE-2026-41901 —— zéro dépendance, un seul jar, sans connexion réseau.
Deux contournements SSTI de score CVSS 9.0, avec deux versions correctives publiées en neuf jours. Il répond d'abord à la question « lesquelles m'affectent », puis à la question plus délicate :
Sur ma branche de version, existe-t-il une version corrective vers laquelle monter ?
Pour 3.1.x, oui (il suffit de passer à 3.1.5.RELEASE).
Pour 3.0.x et antérieurs, non —— et c'est précisément la population la plus nombreuse en termes d'installations.
Les plages affectées des deux avis sont, dans OSV, toutes deux définies par introduced: 0 :
curl -s https://api.osv.dev/v1/vulns/GHSA-r4v4-5mwr-2fwr | jq '.affected[0].ranges'
# [{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"3.1.4.RELEASE"}]}]
Autrement dit, toute la branche 3.0 est incluse, et la liste version par version énumère 3.0.15.RELEASE jusqu'à 1.0.0.
Or, sur Maven Central, la branche 3.0 s'arrête à 3.0.15.RELEASE, sans aucune publication ultérieure :
curl -s https://repo1.maven.org/maven2/org/thymeleaf/thymeleaf/maven-metadata.xml \
| grep -o '<version>3\.0\.[^<]*</version>' | tail -1
# <version>3.0.15.RELEASE</version>
Les versions corrigées des deux CVE sont toutes deux sur la branche 3.1. Les utilisateurs de 3.0.x n'ont donc pas l'option « changer juste un numéro de version »,
seulement une migration vers une autre branche majeure — et la 3.1 est explicitement listée par la documentation officielle comme comportant des changements incompatibles (recopiés un par un depuis la section 3.1.0.M1 du ChangeLog.txt officiel) :
- Removed web-API based expression security objects (#request, #response, #session, #servletContext).
- Removed support for Spring 3.x and Spring 4.x.
- Set minimum JDK compatibility level to JDK 8 project-wide (JDK 17 for thymeleaf-spring6).
Les templates qui contiennent ${#request.…} / ${#session.…} provoqueront directement une erreur lors de la mise à niveau ; ces valeurs doivent désormais être placées dans le Model par le Controller.
Il s'agit d'une migration à planifier, pas d'un simple changement de numéro de version.
Nombre de dépendances de deps.dev (lecture directe du 2026-09-04, recalculable par quiconque) :
| Version | Nombre de dépendances | Quelles lignes concernées | Mise à niveau sur la même ligne possible |
|---|---|---|---|
| 3.0.11.RELEASE | 1124 | deux | ❌ aucune version corrigée sur la ligne 3.0 |
| 3.0.15.RELEASE | 678 | deux | ❌ idem, et c'est déjà le terminus de cette ligne |
| 3.0.12.RELEASE | 641 | deux | ❌ |
| 3.1.3.RELEASE | 826 | deux | ✅ mise à niveau vers 3.1.5 |
| 3.1.2.RELEASE | 677 | deux | ✅ |
| 3.1.4.RELEASE | 70 | seulement CVE-2026-41901 | ✅ |
| 3.1.5.RELEASE | 590 | — | déjà sûr |
La version unique la plus répandue en termes d'installations est 3.0.11.RELEASE, soit 36 % de plus que la 3.1.3, la plus élevée de la ligne 3.1, et elle n'a aucune issue sur sa propre ligne.
java -jar thymeleaf-check.jar <目录或 jar/war 路径> [--utf8|--gbk]
$ java -jar thymeleaf-check.jar ./target
[CRITICAL] ./target/myapp.war :: BOOT-INF/lib/thymeleaf-3.0.11.RELEASE.jar
构件:thymeleaf 版本 3.0.11.RELEASE(3.0 线,依据: MANIFEST(Implementation-Version))
命中: CVE-2026-40477 + CVE-2026-41901
受影响,且 3.0 线在 Maven Central 上没有任何修复版(该线止于 3.0.15.RELEASE)。
Code de sortie : 2 = une ligne de version contenant un composant n'a pas de version corrigée sur la même ligne · 1 = affecté mais mise à niveau possible sur la même ligne / indéterminable · 0 = non détecté · 3 = erreur d'utilisation ou de chemin.
Peut être intégré directement dans la CI.
Scannez les artefacts de build (target/*.jar, *.war), pas les répertoires de code source.
Dans la grande majorité des cas, Thymeleaf est introduit de manière transitive par spring-boot-starter-thymeleaf, et le starter lui-même ne porte pas de version —
il est impossible de voir le numéro de version de Thymeleaf dans le pom. Dans ce cas, l'outil indique explicitement « impossible de le déterminer en lisant le pom », plutôt que de considérer qu'il n'existe pas.
Trois critères d'identification, classés par fiabilité :
Implementation-Version du MANIFEST — reconnaissable même si le jar a été renommé par un outil de repackaging.
(Sous META-INF/ du jar officiel de Thymeleaf, il n'y a que MANIFEST.MF, pas de répertoire maven/, donc pour lui c'est le critère le plus solide.)pom.propertiesDans un fat jar / war, les répertoires BOOT-INF/lib/ et WEB-INF/lib/ sont ouverts et examinés un par un, et le MANIFEST des jars embarqués est également lu.
CVE-2026-40477 | CVE-2026-41901 | |
|---|---|---|
| GHSA | GHSA-r4v4-5mwr-2fwr | GHSA-c9ph-gxww-7744 |
| CVSS | 9.0 | 9.0 |
| Affecté | <= 3.1.3.RELEASE | <= 3.1.4.RELEASE |
| Correctif | 3.1.4.RELEASE | 3.1.5.RELEASE |
| Divulgation | 2026-04-15 | 2026-05-04 |
| Phrase officielle | "fails to properly restrict the scope of accessible objects" | "fails to properly neutralize specific constructs", se produisant dans un contexte sandboxé (restreint) |
La plage affectée de la seconde inclut 3.1.4, donc ceux qui ont mis à jour vers 3.1.4 en suivant la première advisory tombent dans la seconde.
Mais ne le lisez pas comme « l'officiel n'a pas corrigé proprement » — les deux advisories décrivent des mécanismes différents,
3.1.4 (2026-04-12) et 3.1.5 (2026-04-21) sont deux versions officielles séparées de neuf jours,
et aucun texte officiel ne dit que la première correction était incomplète. Cet outil ne fait que présenter les faits côte à côte, sans tirer cette conclusion à votre place.
Chaque chiffre dans RuleTable.java peut être vérifié rétrospectivement :
python tools/gen_rules.py --show
Il recoupe la table de décision à l'aide de deux sources primaires — les plages affectées et la liste version par version d'OSV, et le
maven-metadata.xml de Maven Central — et quitte avec un code non nul en cas de divergence.
Trois conventions :
mvn package # JDK 17;target/thymeleaf-check-0.1.0.jar
mvn test # 19 个用例
Le fait de n'avoir aucune dépendance à l'exécution est délibéré : un outil de diagnostic doit pouvoir être déposé dans n'importe quel environnement et s'exécuter directement.
Apache-2.0
| Code | Signification |
|---|---|
0 | Analyse terminée, et chaque fichier a réellement été lu, aucune découverte nécessitant votre intervention |
4 | Un fichier n'a pas pu être lu — ce n'est pas un zip, contenu tronqué, ou échec de lecture |