浅谈Spring Security授权规则配置错误漏洞(CVE-2023-34035)
字数 1962 2025-08-06 08:34:57
Spring Security授权规则配置错误漏洞(CVE-2023-34035)分析与防护指南
1. 漏洞概述
CVE-2023-34035是Spring Security中存在的一个授权规则配置错误漏洞,当应用程序同时满足以下条件时,可能导致安全防护失效:
- 使用了
requestMatchers(String)方法配置安全规则 - 应用中存在多个Servlet(其中一个是Spring MVC的DispatcherServlet)
- 尝试保护非Spring MVC端点
2. 受影响版本
- Spring Security 5.8.0 至 5.8.4
- Spring Security 6.0.0 至 6.0.4
- Spring Security 6.1.0 至 6.1.1
3. 漏洞原理分析
3.1 RequestMatcher创建机制
在受影响版本中,requestMatchers(String)方法的实现会根据是否存在SpringMVC依赖自动选择创建MvcRequestMatcher或AntPathRequestMatcher:
// 伪代码表示
if (存在SpringMVC) {
return new MvcRequestMatcher(...);
} else {
return new AntPathRequestMatcher(...);
}
3.2 匹配过程分析
当使用MvcRequestMatcher时,匹配过程如下:
- 检查请求的HTTP方法和Servlet路径是否匹配(
notMatchMethodOrServletPath) - 获取请求的处理器映射对象(
MatchableHandlerMapping) - 如果不存在匹配的处理器映射,则使用默认匹配器
- 否则使用请求匹配器和预定义的URL模式进行匹配(
mapping.match(request, this.pattern))
3.3 路径解析差异
问题根源在于路径解析时,Spring MVC端点和自定义Servlet端点存在差异:
-
Spring MVC端点:
contextPath属性为空字符串- 完整路径直接返回(如
/admin/page)
-
自定义Servlet端点:
contextPath属性为Servlet路径前缀(如admin)- 返回相对路径(如
/page)
这种差异导致MvcRequestMatcher无法正确匹配自定义Servlet端点,从而使安全规则失效。
4. 漏洞复现
4.1 环境配置
假设有以下安全配置:
@Configuration
@EnableWebSecurity
public class SpringSecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests()
.requestMatchers("/admin/**").hasRole("ADMIN")
.requestMatchers("/manage/**").hasRole("MANAGE")
.anyRequest().permitAll();
return http.build();
}
}
4.2 端点定义
- Spring MVC端点:
@Controller
public class ManageController {
@GetMapping("/manage/page")
public String Manage() {
return "manage";
}
}
- 自定义Servlet端点:
@WebServlet(urlPatterns = "/admin/*")
public class UserServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
resp.getWriter().write("user page");
}
}
4.3 预期与实际行为
| 端点类型 | 预期行为 | 实际行为 |
|---|---|---|
| Spring MVC端点 | 需要ADMIN权限(403) | 符合预期(403) |
| 自定义Servlet | 需要ADMIN权限(403) | 无需权限(200) |
5. 修复方案
5.1 升级Spring Security
升级到以下安全版本:
- Spring Security 5.8.5+
- Spring Security 6.0.5+
- Spring Security 6.1.2+
5.2 修复代码分析
修复后的requestMatchers方法逻辑:
- 检查是否存在SpringMVC和WebApplicationContext
- 获取ServletContext
- 检查注册的Servlet:
- 如果没有Servlet或没有DispatcherServlet → 创建
AntPathRequestMatcher - 如果只有一个Servlet且是DispatcherServlet → 创建
MvcRequestMatcher - 如果有多个Servlet → 抛出异常,提示明确指定匹配器类型
- 如果没有Servlet或没有DispatcherServlet → 创建
关键修复代码:
if (registrations.size() > 1) {
throw new IllegalStateException("This method cannot decide whether these patterns are Spring MVC patterns or not. " +
"If this endpoint is a Spring MVC endpoint, please use `requestMatchers(MvcRequestMatcher)`; " +
"otherwise, please use `requestMatchers(AntPathRequestMatcher)`.");
}
5.3 临时解决方案
对于无法立即升级的情况,可以明确指定匹配器类型:
@Configuration
@EnableWebSecurity
public class SpringSecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests()
.requestMatchers(new AntPathRequestMatcher("/admin/**")).hasRole("ADMIN")
.requestMatchers("/manage/**").hasRole("MANAGE")
.anyRequest().permitAll();
return http.build();
}
}
6. 最佳实践建议
- 明确匹配器类型:对于非Spring MVC端点,始终使用
AntPathRequestMatcher - 最小权限原则:确保所有端点都有明确的访问控制
- 定期更新:保持Spring Security版本为最新稳定版
- 安全测试:对所有配置的端点进行权限测试验证
- 日志监控:监控未授权访问尝试
7. 总结
CVE-2023-34035暴露了Spring Security在混合Servlet环境下的路径匹配问题,可能导致安全规则失效。通过理解其原理和修复方案,开发者可以更好地保护应用程序免受未授权访问的风险。建议所有使用受影响版本的用户尽快升级或应用临时修复方案。