FastJson最新反序列化漏洞分析
字数 1728 2025-08-27 12:33:37

FastJson反序列化漏洞深度分析与防御指南

1. 漏洞概述

FastJson是阿里巴巴开源的一款高性能JSON库,自2017年以来多次被发现存在反序列化漏洞。最新爆出的绕过方法可以通杀1.2.48版本以下所有版本,有传言在autotype开启的情况下甚至可以影响到1.2.57版本。

漏洞危害等级:严重

2. 影响版本

  • 最初漏洞影响1.2.24及之前版本
  • 1.2.42-45版本之间存在多次绕过
  • 最新漏洞影响1.2.48以下所有版本(默认配置)
  • 开启autotype情况下可能影响至1.2.57版本

3. 漏洞原理分析

3.1 漏洞利用思路

攻击者通过java.lang.ClassJdbcRowSetImpl类加载到map缓存,从而绕过autotype的检测。攻击通常分为两个阶段:

  1. 第一次请求:加载恶意类到缓存
  2. 第二次请求:执行恶意代码

3.2 技术细节

3.2.1 漏洞入口

漏洞入口在parse方法,调用链如下:

parse -> DefaultJSONParser.checkAutoType

关键代码:

clazz = this.config.checkAutoType(typeName, (Class)null, lexer.getFeatures())

3.2.2 autotype开启情况下的绕过

当autotype开启时,checkAutoType方法采用黑名单机制:

  1. 对类名进行hash后与denyHashCodes进行比对
  2. 黑名单中的类可以通过loadClass方法加载并返回,从而绕过检测

已知黑名单类参考:fastjson-blacklist

3.2.3 autotype关闭情况下的绕过

当autotype关闭时,checkAutoType方法采用白名单机制:

  1. 通过getClassFromMapping尝试从缓存加载类
  2. 通过deserializers查找类
  3. 如果都不存在,则抛出异常

攻击者利用Class通过deserializers.findClass加载,然后将JdbcRowSetImpl类加载进map中,在第二次请求时成功绕过检测。

3.3 最终利用链

加载JdbcRowSetImpl后,利用以下调用链实现RCE:

JavaBeanDeserializer.deserialze 
-> FieldDeserializer.setValue 
-> 通过反射调用setAutoCommit方法给属性赋值 
-> JNDI connect
-> InitialContext.lookup
-> 请求攻击者的JNDI服务器下载并执行恶意代码

调用栈注意事项

  • 在Java 8u191及以上版本,需要结合Tomcat EL或LDAP绕过限制
  • 8u191以下版本可以通过LDAP Reference绕过对RMI从远程Codebase加载Reference工厂类的限制

4. 漏洞修复方案

4.1 官方修复措施

在1.2.48版本中,修复措施包括:

  1. loadClass时将缓存开关默认置为false,默认不能通过Class加载进缓存
  2. Class类加入黑名单

4.2 推荐解决方案

  1. 升级FastJson:升级到最新1.2.58或更高版本
  2. 关闭autotype:采用默认的关闭autotype配置

5. 防御建议

  1. 严格输入验证:对所有JSON输入进行严格验证
  2. 最小权限原则:运行FastJson的应用程序应使用最小必要权限
  3. 网络隔离:限制应用程序的出站连接,防止JNDI/LDAP攻击
  4. Java环境加固:升级到最新Java版本(8u191以上),并应用相关安全补丁
  5. 监控与日志:实施严格的日志记录和监控,检测可疑的反序列化活动

6. 高级绕过技术参考

对于高版本Java环境中的JNDI注入绕过技术,参考:JNDI Manipulations RCE Restrictions and Bypass

7. 测试与验证

如需验证系统是否受影响,可以使用以下方法:

  1. 检查FastJson版本
  2. 检查autotype配置状态
  3. 使用已知无害的测试payload验证反序列化行为

注意:实际漏洞利用测试应在授权环境下进行,避免违反法律法规。

