WebFlux集成Spring-Security受限静态资源访问授权绕过(CVE-2024-38821)
字数 2107 2025-08-29 22:41:10

Spring Security WebFlux 静态资源授权绕过漏洞分析 (CVE-2024-38821)

漏洞概述

CVE-2024-38821 是 Spring Security 在 WebFlux 环境下存在的一个静态资源访问授权绕过漏洞。攻击者可以通过构造特殊的请求路径(如双斜杠或包含相对路径)绕过安全配置,访问本应需要认证的静态资源。

受影响版本

  • Spring Security 5.7.0 - 5.7.12
  • Spring Security 5.8.0 - 5.8.14
  • Spring Security 6.0.0 - 6.0.12
  • Spring Security 6.1.0 - 6.1.10
  • Spring Security 6.2.0 - 6.2.6
  • Spring Security 6.3.0 - 6.3.3

漏洞复现

环境搭建

  1. 创建一个 Spring Boot + WebFlux + Spring Security 项目
  2. 引入相关依赖
  3. 创建安全配置类:
@Configuration
@EnableWebFluxSecurity
public class SecurityConfig {
    @Bean
    public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) {
        return http.authorizeExchange()
                .pathMatchers("/index.html").authenticated()
                .anyExchange().permitAll()
                .and().formLogin()
                .and().build();
    }
}
  1. 在 resources 目录下创建 index.html 文件并写入任意内容

测试步骤

  1. 正常访问 /index.html - 返回 401 Unauthorized
  2. 访问 //index.html - 返回 200 OK 并显示文件内容
  3. 访问 ///../index.html - 同样返回 200 OK

漏洞原理分析

WebFlux 请求处理流程

  1. 过滤器链起点DefaultWebFilterChain 的 filter 方法

    • 第一次进入 filter 时:
      • currentFilterWebFilterChainProxy 对象
      • handlerDispatcherHandler 对象
  2. WebFilterChainProxy 处理

    • 存储所有注册的过滤器
    • 调用匹配器对请求路径进行匹配
    • 匹配成功后执行相应过滤器的 filter 方法
    • 最终调用 DispatcherHandler 的 handle 方法处理请求
  3. MatcherSecurityWebFilterChain

    • 负责验证 URL 访问规则
    • 对于 //index.html 这种非标准路径,可能无法正确匹配安全规则

路径处理关键点

  1. 资源处理器ResourceWebHandler

    • getResource 方法尝试获取用户访问的资源
    • getResourcePath 方法通过 URL 获取资源在服务器上的位置
  2. 路径提取

    • 资源路径从 exchange 的 HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE 属性获取
    • AbstractUrlHandlerMapping.getHandlerInternal 方法中构建
    • 关键代码:
      PathContainer pathWithinMapping = pattern.extractPathWithinPattern(lookupPath);
      exchange.getAttributes().put(PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, pathWithinMapping);
      
  3. 路径规范化

    • extractPathWithinPattern 方法处理特殊路径:
      • 从头开始遍历,跳过开头的分隔符(/)
      • 从尾开始反向遍历,跳过结尾的分隔符
      • 截取中间部分作为实际路径
    • 因此 //index.html 被处理为 index.html
    • ///../index.html 先被处理为 //index.html,再被处理为 index.html

漏洞根本原因

