浅谈Spring Security授权规则配置错误漏洞(CVE-2023-34035)
字数 1962 2025-08-06 08:34:57

Spring Security授权规则配置错误漏洞(CVE-2023-34035)分析与防护指南

1. 漏洞概述

CVE-2023-34035是Spring Security中存在的一个授权规则配置错误漏洞,当应用程序同时满足以下条件时,可能导致安全防护失效:

  1. 使用了requestMatchers(String)方法配置安全规则
  2. 应用中存在多个Servlet(其中一个是Spring MVC的DispatcherServlet)
  3. 尝试保护非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依赖自动选择创建MvcRequestMatcherAntPathRequestMatcher

// 伪代码表示
if (存在SpringMVC) {
    return new MvcRequestMatcher(...);
} else {
    return new AntPathRequestMatcher(...);
}

3.2 匹配过程分析

当使用MvcRequestMatcher时,匹配过程如下:

  1. 检查请求的HTTP方法和Servlet路径是否匹配(notMatchMethodOrServletPath
  2. 获取请求的处理器映射对象(MatchableHandlerMapping
  3. 如果不存在匹配的处理器映射,则使用默认匹配器
  4. 否则使用请求匹配器和预定义的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 端点定义

  1. Spring MVC端点:
@Controller
public class ManageController {
    @GetMapping("/manage/page")
    public String Manage() {
        return "manage";
    }
}
  1. 自定义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方法逻辑:

  1. 检查是否存在SpringMVC和WebApplicationContext
  2. 获取ServletContext
  3. 检查注册的Servlet:
    • 如果没有Servlet或没有DispatcherServlet → 创建AntPathRequestMatcher
    • 如果只有一个Servlet且是DispatcherServlet → 创建MvcRequestMatcher
    • 如果有多个Servlet → 抛出异常,提示明确指定匹配器类型

关键修复代码:

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. 最佳实践建议

  1. 明确匹配器类型:对于非Spring MVC端点,始终使用AntPathRequestMatcher
  2. 最小权限原则:确保所有端点都有明确的访问控制
  3. 定期更新:保持Spring Security版本为最新稳定版
  4. 安全测试:对所有配置的端点进行权限测试验证
  5. 日志监控:监控未授权访问尝试

7. 总结

CVE-2023-34035暴露了Spring Security在混合Servlet环境下的路径匹配问题,可能导致安全规则失效。通过理解其原理和修复方案,开发者可以更好地保护应用程序免受未授权访问的风险。建议所有使用受影响版本的用户尽快升级或应用临时修复方案。

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 : 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 环境配置 假设有以下安全配置: 4.2 端点定义 Spring MVC端点: 自定义Servlet端点: 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 → 抛出异常,提示明确指定匹配器类型 关键修复代码: 5.3 临时解决方案 对于无法立即升级的情况,可以明确指定匹配器类型: 6. 最佳实践建议 明确匹配器类型 :对于非Spring MVC端点,始终使用 AntPathRequestMatcher 最小权限原则 :确保所有端点都有明确的访问控制 定期更新 :保持Spring Security版本为最新稳定版 安全测试 :对所有配置的端点进行权限测试验证 日志监控 :监控未授权访问尝试 7. 总结 CVE-2023-34035暴露了Spring Security在混合Servlet环境下的路径匹配问题,可能导致安全规则失效。通过理解其原理和修复方案,开发者可以更好地保护应用程序免受未授权访问的风险。建议所有使用受影响版本的用户尽快升级或应用临时修复方案。