
Offline-Checker für Thymeleaf CVE-2026-40477 / CVE-2026-41901 — zeigt dir, welcher der beiden CVSS-9.0-SSTI-Schwachstellen du ausgesetzt bist und ob deine Versionslinie überhaupt einen Fix hat (3.0.x: hat keinen).
Thymeleaf CVE-2026-40477 / CVE-2026-41901 Offline-Prüfwerkzeug —— ohne Abhängigkeiten, einzelne JAR, keine Netzwerkverbindung nötig.
Zwei SSTI-Bypasses mit CVSS 9.0, innerhalb von neun Tagen zwei Fix-Versionen veröffentlicht. Es beantwortet zuerst „Welche davon betreffen mich?", und dann die unbequemere Frage:
Gibt es für meine Versionslinie eine Upgrade-Möglichkeit auf eine Fix-Version?
Für 3.1.x: ja (Upgrade auf 3.1.5.RELEASE genügt).
Für 3.0.x und älter: nein —— und genau das ist die Gruppe mit der größten Installationsbasis.
Der betroffene Bereich beider Advisories ist in OSV als introduced: 0 angegeben:
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"}]}]
Das heißt, die gesamte 3.0-Linie ist betroffen, und in der versionsweisen Auflistung sind 3.0.15.RELEASE bis 1.0.0 alle aufgeführt.
Auf Maven Central endet die 3.0-Linie jedoch bei 3.0.15.RELEASE, danach gab es keine Veröffentlichung mehr:
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>
Die Fix-Versionen beider CVEs liegen auf der 3.1-Linie. 3.0.x-Nutzer haben also nicht die Option „nur die Versionsnummer ändern",
sondern nur eine Migration über die Hauptversionslinie hinweg —— und 3.1 ist eine offiziell dokumentierte Breaking Change (wörtlich aus dem Abschnitt 3.1.0.M1 der offiziellen ChangeLog.txt übernommen):
- 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).
Vorlagen, die ${#request.…} / ${#session.…} verwendet haben, schlagen nach dem Upgrade direkt fehl; diese Werte müssen stattdessen vom Controller ins Model gelegt werden.
Das ist eine Migration, die eingeplant werden muss, kein bloßer Versionswechsel.
Abhängigkeitszahlen von deps.dev (direkt abgerufen am 2026-09-04, von jedem reproduzierbar):
| Version | Anzahl Abhängigkeiten | Welche CVEs betroffen | Upgrade innerhalb derselben Linie möglich? |
|---|---|---|---|
| 3.0.11.RELEASE | 1124 | beide | ❌ Keine Fix-Version auf der 3.0-Linie |
| 3.0.15.RELEASE | 678 | beide | ❌ Wie oben, und es ist bereits das Ende dieser Linie |
| 3.0.12.RELEASE | 641 | beide | ❌ |
| 3.1.3.RELEASE | 826 | beide | ✅ Upgrade auf 3.1.5 |
| 3.1.2.RELEASE | 677 | beide | ✅ |
| 3.1.4.RELEASE | 70 | nur CVE-2026-41901 | ✅ |
| 3.1.5.RELEASE | 590 | — | bereits sicher |
Die einzelne Version mit der größten Installationsbasis ist 3.0.11.RELEASE — 36 % höher als das höchste der 3.1-Linie (3.1.3), und sie hat keinen Ausweg innerhalb derselben Linie.
java -jar thymeleaf-check.jar <Verzeichnis oder Pfad zu jar/war> [--utf8|--gbk]
$ java -jar thymeleaf-check.jar ./target
[CRITICAL] ./target/myapp.war :: BOOT-INF/lib/thymeleaf-3.0.11.RELEASE.jar
Artefakt:thymeleaf Version 3.0.11.RELEASE (3.0-Linie, Quelle: MANIFEST(Implementation-Version))
Treffer: CVE-2026-40477 + CVE-2026-41901
Betroffen, und die 3.0-Linie hat auf Maven Central keine Fix-Version (die Linie endet bei 3.0.15.RELEASE).
Exit-Codes: 2 = Es gibt Artefakte, deren Versionslinie keine Fix-Version innerhalb derselben Linie hat · 1 = Betroffen, aber Upgrade innerhalb derselben Linie möglich / nicht bestimmbar · 0 = nichts gefunden · 3 = Verwendungs- oder Pfadfehler.
Kann direkt in CI eingebunden werden.
Build-Artefakte scannen (target/*.jar, *.war), nicht das Quellverzeichnis.
Thymeleaf wird in den meisten Fällen transitiv über spring-boot-starter-thymeleaf eingebunden, und der Starter selbst trägt keine Version ——
im POM ist die Thymeleaf-Version also gar nicht sichtbar. In diesem Fall sagt das Tool explizit „aus dem POM nicht bestimmbar", statt es als nicht vorhanden zu behandeln.
Drei Erkennungsquellen, nach Zuverlässigkeit sortiert:
Implementation-Version im MANIFEST —— erkennt auch JARs, die von Repackaging-Tools umbenannt wurden.
(Das offizielle Thymeleaf-JAR hat unter META-INF/ nur MANIFEST.MF, kein maven/-Verzeichnis, daher ist dies für Thymeleaf die robusteste Quelle.)pom.propertiesBOOT-INF/lib/ und WEB-INF/lib/ in fat JARs / WARs werden einzeln auseinandergenommen, und auch die MANIFEST-Dateien eingebetteter JARs werden gelesen.
CVE-2026-40477 | CVE-2026-41901 | |
|---|---|---|
| GHSA | GHSA-r4v4-5mwr-2fwr | GHSA-c9ph-gxww-7744 |
| CVSS | 9.0 | 9.0 |
| Betroffen | <= 3.1.3.RELEASE | <= 3.1.4.RELEASE |
| Fix | 3.1.4.RELEASE | 3.1.5.RELEASE |
| Offenlegung | 2026-04-15 | 2026-05-04 |
| Offizieller Wortlaut | "fails to properly restrict the scope of accessible objects" | "fails to properly neutralize specific constructs", tritt im sandboxed (restricted) Kontext auf |
Der betroffene Bereich des zweiten CVE umfasst 3.1.4, wer also gemäß dem ersten Advisory auf 3.1.4 aktualisiert hat, fällt unter den zweiten.
Aber das sollte man nicht als „offiziell nicht sauber gefixt" lesen —— die beiden Advisories beschreiben unterschiedliche Mechanismen,
und die beiden offiziellen Versionen 3.1.4 (2026-04-12) und 3.1.5 (2026-04-21) liegen neun Tage auseinander.
Kein offizieller Text besagt, dass der erste Fix unvollständig war. Dieses Tool stellt nur die Fakten nebeneinander, ohne dir diese Schlussfolgerung abzunehmen.
Jede Zahl in RuleTable.java lässt sich nachvollziehen:
python tools/gen_rules.py --show
Es gleicht die Entscheidungstabelle mit zwei Primärquellen ab —— den betroffenen Bereichen und der versionsweisen Auflistung von OSV sowie der
maven-metadata.xml von Maven Central —— bei Abweichungen wird mit einem Exit-Code ungleich null beendet.
Drei Vereinbarungen:
mvn package # JDK 17;target/thymeleaf-check-0.1.0.jar
mvn test # 19 Testfälle
Die Null-Abhängigkeit zur Laufzeit ist beabsichtigt: Ein Prüfwerkzeug muss in jede beliebige Umgebung geworfen und direkt ausgeführt werden können.
Apache-2.0