Fastjson 1.2.83 默认配置下的远程代码执行漏洞
Fastjson在将@type值转换为类加载路径时,执行了replace('.', '/')操作。攻击者利用..在此操作下会变成//的特性,成功注入jar:http://attacker/evil.jar这样的远程JAR URL。结合Spring Boot的LaunchedURLClassLoader加载远程资源,并通过在恶意类中植入@JSONType注解绕过AutoType检查,最终在defineClass时触发<clinit>静态代码块执行任意命令。
这是一个范式级别的漏洞,它彻底改变了Fastjson漏洞的利用模式,从“依赖目标环境已有的Gadget”转变为“攻击者自给自足,远程加载恶意类”。
一、漏洞核心原理 (一句话概括)
Fastjson在将@type值转换为类加载路径时,执行了replace('.', '/')操作。攻击者利用..在此操作下会变成//的特性,成功注入jar:http://attacker/evil.jar这样的远程JAR URL。结合Spring Boot的LaunchedURLClassLoader加载远程资源,并通过在恶意类中植入@JSONType注解绕过AutoType检查,最终在defineClass时触发<clinit>静态代码块执行任意命令。
二、为什么它如此“特别”?
- 默认配置即可RCE:这是首个在
AutoType=OFF(绝大多数生产环境配置)下实现完整RCE的漏洞,影响面极广。 - 零依赖:不再需要目标Classpath中存在任何特定的第三方库(如commons-io等),攻击完全自包含。
- 信任模型被颠覆:
@JSONType注解本意是标记“可信类”以优化性能,现在却被攻击者用作绕过所有安全校验的“通行证”。 - “算法语义劫持”:漏洞并非传统注入,而是巧妙地利用了一个看似无害的字符串归一化函数(
.→/),将其结果“编码”成了一个合法的远程URL,极具隐蔽性。 - 执行链路极短:利用JVM类加载机制,
defineClass即触发<clinit>执行,无需任何后续方法调用,可靠性极高。
三、核心机制与绕过路径
| 安全机制 | 绕过方式 |
|---|---|
| 黑名单检查 | 类型名以jar:http: 开头,完全不在任何已知危险包名的黑名单内。 |
| AutoType=OFF | 恶意类字节码中携带@JSONType 注解,使框架将其标记为 jsonType=true,硬编码跳过检查。 |
| 期望类型检查 | 当jsonType=true 时,checkAutoType() 方法会直接返回,跳过 expectClass 的兼容性校验。 |
| JDK 9+ 类名校验 | 采用两阶段攻击:第一阶段触发JAR下载并缓存至/tmp,第二阶段通过/proc/self/fd/引用缓存文件,从而绕过对类名(含://)的合法性检查。 |
四、攻击影响与防护
- 影响范围:Fastjson
1.2.66至1.2.83版本,运行于Linux系统下的Spring Boot应用(使用LaunchedURLClassLoader)。 - 根本修复:
- 升级至Fastjson 2.x版本。
- 开启
SafeMode。 - 升级Spring Boot至3.2+版本(移除了有问题的
jar:协议处理器)。
- 临时缓解:
- 使用WAF拦截
@type值中包含jar:、http:等协议特征的请求。 - 在网络层面限制JVM进程的对外连接,可将RCE降级为SSRF。
- 使用WAF拦截
五、总结
这个漏洞不仅仅是一个新的CVE,它代表了Fastjson安全模型的一次根本性失败。它证明了在复杂的字符串处理和类加载机制下,即使是简单、无害的操作(如字符替换)也可能被武器化,从而颠覆整个框架的安全基石。攻击者不再需要“寻找”武器,而是可以“创造”武器。
- 标题: Fastjson 1.2.83 默认配置下的远程代码执行漏洞
- 作者: RestXtra
- 创建于 : 2026-07-25 18:24:26
- 更新于 : 2026-07-25 18:25:21
- 链接: https://restxtra.github.io/2026/07/25/2026-07-25-Fastjson-1-2-83-默认配置下的远程代码执行漏洞/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。