一、漏洞概述
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/**")等通配路径映射控制器,其底层使用AntPathMatcher或PathPatternParser,会自动处理和标准化路径,仍能正确路由到目标 Controller。
结果:未登录用户成功访问需认证的接口,绕过权限控制。
使用vulhub搭建靶场:服务器启动后,访问以下链接即可成功绕过认证。

📌 关键点:Security 层"没认出来",MVC 层"认出来了"------两者对同一路径的解析不一致,导致安全策略失效。
三、漏洞触发条件
并非所有使用 RegexRequestMatcher 的项目都会受影响,需同时满足以下条件:
- 使用了
regexMatchers(...)方法 进行权限配置; - 正则表达式中包含
.通配符(如.*); - Spring Security 版本低于 5.5.7 或 5.6.4;
- 控制器使用通配路径(如
/admin/**),否则无法命中; - 未对请求路径进行标准化或过滤。
四、影响范围
| 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 漏洞复现环境