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 反序列化漏洞链组成
反序列化漏洞链通常由三部分组成:
- 触发点(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注入完整调用链
[调用链起点]
↓
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 接口调用问题
当遇到接口实现关系导致调用链断裂时:
- 识别接口实现关系
- 手动添加别名关系
- 重新查询接口的调用
5.2 调用链验证要点
- 限定初始调用函数条件(如
name=getValue) - 逐步增加CALL深度
- 分析参数可控性
- 检查调用链是否可执行
6. POC构造
6.1 JNDI注入POC
// 示例代码结构
BadAttributeValueExpException bad = new BadAttributeValueExpException(null);
// 构造调用链对象
// ...
// 触发JNDI注入
6.2 JDBC注入POC
// 示例代码结构
BadAttributeValueExpException bad = new BadAttributeValueExpException(null);
// 构造调用链对象
// ...
// 触发JDBC注入
7. 防御建议
- 升级Vaadin到安全版本
- 限制反序列化操作
- 使用安全的白名单机制
- 监控JNDI和JDBC相关操作
8. 工具使用技巧
Tabby使用要点:
- 使用封装好的sink点进行筛选
- 对复杂调用关系添加手动别名
- 合理设置查询条件和深度
- 结合代码审计验证自动分析结果
9. 总结
通过Tabby工具分析Vaadin框架,成功挖掘出两条新的反序列化利用链,分别导致JNDI注入和JDBC注入漏洞。关键在于处理接口调用关系和验证参数可控性,这为类似框架的反序列化漏洞挖掘提供了参考方法。