有人在搜一个不存在的 Tomcat 版本

先说结论,省得你翻: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,所以选项就三个,而且都得自己拍:

  1. 升 9.0.x ------ 8.5 → 9.0 跨的是 Servlet 3.1 → 4.0,是所有升级路径里跨度最小的一条;具体改动量对着官方 migration 指南自己评估,我没有替你测过;
  2. 按上面那张表关掉你用不到的触发条件 ------ 12 条里大部分是「你根本没开」;
  3. 明知情地接受 ------ 至少现在你知道具体是哪 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.xmlUpgradeProtocol 文本搜索命中 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...


相关推荐
用户3126874877204 小时前
ConcurrentHashMap 怎么保证线程安全?从分段锁到 CAS+synchronized
java
vipxieliang4 小时前
ValidX vs Apache Commons Validator:功能与性能对比
java·spring boot
SimonKing4 小时前
升级Spring Boot 4后,从 Jackson 2 到 3,到底有哪些变化
java·后端·程序员
吃饱了得干活4 小时前
一篇讲清楚Spring Boot:自动装配、启动器、过滤器、拦截器、设计模式
java·spring boot·后端
lhldsg6 小时前
AI零售系统实战指南:从架构设计到落地部署全解析
java·人工智能·小程序·uni-app·零售
Interview Aid1126 小时前
TikTok OA 四题分享|半小时内 AC,题目基本都是实现题
java·开发语言·算法·面试·职场和发展
mldong6 小时前
换了工作流引擎,前端一行代码没改
java·架构
微尘寒风14 小时前
【Git】的安装和使用
java·git
y = xⁿ14 小时前
DeepSeek Harness 学习日记:关于Agent接口,工具调用的底层实现
android·java·学习