使用tabby分析rome反序列化链
字数 1404 2025-08-29 08:30:05

ROME反序列化链分析与利用指南

1. 分析环境与工具

  • ROME版本: 1.7
  • JDK版本: 8
  • 分析工具: Tabby 2.0

2. ROME反序列化链概述

ROME库中存在多个反序列化利用链,主要包括以下几种情况:

  1. ToStringBean利用链
  2. EqualsBean利用链
  3. BadAttributeValueExpException利用链
  4. JdbcRowSetImpl利用链

3. ToStringBean利用链分析

3.1 调用链路径

HashMap.readObject() -> EqualsBean.hashCode() -> EqualsBean.beanHashCode() -> ToStringBean.toString()

3.2 关键点分析

  1. Sink点: toString()函数
  2. Source点: HashMapreadObject方法

3.3 Tabby查询优化

初始查询可能无法直接找到目标链,需要逐步优化:

  1. 显式指定EqualsBean类,避免关联到其他类的hashCode方法
  2. 处理java.lang.Object#toStringToStringBean#toString的关联关系
  3. 添加alias关系来完善调用链

3.4 查询示例

/* 初始查询可能无法直接找到目标链 */
/* 需要显式指定EqualsBean类 */
FROM java.util.HashMap#readObject() AS source
MATCH source-[*]->(sink:Method {NAME:"toString"})
WHERE sink.CLASSNAME = "com.rometools.rome.feed.impl.ToStringBean"

3.5 POC示例

// ToStringBean POC示例代码
EqualsBean equalsBean = new EqualsBean(ToStringBean.class, new Object());
HashMap map = new HashMap();
map.put(equalsBean, "value");
// 序列化map对象进行利用

4. EqualsBean利用链分析

4.1 调用链路径

HashSet.readObject() -> EqualsBean.equals() -> EqualsBean.beanEquals()

4.2 关键点分析

  1. Sink点: EqualsBean.beanEquals方法
  2. Source点: HashSet.readObject方法

4.3 Tabby查询

FROM java.util.HashSet#readObject() AS source
MATCH source-[*]->(sink:Method {NAME:"beanEquals"})
WHERE sink.CLASSNAME = "com.rometools.rome.feed.impl.EqualsBean"

5. BadAttributeValueExpException利用链

5.1 特点

  • Source点变化: 使用BadAttributeValueExpException作为起点
  • Sink点不变: 仍然是ToStringBean.toString()

5.2 关键点

需要处理Object.toStringObjectBean.toString的关联关系,查询时可以限定具体类来减少干扰。

5.3 Tabby查询示例

FROM javax.management.BadAttributeValueExpException#readObject() AS source
MATCH source-[*]->(sink:Method {NAME:"toString"})
WHERE sink.CLASSNAME = "com.rometools.rome.feed.impl.ToStringBean"

6. JdbcRowSetImpl利用链分析

6.1 调用链路径

JdbcRowSetImpl.getDatabaseMetaData() -> JdbcRowSetImpl.connect() -> InitialContext.lookup()

6.2 关键点分析

  1. 利用JdbcRowSetImpl中的getter方法
  2. 不同于之前的TemplatesImpl利用链,这里通过JNDI注入实现利用

6.3 替代路径

com.sun.rowset.JdbcRowSetImpl#getParameterMetaData也可以调用到lookup方法,形成新的利用链。

6.4 Tabby查询示例

/* 主利用链查询 */
FROM com.sun.rowset.JdbcRowSetImpl#getDatabaseMetaData() AS source
MATCH source-[*]->(sink:Method {NAME:"lookup"})
WHERE sink.CLASSNAME = "javax.naming.InitialContext"

/* 替代利用链查询 */
FROM com.sun.rowset.JdbcRowSetImpl#getParameterMetaData() AS source
MATCH source-[*]->(sink:Method {NAME:"lookup"})
WHERE sink.CLASSNAME = "javax.naming.InitialContext"

7. 总结与防御建议

7.1 利用链总结

  1. ToStringBean链: 通过HashMap触发toString调用
  2. EqualsBean链: 通过HashSet触发equals调用
  3. BadAttributeValueExpException链: 通过异常对象触发toString
  4. JdbcRowSetImpl链: 通过JNDI注入实现远程代码执行

7.2 防御建议

  1. 升级ROME库到最新安全版本
  2. 限制反序列化操作,使用白名单机制
  3. 禁用危险的JNDI查找功能
  4. 使用安全工具检测和阻断恶意序列化数据

7.3 分析技巧

  1. 在Tabby分析时,需要逐步细化查询条件
  2. 注意处理父类方法到子类实现的多态关系
  3. 可以通过添加alias关系来完善调用链
  4. 同一类中可能存在多个可利用的入口点

通过深入理解这些利用链的原理和Tabby的分析方法,可以更好地发现和防御反序列化漏洞。

ROME反序列化链分析与利用指南 1. 分析环境与工具 ROME版本 : 1.7 JDK版本 : 8 分析工具 : Tabby 2.0 2. ROME反序列化链概述 ROME库中存在多个反序列化利用链,主要包括以下几种情况: ToStringBean利用链 EqualsBean利用链 BadAttributeValueExpException利用链 JdbcRowSetImpl利用链 3. ToStringBean利用链分析 3.1 调用链路径 3.2 关键点分析 Sink点 : toString() 函数 Source点 : HashMap 的 readObject 方法 3.3 Tabby查询优化 初始查询可能无法直接找到目标链,需要逐步优化: 显式指定 EqualsBean 类,避免关联到其他类的 hashCode 方法 处理 java.lang.Object#toString 到 ToStringBean#toString 的关联关系 添加alias关系来完善调用链 3.4 查询示例 3.5 POC示例 4. EqualsBean利用链分析 4.1 调用链路径 4.2 关键点分析 Sink点 : EqualsBean.beanEquals 方法 Source点 : HashSet.readObject 方法 4.3 Tabby查询 5. BadAttributeValueExpException利用链 5.1 特点 Source点变化 : 使用 BadAttributeValueExpException 作为起点 Sink点不变 : 仍然是 ToStringBean.toString() 5.2 关键点 需要处理 Object.toString 到 ObjectBean.toString 的关联关系,查询时可以限定具体类来减少干扰。 5.3 Tabby查询示例 6. JdbcRowSetImpl利用链分析 6.1 调用链路径 6.2 关键点分析 利用 JdbcRowSetImpl 中的getter方法 不同于之前的TemplatesImpl利用链,这里通过JNDI注入实现利用 6.3 替代路径 com.sun.rowset.JdbcRowSetImpl#getParameterMetaData 也可以调用到 lookup 方法,形成新的利用链。 6.4 Tabby查询示例 7. 总结与防御建议 7.1 利用链总结 ToStringBean链 : 通过 HashMap 触发 toString 调用 EqualsBean链 : 通过 HashSet 触发 equals 调用 BadAttributeValueExpException链 : 通过异常对象触发 toString JdbcRowSetImpl链 : 通过JNDI注入实现远程代码执行 7.2 防御建议 升级ROME库到最新安全版本 限制反序列化操作,使用白名单机制 禁用危险的JNDI查找功能 使用安全工具检测和阻断恶意序列化数据 7.3 分析技巧 在Tabby分析时,需要逐步细化查询条件 注意处理父类方法到子类实现的多态关系 可以通过添加alias关系来完善调用链 同一类中可能存在多个可利用的入口点 通过深入理解这些利用链的原理和Tabby的分析方法,可以更好地发现和防御反序列化漏洞。