Fastjson 1.x 无 gadget RCE 漏洞:终版沦陷且无补丁可修

Fastjson 1.x 曝出无 gadget 高危 RCE 漏洞

安全研究员 Kirill Firsov(安全团队 FearsOff 成员)于 2026 年 7 月 19 日披露了一个新的 Fastjson 远程代码执行漏洞。该漏洞影响 Fastjson 1.2.68 至 1.2.83 全部版本,1.2.83 是 Fastjson 1.x 系列的最终版本。

Fastjson GitHub 仓库已于 2024 年 10 月归档

和之前的 Fastjson 漏洞有什么不同

Fastjson 的反序列化漏洞由来已久,但此前每一次利用都有一道门槛:要么需要 autoType 处于开启状态,要么需要目标应用的 classpath 中存在可用的 gadget 类。

Firsov 披露的这个新漏洞打破了两道防线。根据其描述,攻击者无需依赖 classpath 中的任何 gadget,一个 payload 即可实现远程代码执行,且在 JDK 8、JDK 17、JDK 21 上均复现成功。这意味着此前认为"关闭 autoType 或使用 1.2.83 安全版本即可高枕无忧"的判断不再成立。

Fastjson 漏洞史:一场拉锯战

Fastjson 的安全问题可以追溯到 2017 年。CVE-2017-18349 首次揭示了 autoType 功能的危险性:当 JSON 文档中出现 @type 键时,Fastjson 会实例化对应的 Java 类并调用其方法。autoType 默认开启时,攻击者可通过 JNDI 注入实现远程代码执行,利用门槛极低。

此后是漫长的攻防拉锯:

  • 1.2.25 之前:autoType 默认开启。CVE-2017-18349(JNDI 注入 RCE),CVSS 9.8。
  • 1.2.25 至 1.2.47:引入黑名单机制拦截已知危险类,攻击者不断发现新 gadget 绕过。
  • 1.2.48:修复 autoType 安全检查的绕过路径(CVE-2025-70974 追溯覆盖至此前版本)。
  • 1.2.68:引入 SafeMode,彻底关闭 autoType 功能作为终极防御手段。
  • 1.2.80 至 1.2.82:CVE-2022-25845,通过 Exception/Throwable 子类绕过 autoType 限制。JFrog 研究员 Uriya Yavnieli 指出,利用此路径需要目标应用 classpath 中存在特定的 gadget 类,实际利用条件受到限制。
  • 1.2.83:修复 CVE-2022-25845(CVSS 9.8),被视为 1.x 系列的安全终点站。
  • 2024 年 10 月 23 日:阿里巴巴将 GitHub 仓库归档,只读模式。

如今终点站也沦陷了。

无补丁困境

问题的严重性在于时间点。阿里巴巴于 2024 年 10 月 23 日将 Fastjson 1.x 的 GitHub 仓库归档,设为只读模式。25.6k stars 的项目正式停止维护。这意味着此次漏洞极大概率不会获得官方安全补丁。

Fastjson 1.x 在 Java 生态中的部署量极为庞大。根据 Snyk 的漏洞数据库,受 CVE-2022-25845 影响的项目超过 5000 个 Maven 仓库。此次新漏洞的影响范围覆盖 1.2.68 至 1.2.83 全部版本,实际暴露面可能更大。大量遗留系统、内部框架、第三方组件仍以传递依赖的方式引用 Fastjson 1.x,排查难度不容低估。

补救措施

Firsov 指出,唯一有效的补救措施有两条路径。

第一,迁移至 Fastjson2。

Fastjson2 对代码进行了重写,废弃了 1.x 的兼容性白名单机制,安全性和性能均有提升。Maven 坐标从 com.alibaba:fastjson 切换为 com.alibaba.fastjson2:fastjson2。两代版本并非完全兼容,迁移前需进行充分的回归测试。官方提供了升级指南(fastjson 1.x User Upgrade Guide)。

第二,启用 SafeMode。

在应用启动参数或配置文件中加入:

java
ParserConfig.getGlobalInstance().setSafeMode(true);

SafeMode 从 1.2.68 版本开始提供,启用后会彻底禁用所有 @type 反序列化行为。如果业务代码依赖 autoType 特性进行动态类型反序列化,启用 SafeMode 可能导致功能异常,上线前必须充分验证兼容性。

排查清单

  1. 在项目构建文件中检索 com.alibaba:fastjson 依赖,确认版本号
  2. Maven 项目检查 pom.xml,Gradle 项目检查 build.gradle
  3. 执行 find . -name "fastjson*.jar" 定位实际引用的 jar 包
  4. 检查传递依赖:mvn dependency:tree | grep fastjsongradle dependencies | grep fastjson
  5. 对于无法立即升级的服务,优先启用 SafeMode 作为临时缓解措施

来源:Kirill Firsov (@k_firsov) · FearsOff Cybersecurity · GitHub alibaba/fastjson