高效挖掘反序列化漏洞——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 当前面临的问题

  1. 常见Gadget被防御措施限制
  2. 依赖版本更新导致原有Gadget失效
  3. 现有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 污点分析

  1. 方法内污点传播

    • 模拟栈顶数据打标记(入参索引)
    • 在字段访问、方法调用等操作时判断污点传播
    • 方法return时获取栈顶返回数据的污点标记
  2. 方法间污点传播

    • 调用者方法入参索引作为污点
    • 传播至被调用者入参

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点增强

  1. 补充缺失的Sink/Source点
  2. 实现"Source点后置"和"Sink点前置"
    • 已知利用点(如Transformer#transform)直接作为Sink
    • 动态代理类直接使用InvocationHandler#invoke作为入口

3.2.7 反射处理

  • 问题:反射调用导致误报
    • Method对象可能来自成员变量
    • Method对象可能来自Class#getMethod
  • 解决方案:
    • 人工后期审查
    • 对反射Sink点特殊处理

4. 实践应用

4.1 测试效果

  • 在开源项目中测试发现6个反序列化利用链
  • 存在误报但确实有所收获

4.2 未来优化方向

  1. 结合中间件依赖进行挖掘
  2. 结合IAST自动化构造Payload
  3. 持续优化减少误报率

5. 关键知识点总结

  1. 反序列化链三要素

    • Kick-off(Source)
    • Chain
    • Sink
  2. 污点分析核心

    • 方法内传播:入参→返回值
    • 方法间传播:调用者入参→被调用者入参
  3. 改造关键点

    • 正确处理继承方法
    • 处理transient字段的特殊情况
    • 动态代理的多角色处理
    • Sink/Source点的智能前置/后置
  4. 误报控制策略

    • 路径去重和阈值限制
    • 反射调用的特殊处理
    • 人工审查环节

6. 学习资源

  1. 原始项目:https://github.com/iankronquist/gadgetinspector
  2. 参考文章:
    • 《简单理解污点分析技术》by k0rz3n
    • 《java反序列化利用链自动挖掘工具gadgetinspector源码浅析》by threedr3am
    • 《Java 反序列化工具 gadgetinspector 初窥》by Longofo
    • 《GadgetInspector源码分析》by fynch3r
高效挖掘反序列化漏洞——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