【Spring Security RegexRequestMatcher 认证绕过漏洞(CVE-2022-22978)分析】

一、漏洞概述

CVE-2022-22978 是 Spring Security 中的一个身份认证绕过漏洞,攻击者可在未登录状态下,通过构造特殊 URL 请求,绕过配置的权限控制规则,访问本应受保护的管理接口或敏感资源。

该漏洞的核心出现在 org.springframework.security.web.util.matcher.RegexRequestMatcher 类中,当开发者使用正则表达式进行 URL 权限匹配时,若正则中包含通配符 .,且请求路径中嵌入换行符(如 \r\n),则可能导致 Spring Security 无法正确识别请求路径,从而错误地放行未授权访问。


二、技术原理剖析

要理解该漏洞的成因,需从 Java 正则表达式机制和 Spring 框架的请求处理流程说起。

1. 正则表达式中 . 的默认行为

在 Java 中,正则表达式中的元字符 . 表示"匹配除换行符之外的任意单个字符"。这意味着:

  • . 可以匹配字母、数字、符号、空格等;
  • 但默认情况下,不匹配 \n(换行符)、 \r(回车符)等控制字符

只有在启用 Pattern.DOTALL 模式时,. 才会真正"匹配一切",包括换行符。

2. Spring Security 的匹配逻辑缺陷

当开发者使用如下配置时:

复制代码
http
    .authorizeRequests()
    .regexMatchers("/admin/.*").authenticated()
    .anyRequest().permitAll();

Spring Security 会使用 RegexRequestMatcher 对请求路径进行正则匹配。但在漏洞版本中(5.5.7 之前、5.6.4 之前),其内部创建正则模式时未添加 Pattern.DOTALL 标志

复制代码
Pattern.compile(patternStr); // 缺少 DOTALL

这就导致:

  • 正常路径如 /admin/user 能被正确匹配,触发认证;
  • 但恶意构造的路径如 /admin/%0A(即 /admin/\n)由于包含换行符,无法被正则 /admin/.* 匹配成功
3. 漏洞复现

构造如下请求:

复制代码
GET /admin/%0A HTTP/1.1
Host: example.com
  • Spring Security 层 :使用 RegexRequestMatcher 匹配路径,因 %0A 解码为 \n,而 . 不匹配 \n匹配失败 → 认为该路径不在保护范围内 → 不执行认证拦截
  • Spring MVC 层 :使用 @RequestMapping("/admin/**") 等通配路径映射控制器,其底层使用 AntPathMatcherPathPatternParser,会自动处理和标准化路径,仍能正确路由到目标 Controller

结果:未登录用户成功访问需认证的接口,绕过权限控制。

使用vulhub搭建靶场:服务器启动后,访问以下链接即可成功绕过认证。

📌 关键点:Security 层"没认出来",MVC 层"认出来了"------两者对同一路径的解析不一致,导致安全策略失效。


三、漏洞触发条件

并非所有使用 RegexRequestMatcher 的项目都会受影响,需同时满足以下条件:

  1. 使用了 regexMatchers(...) 方法 进行权限配置;
  2. 正则表达式中包含 . 通配符(如 .*);
  3. Spring Security 版本低于 5.5.7 或 5.6.4;
  4. 控制器使用通配路径(如 /admin/**),否则无法命中;
  5. 未对请求路径进行标准化或过滤。

四、影响范围

Spring Security 版本 是否受影响
5.5.0 ~ 5.5.6 ✅ 是
5.6.0 ~ 5.6.3 ✅ 是
≥ 5.5.7 / ≥ 5.6.4 ❌ 否
≥ 5.7.0 ❌ 安全

注:更早的不受支持版本(如 5.4.x)若存在相同实现,也可能受影响。


五、官方修复方案

Spring 官方在 5.5.7 和 5.6.4 版本中修复了该问题,核心修改为:

复制代码
// 修复前
Pattern pattern = Pattern.compile(patternStr);

// 修复后
Pattern pattern = Pattern.compile(patternStr, Pattern.DOTALL);

通过启用 DOTALL 模式,确保 . 能匹配所有字符,包括换行符,从而保证路径匹配的完整性与安全性。


六、应对策略与建议

1. 立即升级版本
  • 升级 Spring Security 至 5.5.7 或更高版本
  • 若使用 Spring Boot,建议同步升级至兼容的安全版本(如 2.5.14 或 2.6.8 以上)。
2. **优先使用 antMatchers 替代 **regexMatchers

Ant 风格路径匹配(如 /admin/**)更安全、直观,且无此类正则陷阱。

复制代码
http
    .authorizeRequests()
    .antMatchers("/admin/**").authenticated()
    ...
3. 统一路径处理逻辑

在网关或过滤器中对请求路径进行标准化处理,过滤或拒绝包含控制字符(如 %0A%0D)的 URL。

4. 加强安全测试

引入自动化 Fuzz 测试,模拟异常输入路径,验证权限控制是否健壮。

5. 遵循最小权限原则

即使存在漏洞,也应通过角色权限细分、接口级鉴权等方式降低潜在风险。


参考资源

  • Spring Security 官方发布日志
  • CVE-2022-22978 漏洞公告
  • VulHub 漏洞复现环境
相关推荐
青云计划6 小时前
知光项目知文发布模块
java·后端·spring·mybatis
赶路人儿6 小时前
Jsoniter(java版本)使用介绍
java·开发语言
Victor3566 小时前
MongoDB(9)什么是MongoDB的副本集(Replica Set)?
后端
Victor3566 小时前
MongoDB(8)什么是聚合(Aggregation)?
后端
探路者继续奋斗7 小时前
IDD意图驱动开发之意图规格说明书
java·规格说明书·开发规范·意图驱动开发·idd
消失的旧时光-19437 小时前
第十九课:为什么要引入消息队列?——异步系统设计思想
java·开发语言
yeyeye1117 小时前
Spring Cloud Data Flow 简介
后端·spring·spring cloud
A懿轩A7 小时前
【Java 基础编程】Java 面向对象入门:类与对象、构造器、this 关键字,小白也能写 OOP
java·开发语言
Tony Bai8 小时前
告别 Flaky Tests:Go 官方拟引入 testing/nettest,重塑内存网络测试标准
开发语言·网络·后端·golang·php
乐观勇敢坚强的老彭8 小时前
c++寒假营day03
java·开发语言·c++