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
漏洞复现
环境搭建
- 创建一个 Spring Boot + WebFlux + Spring Security 项目
- 引入相关依赖
- 创建安全配置类:
@Configuration
@EnableWebFluxSecurity
public class SecurityConfig {
@Bean
public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) {
return http.authorizeExchange()
.pathMatchers("/index.html").authenticated()
.anyExchange().permitAll()
.and().formLogin()
.and().build();
}
}
- 在 resources 目录下创建 index.html 文件并写入任意内容
测试步骤
- 正常访问
/index.html- 返回 401 Unauthorized - 访问
//index.html- 返回 200 OK 并显示文件内容 - 访问
///../index.html- 同样返回 200 OK
漏洞原理分析
WebFlux 请求处理流程
-
过滤器链起点:
DefaultWebFilterChain的 filter 方法- 第一次进入 filter 时:
currentFilter为WebFilterChainProxy对象handler为DispatcherHandler对象
- 第一次进入 filter 时:
-
WebFilterChainProxy 处理:
- 存储所有注册的过滤器
- 调用匹配器对请求路径进行匹配
- 匹配成功后执行相应过滤器的 filter 方法
- 最终调用
DispatcherHandler的 handle 方法处理请求
-
MatcherSecurityWebFilterChain:
- 负责验证 URL 访问规则
- 对于
//index.html这种非标准路径,可能无法正确匹配安全规则
路径处理关键点
-
资源处理器:
ResourceWebHandlergetResource方法尝试获取用户访问的资源getResourcePath方法通过 URL 获取资源在服务器上的位置
-
路径提取:
- 资源路径从 exchange 的
HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE属性获取 - 在
AbstractUrlHandlerMapping.getHandlerInternal方法中构建 - 关键代码:
PathContainer pathWithinMapping = pattern.extractPathWithinPattern(lookupPath); exchange.getAttributes().put(PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, pathWithinMapping);
- 资源路径从 exchange 的
-
路径规范化:
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+
-
临时缓解措施:
- 在应用层添加路径规范化处理
- 使用自定义过滤器检查可疑路径
-
安全配置建议:
- 对敏感静态资源使用更严格的访问控制
- 考虑将静态资源放在需要统一认证的目录下