tabby+vaadin反序列链挖掘
字数 1342 2025-08-29 08:29:58

Tabby+Vaadin反序列化漏洞链挖掘与分析

1. 环境准备

  • 分析环境:
    • Vaadin版本: vaadin-server-7.7.14, vaadin-shared-7.7.14
    • JDK版本: jdk1.8.0_201
    • 分析工具: Tabby2.0

2. 基础概念

2.1 反序列化漏洞链组成

反序列化漏洞链通常由三部分组成:

  1. 触发点(Source): 反序列化入口点
  2. 传递链(Gadget Chain): 一系列方法调用链
  3. 执行点(Sink): 最终的危险操作点

2.2 Vaadin框架中的关键类

  • BadAttributeValueExpException: JDK中的类,常用于触发反序列化
  • TemplatesImpl: JDK中的类,可用于代码执行

3. 漏洞链分析

3.1 已有链分析

引用ysoserial中的链,主要关注从Vaadin依赖中getValue到sink点的调用链。

3.2 新漏洞链挖掘

使用Tabby工具筛选发现两条潜在利用点:

3.2.1 JNDI注入链

路径: com.vaadin.data.util.sqlcontainer.connection.J2EEConnectionPool#lookupDataSource

  • 参数可控
  • 可造成JNDI注入

调用链分析:

  1. lookupDataSource出发
  2. 初始分析最多调用2层,3层无调用链
  3. 问题原因: J2EEConnectionPool#reserveConnection实现了JDBCConnectionPool#reserveConnection接口
  4. 解决方案: 手动添加别名关系

3.2.2 JDBC注入链

路径: com.vaadin.data.util.sqlcontainer.connection.SimpleJDBCConnectionPool#createConnection

  • 参数可控
  • 可造成JDBC注入

调用链分析:

  1. createConnection出发
  2. 存在多条分支,但最终sink点相同

4. 详细调用链构建

4.1 JNDI注入完整调用链

[调用链起点]
↓
com.vaadin.data.util.sqlcontainer.connection.J2EEConnectionPool#lookupDataSource
↓
[通过接口调用]
com.vaadin.data.util.sqlcontainer.connection.JDBCConnectionPool#reserveConnection
↓
[其他调用]
...
[最终JNDI注入点]

4.2 JDBC注入完整调用链

[调用链起点]
↓
com.vaadin.data.util.sqlcontainer.connection.SimpleJDBCConnectionPool#createConnection
↓
[分支1]
...
↓
[分支2]
...
↓
[最终JDBC注入点]

5. 关键问题解决

5.1 接口调用问题

当遇到接口实现关系导致调用链断裂时:

  1. 识别接口实现关系
  2. 手动添加别名关系
  3. 重新查询接口的调用

5.2 调用链验证要点

  1. 限定初始调用函数条件(如name=getValue)
  2. 逐步增加CALL深度
  3. 分析参数可控性
  4. 检查调用链是否可执行

6. POC构造

6.1 JNDI注入POC

// 示例代码结构
BadAttributeValueExpException bad = new BadAttributeValueExpException(null);
// 构造调用链对象
// ...
// 触发JNDI注入

6.2 JDBC注入POC

// 示例代码结构
BadAttributeValueExpException bad = new BadAttributeValueExpException(null);
// 构造调用链对象
// ...
// 触发JDBC注入

7. 防御建议

  1. 升级Vaadin到安全版本
  2. 限制反序列化操作
  3. 使用安全的白名单机制
  4. 监控JNDI和JDBC相关操作

8. 工具使用技巧

Tabby使用要点:

  1. 使用封装好的sink点进行筛选
  2. 对复杂调用关系添加手动别名
  3. 合理设置查询条件和深度
  4. 结合代码审计验证自动分析结果

9. 总结

通过Tabby工具分析Vaadin框架,成功挖掘出两条新的反序列化利用链,分别导致JNDI注入和JDBC注入漏洞。关键在于处理接口调用关系和验证参数可控性,这为类似框架的反序列化漏洞挖掘提供了参考方法。

Tabby+Vaadin反序列化漏洞链挖掘与分析 1. 环境准备 分析环境 : Vaadin版本: vaadin-server-7.7.14, vaadin-shared-7.7.14 JDK版本: jdk1.8.0_ 201 分析工具: Tabby2.0 2. 基础概念 2.1 反序列化漏洞链组成 反序列化漏洞链通常由三部分组成: 触发点(Source) : 反序列化入口点 传递链(Gadget Chain) : 一系列方法调用链 执行点(Sink) : 最终的危险操作点 2.2 Vaadin框架中的关键类 BadAttributeValueExpException : JDK中的类,常用于触发反序列化 TemplatesImpl : JDK中的类,可用于代码执行 3. 漏洞链分析 3.1 已有链分析 引用ysoserial中的链,主要关注从Vaadin依赖中 getValue 到sink点的调用链。 3.2 新漏洞链挖掘 使用Tabby工具筛选发现两条潜在利用点: 3.2.1 JNDI注入链 路径 : com.vaadin.data.util.sqlcontainer.connection.J2EEConnectionPool#lookupDataSource 参数可控 可造成JNDI注入 调用链分析 : 从 lookupDataSource 出发 初始分析最多调用2层,3层无调用链 问题原因: J2EEConnectionPool#reserveConnection 实现了 JDBCConnectionPool#reserveConnection 接口 解决方案: 手动添加别名关系 3.2.2 JDBC注入链 路径 : com.vaadin.data.util.sqlcontainer.connection.SimpleJDBCConnectionPool#createConnection 参数可控 可造成JDBC注入 调用链分析 : 从 createConnection 出发 存在多条分支,但最终sink点相同 4. 详细调用链构建 4.1 JNDI注入完整调用链 4.2 JDBC注入完整调用链 5. 关键问题解决 5.1 接口调用问题 当遇到接口实现关系导致调用链断裂时: 识别接口实现关系 手动添加别名关系 重新查询接口的调用 5.2 调用链验证要点 限定初始调用函数条件(如 name=getValue ) 逐步增加CALL深度 分析参数可控性 检查调用链是否可执行 6. POC构造 6.1 JNDI注入POC 6.2 JDBC注入POC 7. 防御建议 升级Vaadin到安全版本 限制反序列化操作 使用安全的白名单机制 监控JNDI和JDBC相关操作 8. 工具使用技巧 Tabby使用要点 : 使用封装好的sink点进行筛选 对复杂调用关系添加手动别名 合理设置查询条件和深度 结合代码审计验证自动分析结果 9. 总结 通过Tabby工具分析Vaadin框架,成功挖掘出两条新的反序列化利用链,分别导致JNDI注入和JDBC注入漏洞。关键在于处理接口调用关系和验证参数可控性,这为类似框架的反序列化漏洞挖掘提供了参考方法。