高效挖掘反序列化漏洞——GadgetInspector改造
字数 2118 2025-08-29 08:31:35
高效挖掘反序列化漏洞——GadgetInspector改造教学文档
1. 反序列化漏洞背景
1.1 反序列化漏洞概述
- 2015年1月28日由Gabriel Lawrence和Chris Frohoff首次公开
- ysoserial工具成为Java反序列化漏洞利用的标准工具
- 7年后仍是Java安全漏洞中的高危类型,尤其在中间件和框架中
1.2 当前面临的问题
- 常见Gadget被防御措施限制
- 依赖版本更新导致原有Gadget失效
- 现有Gadget通常局限于单一依赖+JDK类组合
2. GadgetInspector介绍
2.1 基本概念
- 由网飞Platform Security Team的Ian Haken在2018年DEF CON 26发布
- 自动化挖掘反序列化利用链的工具
- 核心思想:使用ASM对Java类字节码进行污点分析
2.2 关键流程
2.2.1 信息收集
- 使用ASM的ClassReader读取类和方法信息
- 记录:全限定类名、类方法、方法名、方法描述符等
- 解析类继承关系、方法继承关系
- 使用DFS算法对方法调用链进行逆拓扑排序
2.2.2 污点分析
-
方法内污点传播
- 模拟栈顶数据打标记(入参索引)
- 在字段访问、方法调用等操作时判断污点传播
- 方法return时获取栈顶返回数据的污点标记
-
方法间污点传播
- 调用者方法入参索引作为污点
- 传播至被调用者入参
2.2.3 Source与Sink定义
-
Source点:
- 重写finalize方法
- 重写readObject方法
- InvocationHandler子类的invoke方法
- 重写equals/hashCode方法
- 特定包下的点(如Closure的call/doCall方法)
-
Sink点:
- FileInputStream/FileOutputStream创建与写出
- Runtime执行命令
- 反射调用
- URLClassLoader实例化
- URL建立连接
- 特定包下的利用点(如PyCode等)
2.2.4 反序列化链构造
- 从Source点方法出发
- 寻找能污染的方法
- 从方法和子类方法中继续寻找
- 直到遇到Sink点形成完整链
3. GadgetInspector改造(Gadgetor)
3.1 改造目标
- 挖掘多个依赖库组成的反序列化利用链
- 提高准确率,减少误报和漏报
3.2 关键改造点
3.2.1 继承方法处理
- 原问题:继承自父类的方法可能被忽略
- 解决方案:构造链时处理继承自父类的方法
3.2.2 路径爆炸问题
- 原问题:调用链过长且重复
- 解决方案:
- 去重处理
- 设置方法出现次数阈值
3.2.3 transient字段处理
- 原问题:完全忽略transient字段
- 新认识:transient字段仍可能通过自定义readObject/writeObject参与反序列化
- 解决方案:有条件地放宽对transient字段的限制
3.2.4 动态代理处理
- 关键角色:InvocationHandler
- 可作为Source点(如CC1链)
- 可作为Sink点(如Jdk7u21链)
- 可作为Chain(如CC3链)
- 解决方案:对InvocationHandler进行特殊处理
3.2.5 Agent技术加持
- 原问题:动态加载类无法纳入分析
- 解决方案:使用Java Agent获取运行系统中全部类
3.2.6 Sink/Source点增强
- 补充缺失的Sink/Source点
- 实现"Source点后置"和"Sink点前置"
- 已知利用点(如Transformer#transform)直接作为Sink
- 动态代理类直接使用InvocationHandler#invoke作为入口
3.2.7 反射处理
- 问题:反射调用导致误报
- Method对象可能来自成员变量
- Method对象可能来自Class#getMethod
- 解决方案:
- 人工后期审查
- 对反射Sink点特殊处理
4. 实践应用
4.1 测试效果
- 在开源项目中测试发现6个反序列化利用链
- 存在误报但确实有所收获
4.2 未来优化方向
- 结合中间件依赖进行挖掘
- 结合IAST自动化构造Payload
- 持续优化减少误报率
5. 关键知识点总结
-
反序列化链三要素:
- Kick-off(Source)
- Chain
- Sink
-
污点分析核心:
- 方法内传播:入参→返回值
- 方法间传播:调用者入参→被调用者入参
-
改造关键点:
- 正确处理继承方法
- 处理transient字段的特殊情况
- 动态代理的多角色处理
- Sink/Source点的智能前置/后置
-
误报控制策略:
- 路径去重和阈值限制
- 反射调用的特殊处理
- 人工审查环节
6. 学习资源
- 原始项目:https://github.com/iankronquist/gadgetinspector
- 参考文章:
- 《简单理解污点分析技术》by k0rz3n
- 《java反序列化利用链自动挖掘工具gadgetinspector源码浅析》by threedr3am
- 《Java 反序列化工具 gadgetinspector 初窥》by Longofo
- 《GadgetInspector源码分析》by fynch3r