
Thymeleaf CVE-2026-40477 / CVE-2026-41901 オフライン調査ツール —— 依存関係ゼロ、単一 jar、オフライン動作。
CVSS 9.0 の SSTI バイパスが2件、9日間で修正版が2回リリースされました。まず「自分はどの CVE に該当するか」を判定し、 次により厄介な問いに答えます:
自分のバージョン系統に、アップグレード可能な修正版はあるか?
3.1.x にはあります(3.1.5.RELEASE に上げれば完了)。
3.0.x 以前にはありません —— そして、それが最も広く導入されている層です。
2件の advisory の影響範囲は、OSV ではどちらも 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"}]}]
つまり 3.0 系全体が影響範囲であり、バージョン別リストには 3.0.15.RELEASE から まで全て掲載されています。
一方、Maven Central 上の 3.0 系は しており、以降リリースはありません:
1.0.03.0.15.RELEASE で終了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>
両 CVE の修正版は 3.1 系にのみ存在します。 そのため 3.0.x ユーザーには「バージョン番号を変えるだけ」という選択肢はなく、
大規模バージョン系統間の移行が必要です —— そして 3.1 は公式に破壊的変更と明記されています(公式 ChangeLog.txt の 3.1.0.M1 節より抜粋):
- 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).
テンプレートで ${#request.…} / ${#session.…} を書いたことがある場合、アップグレードすると直接エラーになります。これらの値は Controller が Model に入れるように変更する必要があります。
これは計画が必要な移行であり、バージョン番号を変えるだけではありません。
deps.dev の依存数(2026-09-04 直接取得、誰でも再計算可能):
| バージョン | 依存数 | 該当 CVE | 同系統内でアップグレード可能か |
|---|---|---|---|
| 3.0.11.RELEASE | 1124 | 両方 | ❌ 3.0 系に修正版なし |
| 3.0.15.RELEASE | 678 | 両方 | ❌ 同上、かつこの系統の最終版 |
| 3.0.12.RELEASE | 641 | 両方 | ❌ |
| 3.1.3.RELEASE | 826 | 両方 | ✅ 3.1.5 にアップグレード |
| 3.1.2.RELEASE | 677 | 両方 | ✅ |
| 3.1.4.RELEASE | 70 | CVE-2026-41901 のみ | ✅ |
| 3.1.5.RELEASE | 590 | — | 安全 |
最も導入が多い単一バージョンは 3.0.11.RELEASE で、3.1 系で最も多い 3.1.3 より 36% 多く、しかも同系統内に出口がありません。
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 で終了)。
終了コード:2 = 同系統内に修正版がないバージョンのアーティファクトを検出 · 1 = 影響ありだが同系統内でアップグレード可能 / 判定不能 · 0 = 検出なし · 3 = 使い方またはパスのエラー。
CI に直接組み込めます。
ビルド成果物(target/*.jar、*.war)をスキャンし、ソースディレクトリはスキャンしないでください。
Thymeleaf はほとんどの場合 spring-boot-starter-thymeleaf によって推移的に導入されますが、starter 自体はバージョンを持ちません ——
pom には Thymeleaf のバージョン番号が一切見えません。この場合、ツールは「pom からは判定できない」と明示し、存在しないものとしては扱いません。
信頼性の高い順に3つの識別根拠:
Implementation-Version —— jar がリパッケージツールでリネームされても認識可能。
(Thymeleaf 公式 jar の META-INF/ には MANIFEST.MF のみで maven/ ディレクトリは存在しないため、これが最も確実な根拠です。)pom.propertiesfat jar / war 内の BOOT-INF/lib/、WEB-INF/lib/ は分解して個別に確認し、内包 jar の MANIFEST も読み取ります。
CVE-2026-40477 | CVE-2026-41901 | |
|---|---|---|
| GHSA | GHSA-r4v4-5mwr-2fwr | GHSA-c9ph-gxww-7744 |
| CVSS | 9.0 | 9.0 |
| 影響範囲 | <= 3.1.3.RELEASE | <= 3.1.4.RELEASE |
| 修正 | 3.1.4.RELEASE | 3.1.5.RELEASE |
| 開示 | 2026-04-15 | 2026-05-04 |
| 公式の原文 | "fails to properly restrict the scope of accessible objects" | "fails to properly neutralize specific constructs"、sandboxed (restricted) コンテキストで発生 |
2件目の影響範囲には 3.1.4 が含まれるため、1件目の advisory に従って 3.1.4 にアップグレードした人は、2件目の影響範囲に入ります。
ただし、これを「公式が修正しきれていない」と読まないでください —— 2件の advisory は異なるメカニズムを説明しており、
3.1.4(2026-04-12)と 3.1.5(2026-04-21)の公式リリースは9日間隔てており、
前の修正が不完全だったとする公式の記述は一切ありません。本ツールは事実を並べて提示するだけで、その結論を代わりに下すことはしません。
RuleTable.java の各数値はすべて遡って検証可能です:
python tools/gen_rules.py --show
これは2つの一次ソースと判定表を照合します —— OSV の影響範囲とバージョン別リスト、Maven Central の
maven-metadata.xml —— 一致しない場合は非ゼロで終了します。
3つの取り決め:
mvn package # JDK 17;target/thymeleaf-check-0.1.0.jar
mvn test # 19 テストケース
実行時の依存関係ゼロは意図的です:調査ツールはどんな環境にも放り込んですぐ実行できる必要があります。
Apache-2.0