如果你是搜「Spring 5.3.41」来的,先说结论:这个版本不存在。
Maven Central 上 org.springframework:spring-core 的 5.3 线,终版是 5.3.39。你可以自己验:
bash
# 阳性对照:这个存在
curl -sI https://repo1.maven.org/maven2/org/springframework/spring-core/5.3.39/spring-core-5.3.39.jar | head -1
# HTTP/1.1 200 OK
# 这个不存在
curl -sI https://repo1.maven.org/maven2/org/springframework/spring-core/5.3.41/spring-core-5.3.41.jar | head -1
# HTTP/1.1 404 Not Found
我把 5.3.36 到 5.3.50 逐个打了一遍(同一轮里带阳性对照 5.3.39 和哨兵 5.3.999,确保判据本身没坏):
markdown
5.3.36 200 5.3.41 404 5.3.46 404
5.3.37 200 5.3.42 404 5.3.47 404
5.3.38 200 5.3.43 404 5.3.48 404
5.3.39 200 5.3.44 404 5.3.49 404
5.3.45 404 5.3.50 404
5.3.40 往后,全是 404,中间没有间断。 spring-webmvc 和 spring-webflux 两个构件的结果完全一致。
一、真正奇怪的地方:官方自己开的处方也不存在
这才是我想说的重点。去 spring.io/security/ 翻 5.3 线相关的 CVE,官方的 Fix version 表是这么写的:
| CVE(部分) | 公告日期 | 官方给 5.3 线开的修复版 | Maven Central 实测 |
|---|---|---|---|
| CVE-2026-41843 / 41844 / 41846 / 41853 / 41848 | 2026-06-08 | 5.3.49 Enterprise Support Only |
🔴 404 |
| CVE-2025-41249 | 2025-09-15 | 5.3.45 Enterprise Support Only |
🔴 404 |
| CVE-2026-59313 / 59283 / 47891 / 47884 / 47892 | 2026-08-20 | 5.3.50 Enterprise Support Only |
🔴 404 |
三个不同的处方版本,一个都拿不到。
这里要说句公道话:这不是官方写错了 。那些版本确实被构建出来过,只是它们标着 Enterprise Support Only ------ 只发给买了商业支持的客户,不进公开的 Maven Central。所以对官方来说这张表是准的;对你来说,它指向的东西你拿不到。
这两件事的区别很重要,别混:
- 「版本不存在」→ 对公开仓库的使用者成立
- 「官方写错了」→ 不成立,别这么说
二、影响区间的上界也是不存在的版本
同一批 CVE,不同的官方源给的区间上界还不一样:
| 源 | 它说 5.3 线受影响到哪 | Central 实测 |
|---|---|---|
| spring.io(2026-06-08 那五条) | 0 - 5.3.48 |
🔴 5.3.48 不存在 |
| spring.io(2026-08-20 那批) | 5.3.0 - 5.3.49 |
🔴 5.3.49 不存在 |
| spring.io(CVE-2025-41249) | 0 - 5.3.44 |
🔴 5.3.44 不存在 |
| GitHub Advisory(同样那五条) | <= 5.3.39 |
✅ 与现实一致 |
| GitHub Advisory(CVE-2025-41249) | >= 5.3.0, <= 5.3.44 |
🔴 5.3.44 不存在 |
区间上界写一个未发布的版本号,语义上也不算错 ------ 它表达的是「到目前为止这条线全中」。但如果你照着这个数字去找版本,你会找不到。
顺带注意:同一条 CVE,spring.io 说上界 5.3.48,GitHub Advisory 说 5.3.39。 两个官方源对同一条线给的数字不一样。
三、中文资料里的处方,是真的写错了
前面两类只是「拿不到」,这一类不一样。中文技术社区里有讲 5.3.x 漏洞修复的文章,处方段原话是:
「Spring Framework 版本:5.3.0 至 5.3.41 之间的所有版本......(如从 5.3.20 升级到 5.3.42)」
5.3.41 和 5.3.42 都不存在 ,而这句话是处方------它在告诉你升到哪个版本。这个跟官方那种「区间上界写未发版本」不同,照着做是做不成的。
⚠️ 我没有证据说「有人搜 5.3.41 是因为读了这类文章」。搜索词表里没有来源信息,这两件事只是同时存在。别把它当成因果。
四、把八个来源并排摆一下
| 来源 | 它说的 5.3 版本 | Central |
|---|---|---|
| Maven Central 实际 | 终版 5.3.39 | ✅ |
| GitHub Advisory(2026-06-08 五条) | 区间 <= 5.3.39 |
✅ |
| GitHub Advisory(CVE-2025-41249) | 区间 <= 5.3.44 |
🔴 |
| spring.io(2026-06-08 五条) | 区间 5.3.48,处方 5.3.49 |
🔴 |
| spring.io(CVE-2025-41249) | 区间 5.3.44,处方 5.3.45 |
🔴 |
| spring.io(2026-08-20 那批) | 区间 5.3.49,处方 5.3.50 |
🔴 |
| 中文文章处方段 | 区间 5.3.41,处方 5.3.42 |
🔴 |
百度对 spring 5.3 的唯一联想词 |
Spring 5.3.41 |
🔴 |
七个不同的版本号 ------ 5.3.41、5.3.42、5.3.44、5.3.45、5.3.48、5.3.49、5.3.50 ------ 在公开仓库里一个都下载不到。
五、那到底该怎么办
先把话说清楚:5.3 线的 OSS 支持已于 2024-08-31 结束,商业支持到 2029-06-30。终版就是 5.3.39,不会再有公开发布的补丁版本。
所以真实的选项只有三个,没有第四个:
- 跨大版本升到 6.x / 7.x ------ 要过 Jakarta EE 命名空间(
javax.*→jakarta.*)和 JDK 17 两道坎,不是小升级 - 买商业支持 ------ 那些
Enterprise Support Only的版本就是给这条路的 - 不升,自己评估触发条件 ------ 下一节说这个
六、一个容易被忽略的点:你未必真的中了
这批 CVE 大多有很具体的触发条件。举几个实际的(条件来自官方描述原文):
- CVE-2026-41848 (AntPathMatcher ReDoS):要求攻击者能控制 pattern,不是控制 path。绝大多数应用的 pattern 是写死在代码里的。
- CVE-2026-41853 (Multipart 走私):要求你前面挡着一个会自己解析 multipart 并据此做检查的 WAF/代理。没有那道 WAF,就没有可以绕过的检查。
- CVE-2025-41249 (注解检测):官方原文明写 ------ 不用
@EnableMethodSecurity就不受影响,或者你没在泛型父类/泛型接口的方法上加安全注解也不受影响。 - CVE-2026-41843 (版本化静态资源路径穿越):要求你配了
VersionResourceResolver/resourceChain从文件系统提供静态资源。
🔴 但「没找到触发条件」不等于「你安全」 ------ 条件可能藏在第三方库里,可能由配置中心下发。措辞只能是「没找到」。
七、顺带解释一个你可能已经遇到的现象
如果你的扫描器接的是 NVD,你可能看到这批 CVE 里有几条挂着 CRITICAL 9.8 ,而 Spring 官方评的是 LOW / MEDIUM。
成因是可以直接验证的:厂商有没有自己给 CVE 记录提交 CVSS 分数。
我把 15 条 Spring / Tomcat CVE 的 NVD 评分来源逐条拉出来看:
- 7 条 评分来源是
security@vmware.com(厂商自评)→ 官方与 NVD 评级 7 条全部一致,零例外 - 8 条 厂商没提交分,由
CISA-ADP按最坏情况自动打分 → 8 条全部被打成 CRITICAL 9.x
这不是「官方在瞒你」,也不是「NVD 在瞎报」,是评分流程的结构性结果。厂商给了分就一致,没给才会被自动打成 9.8。
八、工具
我把这 15 条的判定做成了一个离线小工具,喂 jar 或目录,它会告诉你:你的版本中了哪几条、官方评多少分、NVD 评多少分及分是谁打的、触发条件是什么、以及官方叫你升的那个版本 Central 上到底有没有。
判定表由脚本从四个一手源生成(spring.io / tomcat.apache.org / NVD REST API / repo1.maven.org),不手抄,六条断言不过就拒绝出表。
拿真实的 spring-core-5.3.39.jar 跑,实际输出是这样(节选):
scss
== 版本命中 11 条 ==
-- CVE-2026-59313 ... 受影响 5.3.0 - 5.3.49
[差异] 官方 **LOW** <-> NVD **CRITICAL 9.8**
NVD 上那个分不是厂商给的,是 CISA-ADP 打的。
[升不了] 官方叫你升 5.3.50 ------ Maven Central 上没有这个版本(404)
-- CVE-2026-41843 ... 受影响 0 - 5.3.48
评级 官方 MEDIUM NVD MEDIUM 5.9(厂商自评,两边一致)
[升不了] 官方叫你升 5.3.49 ------ Maven Central 上没有这个版本(404)
== 汇总 ==
这 11 条里,11 条官方给的修复版在 Maven Central 上根本不存在。
九、边界(请一起读完)
- 本文只讲 Spring Framework 5.3 线,6.x / 7.x 的情况不同(那些线有 OSS 修复版)。
- 这批 CVE 的 GitHub Advisory 是
reviewed且带包信息的 ------ Dependabot 能正常告警。 本文说的不是「机器看不见」,而是「机器告诉你了,但它给不出一个你能拿到的出口」。 - 工具只覆盖上面那几批共 15 条,不是全量漏洞扫描器。
- 「未找到触发条件」不等于「不受影响」。
- 我没有统计有多少项目还在用 5.3 线 ------ 拿不到按版本线拆分的可靠口径,所以本文不给这个数字。