应用配置的需要授权的静态资源可通过构造特殊请求路径绕过认证,因为:

  1. 过滤器阶段:特殊路径(/////../)未能匹配设定的静态资源访问规则
  2. 资源映射阶段:路径被规范化处理,提取出有效部分(index.html)
  3. 导致攻击者可以绕过认证访问受限资源

漏洞修复

Spring Security 在 6.3.4 版本中修复了该漏洞,关键修复点:

  1. 新增类StrictServerWebExchangeFirewall

    • 对请求路径进行严格过滤
    • 发现可疑路径时抛出异常阻止请求
  2. 关键修复代码

    • WebFilterChainProxy 中调用 getFirewalledExchange 方法
    • 使用 rejectedBlocklistedUrls 方法检查路径
  3. 检查规则

    • 预定义禁止的路径模式(如 FORBIDDEN_DOUBLE_FORWARDSLASH 对应 //)
    • 发现匹配时抛出异常

参考链接

防护建议

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

    • 5.7.x 用户升级到 5.7.13+
    • 5.8.x 用户升级到 5.8.15+
    • 6.0.x 用户升级到 6.0.13+
    • 6.1.x 用户升级到 6.1.11+
    • 6.2.x 用户升级到 6.2.7+
    • 6.3.x 用户升级到 6.3.4+
  2. 临时缓解措施:

    • 在应用层添加路径规范化处理
    • 使用自定义过滤器检查可疑路径
  3. 安全配置建议:

    • 对敏感静态资源使用更严格的访问控制
    • 考虑将静态资源放在需要统一认证的目录下
Spring Security WebFlux 静态资源授权绕过漏洞分析 (CVE-2024-38821) 漏洞概述 CVE-2024-38821 是 Spring Security 在 WebFlux 环境下存在的一个静态资源访问授权绕过漏洞。攻击者可以通过构造特殊的请求路径(如双斜杠或包含相对路径)绕过安全配置,访问本应需要认证的静态资源。 受影响版本 Spring Security 5.7.0 - 5.7.12 Spring Security 5.8.0 - 5.8.14 Spring Security 6.0.0 - 6.0.12 Spring Security 6.1.0 - 6.1.10 Spring Security 6.2.0 - 6.2.6 Spring Security 6.3.0 - 6.3.3 漏洞复现 环境搭建 创建一个 Spring Boot + WebFlux + Spring Security 项目 引入相关依赖 创建安全配置类: 在 resources 目录下创建 index.html 文件并写入任意内容 测试步骤 正常访问 /index.html - 返回 401 Unauthorized 访问 //index.html - 返回 200 OK 并显示文件内容 访问 ///../index.html - 同样返回 200 OK 漏洞原理分析 WebFlux 请求处理流程 过滤器链起点 : DefaultWebFilterChain 的 filter 方法 第一次进入 filter 时: currentFilter 为 WebFilterChainProxy 对象 handler 为 DispatcherHandler 对象 WebFilterChainProxy 处理 : 存储所有注册的过滤器 调用匹配器对请求路径进行匹配 匹配成功后执行相应过滤器的 filter 方法 最终调用 DispatcherHandler 的 handle 方法处理请求 MatcherSecurityWebFilterChain : 负责验证 URL 访问规则 对于 //index.html 这种非标准路径,可能无法正确匹配安全规则 路径处理关键点 资源处理器 : ResourceWebHandler getResource 方法尝试获取用户访问的资源 getResourcePath 方法通过 URL 获取资源在服务器上的位置 路径提取 : 资源路径从 exchange 的 HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE 属性获取 在 AbstractUrlHandlerMapping.getHandlerInternal 方法中构建 关键代码: 路径规范化 : extractPathWithinPattern 方法处理特殊路径: 从头开始遍历,跳过开头的分隔符( / ) 从尾开始反向遍历,跳过结尾的分隔符 截取中间部分作为实际路径 因此 //index.html 被处理为 index.html ///../index.html 先被处理为 //index.html ,再被处理为 index.html 漏洞根本原因 应用配置的需要授权的静态资源可通过构造特殊请求路径绕过认证,因为: 过滤器阶段:特殊路径( // 或 ///../ )未能匹配设定的静态资源访问规则 资源映射阶段:路径被规范化处理,提取出有效部分( index.html ) 导致攻击者可以绕过认证访问受限资源 漏洞修复 Spring Security 在 6.3.4 版本中修复了该漏洞,关键修复点: 新增类 : StrictServerWebExchangeFirewall 对请求路径进行严格过滤 发现可疑路径时抛出异常阻止请求 关键修复代码 : 在 WebFilterChainProxy 中调用 getFirewalledExchange 方法 使用 rejectedBlocklistedUrls 方法检查路径 检查规则 : 预定义禁止的路径模式(如 FORBIDDEN_DOUBLE_FORWARDSLASH 对应 // ) 发现匹配时抛出异常 参考链接 Spring Security 修复提交 (具体 diff 链接) CVE-2024-38821 官方公告 防护建议 升级 Spring Security 到以下安全版本: 5.7.x 用户升级到 5.7.13+ 5.8.x 用户升级到 5.8.15+ 6.0.x 用户升级到 6.0.13+ 6.1.x 用户升级到 6.1.11+ 6.2.x 用户升级到 6.2.7+ 6.3.x 用户升级到 6.3.4+ 临时缓解措施: 在应用层添加路径规范化处理 使用自定义过滤器检查可疑路径 安全配置建议: 对敏感静态资源使用更严格的访问控制 考虑将静态资源放在需要统一认证的目录下