Sangfor华东天勇战队:springsecurity+springwebflux(CVE-2023-34034)
字数 1820 2025-08-10 08:28:13
Spring Security + Spring WebFlux 权限绕过漏洞 (CVE-2023-34034) 分析报告
漏洞概述
本报告详细分析了 Spring Security 与 Spring WebFlux 组合使用时出现的权限绕过漏洞 (CVE-2023-34034)。该漏洞存在于特定版本的 Spring Security 中,当与 Spring WebFlux 配合使用时,可能导致安全配置被绕过。
受影响版本
- Spring Security 6.1.0 至 6.1.1
- Spring Security 6.0.0 至 6.0.4
- Spring Security 5.8.0 至 5.8.4
- Spring Security 5.7.0 至 5.7.9
- Spring Security 5.6.0 至 5.6.11
环境搭建
基础环境
- 使用测试项目: zxning-springsecurity-demos
- 关键修改:
pom.xml中设置 Spring Boot 版本为 3.1.1 (对应 Spring Security 6.1.2)- 添加
HelloController类 - 修改
WebFluxSecurityConfig类 - 使用 Java 17
版本验证
- 使用 Spring Boot 3.1.1 (Spring Security 6.1.2) 测试 - 漏洞不存在
- 降低 Spring Boot 版本至 3.1.0 (Spring Security 6.1.1) 测试 - 漏洞存在
漏洞复现
- 配置安全规则时使用不带前导斜杠的路径模式 (如
hello-dev/**) - 访问受保护端点时,Spring Security 无法正确匹配路径
- 请求被传递到 Spring WebFlux,后者能够正确解析路径
- 导致权限检查被绕过
漏洞分析
根本原因
漏洞源于 Spring Security 和 Spring WebFlux 对路径模式解析的不一致性:
-
Spring Security 的路径匹配问题:
- 在受影响版本中,当路径模式不以斜杠开头时,Spring Security 无法正确匹配请求路径
- 示例: 配置
hello-dev/**无法匹配/hello-dev/请求
-
Spring WebFlux 的路径匹配行为:
- WebFlux 会自动为不以斜杠开头的路径模式添加前导斜杠
- 示例:
hello-dev/**会被转换为/hello-dev/**
代码层面分析
关键代码位于 AbstractServerWebExchangeMatcherRegistry.java 中的 pathMatchers 方法:
// 修复前的代码 (漏洞版本)
public T pathMatchers(String... antPatterns) {
return matcher(ServerWebExchangeMatchers.pathMatchers(antPatterns));
}
// 修复后的代码
public T pathMatchers(String... antPatterns) {
List<PathPattern> pathPatterns = parsePatterns(antPatterns);
return matcher(ServerWebExchangeMatchers.pathMatchers(pathPatterns.toArray(new PathPattern[0])));
}
关键修复点在于新增的 parsePatterns 方法,该方法会调用 initFullPathPattern 函数为路径模式添加前导斜杠。
调试过程
-
在 6.1.2 版本 (已修复) 中调试:
- 进入
getMappingForMethod方法读取RequestMapping注解信息 - 在
createRequestMappingInfo中,builder的paths初始为["hello-dev/**"] - 经过
initFullPathPattern处理后变为["/hello-dev/**"]
- 进入
-
在 6.1.1 版本 (漏洞版本) 中:
- 缺少路径规范化处理
- Spring Security 无法匹配不带前导斜杠的路径模式
- 请求被传递到 WebFlux 后成功匹配
修复方案
-
升级 Spring Security 到以下安全版本:
- 6.1.2+
- 6.0.5+
- 5.8.5+
- 5.7.10+
- 5.6.12+
-
临时缓解措施:
- 确保所有安全配置中的路径模式都以斜杠开头
- 示例: 使用
/hello-dev/**而非hello-dev/**
总结
该漏洞展示了框架组合使用时可能出现的微妙交互问题。开发人员应当:
- 始终保持框架组件的最新版本
- 统一路径模式的书写规范
- 对安全配置进行全面的测试验证
- 特别关注不同框架组件间的交互行为
参考资源
- 原始分析文章: FreeBuf 链接
- 测试项目: zxning-springsecurity-demos
- Spring Security 官方文档