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

环境搭建

基础环境

  1. 使用测试项目: zxning-springsecurity-demos
  2. 关键修改:
    • pom.xml 中设置 Spring Boot 版本为 3.1.1 (对应 Spring Security 6.1.2)
    • 添加 HelloController
    • 修改 WebFluxSecurityConfig
    • 使用 Java 17

版本验证

  1. 使用 Spring Boot 3.1.1 (Spring Security 6.1.2) 测试 - 漏洞不存在
  2. 降低 Spring Boot 版本至 3.1.0 (Spring Security 6.1.1) 测试 - 漏洞存在

漏洞复现

  1. 配置安全规则时使用不带前导斜杠的路径模式 (如 hello-dev/**)
  2. 访问受保护端点时,Spring Security 无法正确匹配路径
  3. 请求被传递到 Spring WebFlux,后者能够正确解析路径
  4. 导致权限检查被绕过

漏洞分析

根本原因

漏洞源于 Spring Security 和 Spring WebFlux 对路径模式解析的不一致性:

  1. Spring Security 的路径匹配问题:

    • 在受影响版本中,当路径模式不以斜杠开头时,Spring Security 无法正确匹配请求路径
    • 示例: 配置 hello-dev/** 无法匹配 /hello-dev/ 请求
  2. 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 函数为路径模式添加前导斜杠。

调试过程

  1. 在 6.1.2 版本 (已修复) 中调试:

    • 进入 getMappingForMethod 方法读取 RequestMapping 注解信息
    • createRequestMappingInfo 中,builderpaths 初始为 ["hello-dev/**"]
    • 经过 initFullPathPattern 处理后变为 ["/hello-dev/**"]
  2. 在 6.1.1 版本 (漏洞版本) 中:

    • 缺少路径规范化处理
    • Spring Security 无法匹配不带前导斜杠的路径模式
    • 请求被传递到 WebFlux 后成功匹配

修复方案

  1. 升级 Spring Security 到以下安全版本:

    • 6.1.2+
    • 6.0.5+
    • 5.8.5+
    • 5.7.10+
    • 5.6.12+
  2. 临时缓解措施:

    • 确保所有安全配置中的路径模式都以斜杠开头
    • 示例: 使用 /hello-dev/** 而非 hello-dev/**

总结

该漏洞展示了框架组合使用时可能出现的微妙交互问题。开发人员应当:

  1. 始终保持框架组件的最新版本
  2. 统一路径模式的书写规范
  3. 对安全配置进行全面的测试验证
  4. 特别关注不同框架组件间的交互行为

参考资源

  1. 原始分析文章: FreeBuf 链接
  2. 测试项目: zxning-springsecurity-demos
  3. Spring Security 官方文档
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 方法: 关键修复点在于新增的 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 官方文档