8. 相关资源

  1. FastJson官方安全公告:https://github.com/alibaba/fastjson/wiki/security_update_20170315
  2. FastJson黑名单项目:https://github.com/LeadroyaL/fastjson-blacklist
  3. JNDI注入限制与绕过:https://kingx.me/Restrictions-and-Bypass-of-JNDI-Manipulations-RCE.html
FastJson反序列化漏洞深度分析与防御指南 1. 漏洞概述 FastJson是阿里巴巴开源的一款高性能JSON库,自2017年以来多次被发现存在反序列化漏洞。最新爆出的绕过方法可以通杀1.2.48版本以下所有版本,有传言在autotype开启的情况下甚至可以影响到1.2.57版本。 漏洞危害等级 :严重 2. 影响版本 最初漏洞影响1.2.24及之前版本 1.2.42-45版本之间存在多次绕过 最新漏洞影响1.2.48以下所有版本(默认配置) 开启autotype情况下可能影响至1.2.57版本 3. 漏洞原理分析 3.1 漏洞利用思路 攻击者通过 java.lang.Class 将 JdbcRowSetImpl 类加载到map缓存,从而绕过autotype的检测。攻击通常分为两个阶段: 第一次请求 :加载恶意类到缓存 第二次请求 :执行恶意代码 3.2 技术细节 3.2.1 漏洞入口 漏洞入口在 parse 方法,调用链如下: 关键代码: 3.2.2 autotype开启情况下的绕过 当autotype开启时,checkAutoType方法采用黑名单机制: 对类名进行hash后与denyHashCodes进行比对 黑名单中的类可以通过loadClass方法加载并返回,从而绕过检测 已知黑名单类参考: fastjson-blacklist 3.2.3 autotype关闭情况下的绕过 当autotype关闭时,checkAutoType方法采用白名单机制: 通过 getClassFromMapping 尝试从缓存加载类 通过 deserializers 查找类 如果都不存在,则抛出异常 攻击者利用 Class 通过 deserializers.findClass 加载,然后将 JdbcRowSetImpl 类加载进map中,在第二次请求时成功绕过检测。 3.3 最终利用链 加载 JdbcRowSetImpl 后,利用以下调用链实现RCE: 调用栈注意事项 : 在Java 8u191及以上版本,需要结合Tomcat EL或LDAP绕过限制 8u191以下版本可以通过LDAP Reference绕过对RMI从远程Codebase加载Reference工厂类的限制 4. 漏洞修复方案 4.1 官方修复措施 在1.2.48版本中,修复措施包括: 在 loadClass 时将缓存开关默认置为false,默认不能通过Class加载进缓存 将 Class 类加入黑名单 4.2 推荐解决方案 升级FastJson :升级到最新1.2.58或更高版本 关闭autotype :采用默认的关闭autotype配置 5. 防御建议 严格输入验证 :对所有JSON输入进行严格验证 最小权限原则 :运行FastJson的应用程序应使用最小必要权限 网络隔离 :限制应用程序的出站连接,防止JNDI/LDAP攻击 Java环境加固 :升级到最新Java版本(8u191以上),并应用相关安全补丁 监控与日志 :实施严格的日志记录和监控,检测可疑的反序列化活动 6. 高级绕过技术参考 对于高版本Java环境中的JNDI注入绕过技术,参考: JNDI Manipulations RCE Restrictions and Bypass 7. 测试与验证 如需验证系统是否受影响,可以使用以下方法: 检查FastJson版本 检查autotype配置状态 使用已知无害的测试payload验证反序列化行为 注意 :实际漏洞利用测试应在授权环境下进行,避免违反法律法规。 8. 相关资源 FastJson官方安全公告:https://github.com/alibaba/fastjson/wiki/security_ update_ 20170315 FastJson黑名单项目:https://github.com/LeadroyaL/fastjson-blacklist JNDI注入限制与绕过:https://kingx.me/Restrictions-and-Bypass-of-JNDI-Manipulations-RCE.html