文章总结: 复旦大学Secsys实验室与约翰霍普金斯大学联合研究团队在BlackHatAsia2025发布了JDD工具,通过片段化摘要与自底向上搜索技术解决Java反序列化漏洞中Gadget链挖掘的路径爆炸问题,结合注入对象约束图与定向模糊测试突破复杂对象约束难题,发现了fastjson2组件的0day利用链,为Java反序列化漏洞自动化研究提供了重要解决方案。
综合评分: 92
文章分类: 漏洞分析,代码审计,渗透测试,安全工具,应用安全
BlackHat Asia 2025:Java 反序列化利用链深度挖掘
原创
罗棋琛 Max Luo
白帽子罗棋琛
2025年7月20日 12:51
江苏
引言
“本次研究由复旦大学 Secsys 实验室与约翰霍普金斯大学联合完成,核心成员包括复旦大学博士生 Bofei Chen(专注程序分析与漏洞利用)、约翰霍普金斯大学副教授 Yinzhi Cao(Web 与机器学习安全领域专家),以及复旦大学 Secsys 实验室的 Lei Zhang、Xinyou Huang、YuanZhang、Min Yang 等学者,团队在程序分析与漏洞研究领域具有深厚积累。该研究成果以《JDD: In-depth Mining of Java Deserialization Gadget Chain via Bottom-up Gadget Search and Dataflow aided Payload Construction》为题,在 2025年BlackHat Asia 大会上发布,聚焦 Java 反序列化漏洞中 Gadget 链的自动化挖掘与利用技术。”
01
Java 反序列化漏洞原理与危害
—
Java 序列化与反序列化是一对互逆过程,用于对象状态的持久化与传输。反序列化漏洞的核心在于:攻击者通过构造恶意序列化数据,可操控反序列化流程,触发预先设计的方法调用链(Gadget 链),最终实现远程代码执行等高危攻击。以 HashMap 与恶意类构陷为例,攻击者可通过如下方式构建利用链:
// 恶意类定义public class EvilExample{ public String cmd; public boolean equals(Object o){ // 触发命令执行 Runtime.getRuntime().exec(((EvilExample)o).cmd); return true; }}// HashMap.put方法在反序列化时的调用链public class HashMap { Node<K,V>[] table; public void put(K key, V value){ // 调用key的equals方法 key.equals(value); }}
当恶意构造的 HashMap 对象被反序列化时,put方法会触发EvilExample类的equals方法,进而执行攻击者控制的命令。这类漏洞可导致远程代码执行(RCE)、数据篡改等严重后果,且因 Java 序列化机制在框架与组件中的广泛应用(如 RMI、HTTP 会话),防御难度极大。
02
Gadget 链挖掘的核心难题
—
1、静态路径激增问题
动态方法调用(如多态、反射)导致代码路径呈指数级增长。例如,仅Object.equals方法的重写类就可能多达数千个,传统自上而下的搜索方式难以覆盖有效路径。
2、复杂对象字段关系
注入对象的字段间存在并行嵌套结构与依赖约束。以 WebLogic 漏洞为例,利用链需满足:
// 字段约束示例public class ServerTableEntry{ private String activationCmd; private int state; // 需为ACTIVATED(2) private int activateRetryCount; // 需小于ActivationRetryMax(5)
synchronized boolean isValid(){ if (state == ACTIVATED && activateRetryCount < 5) { activate(); // 触发命令执行 } }}
字段state与activateRetryCount的取值约束直接决定利用链能否触发,手动构造或传统工具难以精准满足这类条件。
3、JDD自底向上搜索与数据流辅助方案
3.1 片段化摘要与自底向上链搜索
JDD 将完整 Gadget 链拆分为以动态方法调用为边界的片段(Fragment),每个片段包含头部(入口方法)、尾部(动态方法调用或敏感方法)及摘要信息(污点传播关系、链接条件)。例如,HashMap.put相关片段定义为:
# Fragment 1head: HashMap.putbody: HashMap.putValend: Object.equalstaint: key -> equals参数
通过自底向上从敏感方法(如Runtime.exec)反向链接片段,JDD 将搜索复杂度从指数级O(e·Mⁿ)降至多项式级O(n³·M²),大幅提升效率。
3.2 数据流辅助构建注入对象
JDD 通过注入对象约束图(IOCD) 描述对象结构与字段依赖,并结合定向模糊测试生成有效 Payload:
- 类层级约束:如
HashMap.table字段需存储SimpleEntry实例 - 条件分支约束:如
ServerTableEntry.state == 2 字段依赖:如``as1.hashCode() == as2.hashCode()(哈希碰撞条件)
模糊测试阶段采用依赖感知变异策略:
// 针对字段类型的变异示例if (field.getType() == String.class && constraint.startsWith("cmd=")) { // 保留命令注入格式 mutateField(field, "cmd=calc.exe"); } else if (field.getType() == int.class && constraint.contains("<5")) { // 满足数值约束 mutateField(field, randomInt(0,4)); }
通过静态分析指导动态变异,JDD 可高效生成满足复杂约束的注入对象。
03
实验成果与新发现
—
1、性能评估
在 Ysoserial 基准测试中,JDD 的表现远超同类工具:
- 检测到 1362 条候选链,经动态验证 116 条有效(含 91 条未知链)
- 静态误报率从 91.5% 降至 0%,在 WebLogic 中发现 126 条有效链
#
2、0day漏洞与高价值片段
JDD 发现的fastjson2组件利用链可影响 Sofa、Solon 等主流框架:
# Fragment 1: HashMap.put → HashMap.putVal# Fragment 4: fastjson2.JSONObject.toString → JSONWriter.write# Fragment 7: FieldWriterObject.write → Method.invoke# Fragment 9: ServerTableEntry.activate → Runtime.exec
该链仅依赖 JDK 与 fastjson2,无需额外组件即可触发 RCE。此外,团队还公开了Comparator.compare、Object.toString等高复用片段,为后续研究提供关键指导方向。
04
研究结论
—
JDD 通过片段化摘要与自底向上搜索解决了路径爆炸问题,结合 IOCD 与定向模糊测试突破了复杂对象约束难题。其研究为 Java 反序列化漏洞研究提供了自动化解决方案,所发现的0day链与技术思路对安全防御具有重要参考价值,核心代码参考详见Secsys 实验室开源项目(https://github.com/fdu-sec/JDD)。
(注:所有技术细节基于 BlackHat Asia 2025 公开资料)
附PPT:
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:白帽子罗棋琛 罗棋琛 Max Luo《BlackHat Asia 2025:Java 反序列化利用链深度挖掘》