Apache Shiro 认证绕过漏洞(CVE-2022-32532)分析
漏洞概述
CVE-2022-32532 是 Apache Shiro 中存在的一个认证绕过漏洞。当 Shiro 使用 RegexRequestMatcher 进行权限配置,且正则表达式中包含元字符 . 时,攻击者可通过在 URL 中注入换行符(\n / %0A)绕过身份认证,从而以未授权方式访问受保护资源。
Note
- 影响版本:Apache Shiro < 1.9.1
- 修复版本:Apache Shiro ≥ 1.9.1
- 触发条件:使用
RegexRequestMatcher+ 含.的正则表达式(如.*)进行权限匹配
漏洞原理
Apache Shiro 的 RegexRequestMatcher 底层使用 Java 正则表达式进行 URL 路径匹配。Java 正则中 . 默认不匹配换行符(除非启用 DOTALL 模式)。当开发者使用 .* 等包含 . 的正则来匹配路径时,Shiro 内部未启用 DOTALL,导致含换行符的路径无法被正确匹配,从而绕过权限校验。
技术细节
Java 正则中
.的行为元字符
.匹配除换行符(\n、\r)之外的任意单个字符。若要匹配包含换行的完整字符串,需启用Pattern.DOTALL模式。// 默认行为:. 不匹配换行".".matcher("a\nb").find(); // false// DOTALL 模式下:. 匹配任意字符Pattern.compile(".", Pattern.DOTALL).matcher("a\nb").find(); // trueShiro 中的 RegexRequestMatcher
Shiro 的
RegexRequestMatcher在构造Pattern时未传入DOTALL标志:// RegexRequestMatcher.java 简化逻辑private Pattern pattern;public RegexRequestMatcher(String pattern, Environment environment) { this.pattern = Pattern.compile(pattern); // 无 DOTALL}绕过路径
当权限配置为
/permit/.*时,正常路径/permit/hello会被匹配。但若请求路径为/permit/%0Ahello(URL 编码的换行符),Shiro 解析后的实际路径为/permit/\nhello。由于.不匹配\n,正则.*无法匹配该路径,Shiro 认为该路径无需认证,从而直接放行。
漏洞复现
前置条件
- 运行中的 Apache Shiro 应用(版本 < 1.9.1)
- 配置了
RegexRequestMatcher并使用.*等含.的正则表达式 - 自定义的 Token 认证过滤器(仅校验 Header 中的 token)
复现步骤
验证正常访问被拦截
不带 Token 访问受保护路径,Shiro 正常拦截请求:
curl -v http://target/permit/hello响应为
401 Unauthorized,认证流程正常。构造恶意请求
在 URL 中注入换行符(
%0A),绕过正则匹配:curl -v "http://target/permit/%0Ahello"Shiro 内部解析路径为
/permit/\nhello,正则.*无法匹配\n,权限校验被跳过,请求直接到达业务逻辑。验证绕过成功
对比两种请求的响应:
请求路径 是否拦截 原因 /permit/hello✅ 拦截 正则 .*正常匹配/permit/%0Ahello❌ 未拦截 .不匹配\n,正则匹配失败带 Token 的正常认证
携带合法 Token 访问原始路径,认证通过:
curl -v -H "Authorization: Bearer <valid_token>" http://target/permit/hello响应为
200 OK。
Warning
此漏洞在真实场景中可能导致未授权访问敏感接口,如管理后台、API 端点等。生产环境应尽快升级到修复版本或应用临时修复方案。
修复方案
临时修复:修改正则表达式
将正则中的 .* 替换为 [\s\S]*,后者可以匹配任意字符(包括换行符):
// 修复前"/permit/.*"// 修复后"/permit/[\s\S]*"[\s\S] 等价于启用 DOTALL 模式的 .,可在不升级 Shiro 版本的前提下规避此问题。
永久修复:升级 Shiro 版本
升级到 Apache Shiro ≥ 1.9.1,该版本已修复此问题,RegexRequestMatcher 在内部启用了 DOTALL 模式。
# Maven 依赖更新<dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.9.1</version></dependency>影响范围
| 组件 | 版本范围 | 状态 |
|---|---|---|
| Apache Shiro | < 1.9.1 | 受影响 |
| Apache Shiro | ≥ 1.9.1 | 已修复 |
参考
- CVE-2022-32532 官方公告
- Apache Shiro 1.9.1 发布说明
- Java Pattern.DOTALL 文档