先说结论,省得你翻:Tomcat 8.5.101 不存在。 8.5 线在 2024-03-31 EOL ,终版就是 8.5.100(2024-03-19 发布)。
实测(带阳性对照,先确认上一版在,再看这一版):
bash
https://repo1.maven.org/maven2/org/apache/tomcat/tomcat-catalina/8.5.100/ → 200 ← 阳性对照
https://repo1.maven.org/maven2/org/apache/tomcat/tomcat-catalina/8.5.101/ → 404
但这篇文章真正想说的不是「没有 8.5.101」。是下面这件事:
Apache 在 2025 年的 CVE 记录里,逐条声明过「8.5 也中招」------ 这样的条目有 14 条。而说这话的地方,是三个源里最少人去看的那一个。
一、14 条是怎么数出来的
Apache 官方 9.x 安全页里 CVE-2025-* 共 17 条。其中 14 条的描述里逐字写着:
The following versions were EOL at the time the CVE was created but are known to be affected: 8.5.x though 8.5.100
(原文如此 ------ 14 条里有 8 条把 through 拼成了 though。下界多数是 8.5.0,也有 8.5.6 / 8.5.44 / 8.5.60 / 8.5.90。)
剩下 3 条(CVE-2025-48976 / 48989 / 55668)上游没写 8.5,不算在内。
二、同样这 14 条,三个地方给你三个答案
| 你会去查的地方 | 你看到的 |
|---|---|
Apache 官方 8.5 安全页 (security-8.html) |
2025 年零条目 ------ 页面停在 2024-02-19 Fixed in Apache Tomcat 8.5.99 |
| NVD | 拿 8.5.100 按 cpe 查,14 条里只回得到 4 条 ;另 10 条的 cpe 配置里根本没有 8.5 |
| GitHub advisory | 14 条都在,但 8.5 那一侧的 first_patched_version 全是 null |
唯一完整说了这件事的,是 CVE.org 上 Apache 作为 CNA 提交的原始记录。
NVD 查得到的那 4 条是:CVE-2025-24813 / 55752 / 55754 / 61795。 查不到的 10 条:
| CVE | Apache(ASF 四档) | GitHub | 一句话 |
|---|---|---|---|
| CVE-2025-31650 | important | medium | 畸形 HTTP/2 PRIORITY_UPDATE 帧导致 DoS |
| CVE-2025-31651 | low | low | Rewrite Valve 规则绕过 |
| CVE-2025-46701 | low | low | CGI 脚本的安全约束绕过 |
| CVE-2025-48988 | important | high | FileUpload 大量带头部的 part 导致 DoS |
| CVE-2025-49124 | low | medium | Windows 安装程序 icacls.exe 侧加载 |
| CVE-2025-49125 | moderate | medium | Pre/PostResources 的安全约束绕过 |
| CVE-2025-52434 | important | medium | APR/Native 连接器崩溃导致 DoS |
| CVE-2025-52520 | low | high | multipart 上传整数溢出导致 DoS |
| CVE-2025-53506 | important | high | 连接建立初期过量 h2 流导致 DoS |
| CVE-2025-66614 | moderate | medium | 虚拟主机映射导致客户端证书校验绕过 |
🔴 这里陈述的是数据源之间的差异,不是某个产品的行为。 「你的扫描器会不会报这 10 条」取决于它读哪个库、怎么合并 ------ 那我没有实测过,所以不写。
三、顺带一个坑:同一条 CVE 有四个都为真的数字
上面那张表你可能已经看出别扭:CVE-2025-52520 Apache 评 low,GitHub 评 high。这不是谁写错了。
拿 CVE-2025-55754 举例,四个数字全是真的:
| 谁给的 | 值 |
|---|---|
| Apache(ASF 四档) | low |
| GitHub advisory | low |
| CVSS v3.1 | 9.6 CRITICAL |
| CVSS v4.0 | 2.1 |
同一条,v3.1 和 v4.0 差 7.5 分 。所以你搜到一篇标题写着「CVSS 9.6 高危深度解析」,和官方页上的 low,可以同时成立。
还有一层更细的:Apache 和 GitHub 用的不是同一套词表。 Apache 是 ASF 四档 low / moderate / important / critical,GitHub 是 low / medium / high / critical。 14 条里有 10 条两边写的词不一样。
对齐只做官方原文支持的那一步 ------ tomcat.apache.org/security-impact.html 原文写着 "Important (or High) ",所以 important = high 有依据;而 moderate 对不对得上 medium,官方没说(ASF 的 moderate 描述的是可利用性条件,GitHub 的 medium 是 CVSS 分数区间),那就不替它对齐。
按这个口径:实质不同 5 条 · 官方没说能不能对齐 2 条 · 相同 7 条。
四、另一半同样重要:14 条里默认配置就中招的只有 2 条
只按版本号报,等于把 12 条「要特定配置才成立」的也说成「你中了」------ 那是让你去做一件不必要的事。
默认即受影响的 2 条(上游原文没给任何前置条件):
- CVE-2025-48988(important / high)------ multipart 上传
- CVE-2025-61795(low / low)------ multipart 临时文件延迟清理
其余 12 条各自要什么:
| 触发条件 | 涉及 |
|---|---|
| 开了 HTTP/2 | 31650 53506 |
| 配了 Rewrite Valve | 31651 55752 |
| URI 映射到 CGI servlet | 46701 |
| 用 APR/Native 连接器 | 52434 |
| default servlet 开了写入 + partial PUT | 24813 |
| 配了 Pre/PostResources | 49125 |
| 「不常见的 multipart 配置」(原文如此) | 52520 |
| 多虚拟主机 + 客户端证书只在 Connector 层强制 | 66614 |
| 在支持 ANSI 转义序列的 Windows 控制台里跑 | 55754 |
| 用 Windows 安装程序装的(解压部署不适用) | 49124 |
五、那你能做什么
没有 8.5.101,所以选项就三个,而且都得自己拍:
- 升 9.0.x ------ 8.5 → 9.0 跨的是 Servlet 3.1 → 4.0,是所有升级路径里跨度最小的一条;具体改动量对着官方 migration 指南自己评估,我没有替你测过;
- 按上面那张表关掉你用不到的触发条件 ------ 12 条里大部分是「你根本没开」;
- 明知情地接受 ------ 至少现在你知道具体是哪 14 条、其中哪 2 条默认生效。
最糟的是第四种:以为「查不到 = 没事」------而上面那三个源里,有两个确实什么都不会告诉你。
六、我写了个工具把这一层摆出来
tomcat85-check ------ 零依赖单 jar,离线跑,不联网、不上传任何东西。
bash
java -jar tomcat85-check.jar /opt/tomcat # 传含 conf/ 的那一级
java -jar tomcat85-check.jar /opt/app/lib/catalina.jar
--all 连「版本不在区间内」的条目也列出来
--utf8 Windows 控制台中文乱码时加这个
给了安装目录时,它会读 conf/ 下全部 XML(含 conf/Catalina/<host>/),剥掉注释块 之后再找触发条件的标记 ------ 官方 server.xml 里 UpgradeProtocol 文本搜索命中 1 次,剥注释后是 0 次,整段是被注释掉的。
对官方 8.5.100 裸装跑出来:
默认即受影响 2 条 · 配置已确认 0 条 · 需人工确认 11 条 · 不适用 1 条
同一套打开 HTTP/2、RewriteValve、CGIServlet 之后,「配置已确认」变成 5 条。
两条设计上的纪律,顺便说明它的边界:
- 能确认开启,不能确认没开。 没找到标记时它的措辞是「在我看过的文件里没找到」,并明说这不等于没开(应用自己的
WEB-INF/web.xml、外部CATALINA_BASE、启动参数都可能开启)。所以它没有「不受影响」这个档位。 - 出现在官方默认配置里的东西,不能当确认依据。 第一版拿
AprLifecycleListener当「用了 APR」的证据,而官方默认server.xml里它本来就开着 ------ 那会让每一个默认安装都被虚报一条。
还有一件事它解决掉了:解压部署的 Tomcat,lib/ 下的 jar 文件名里一个版本号都没有 (是 catalina.jar 不是 catalina-8.5.100.jar)。只按文件名取版本的工具在这类部署上一条都认不出来,而「没扫到」看起来和「你很安全」一模一样。
仓库(含全部原始读数与复核脚本):github.com/xiaoqiMikko...
直接下 jar:github.com/xiaoqiMikko...