浅谈Spring Security身份验证绕过漏洞(CVE-2023-34034)
字数 1523 2025-08-06 08:34:54
Spring Security 身份验证绕过漏洞(CVE-2023-34034)深度分析
漏洞概述
CVE-2023-34034 是 Spring Security 中的一个身份验证绕过漏洞,当 Spring Security 使用 ** 作为匹配模式时,在 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.3
- Spring Security 5.7.0 - 5.7.8
- Spring Security 5.6.0 - 5.6.10
漏洞原理
根本原因
漏洞的根本原因在于 Spring Security 和 Spring WebFlux 在处理 ** 通配符时的行为不一致:
- Spring Security 将
/**解释为匹配所有路径,包括当前路径和所有子路径 - Spring WebFlux 将
/**解释为仅匹配当前路径下的所有子路径,但不包括当前路径本身
具体场景
当配置如下安全规则时:
@Bean
SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
http
.authorizeExchange(exchanges -> exchanges
.pathMatchers("/admin/**").authenticated()
.anyExchange().permitAll()
)
.httpBasic(withDefaults());
return http.build();
}
按照预期:
/admin应该需要认证/admin/应该需要认证/admin/sub应该需要认证
但实际上:
/admin可以绕过认证(漏洞)/admin/需要认证/admin/sub需要认证
漏洞复现
环境搭建
- 创建一个 Spring WebFlux 项目
- 添加 Spring Security 依赖
- 配置安全规则(如上所示)
- 创建一个
/admin端点
测试步骤
- 直接访问
/admin- 可以绕过认证(漏洞表现) - 访问
/admin/- 需要认证(正常行为) - 访问
/admin/sub- 需要认证(正常行为)
修复方案
官方修复
Spring Security 团队在以下版本中修复了此问题:
- 6.1.2+
- 6.0.5+
- 5.8.4+
- 5.7.9+
- 5.6.11+
临时解决方案
如果无法立即升级,可以采用以下方法:
- 显式添加路径匹配:
.pathMatchers("/admin", "/admin/**").authenticated()
- 使用正则表达式匹配:
.pathMatchers("/admin.*", "/admin/**").authenticated()
- 使用 RequestMatcher:
.requestMatchers(PathRequest.toStaticResources().atCommonLocations())
最佳实践
- 避免单独使用
/**:总是显式处理根路径和子路径 - 测试安全配置:对安全规则进行全面的路径测试
- 及时更新:保持 Spring Security 和 Spring WebFlux 版本最新
- 最小权限原则:从最严格的规则开始,逐步放宽
深入技术分析
路径匹配实现差异
Spring Security 使用 AntPathMatcher,而 WebFlux 使用 PathPattern:
-
AntPathMatcher行为:/admin匹配/admin/**/admin/匹配/admin/**
-
PathPattern行为:/admin不匹配/admin/**/admin/匹配/admin/**
修复代码分析
修复后的代码确保了两者在处理 ** 时的行为一致性,主要修改包括:
- 统一路径规范化处理
- 确保
**匹配包含当前路径 - 改进路径匹配逻辑的一致性检查
总结
CVE-2023-34034 展示了框架间细微行为差异可能导致的安全问题。开发人员应当:
- 充分理解安全配置的实际效果
- 对关键安全路径进行充分测试
- 保持框架组件版本的一致性
- 关注安全公告并及时应用补丁
通过正确配置和及时更新,可以有效防范此类身份验证绕过风险。