Print document Edit on github

Apache Shiro before 1.10.0, Authentication Bypass Vulnerability in Shiro when forwarding or including via RequestDispatcher.1


漏洞概述

字段 内容
CVE 编号 CVE-2022-40664 / CVE-2022-32532
漏洞等级 🔴 高危
漏洞类型 认证绕过 (Authentication Bypass)
影响版本 Apache Shiro < 1.10.0
漏洞成因 RequestDispatcher forward/include 请求未正确纳入 Shiro Filter 的权限校验范围
修复版本 Apache Shiro 1.10.0

核心原理: Shiro 的 PathMatchingFilter 在处理 FORWARDINCLUDE 类型的 Dispatcher 请求时,未正确执行路径匹配和权限校验,导致通过 RequestDispatcher.forward() 转发的请求可以绕过 Shiro 配置的认证/授权 Filter。


1. Walkthrough — 攻击验证2

1.1 正常请求(应被拦截)

👉 正常请求 — 预期被 Shiro 拦截
GET /admin/auth_pass HTTP/1.1
Host: target.com

预期行为:Shiro 拦截该请求,返回 401 或重定向到登录页面(因为 /admin/** 路径需要认证)。

1.2 Bypass 请求(绕过认证)

👉 Bypass 请求 — 通过 forward 绕过
GET /admin/auth HTTP/1.1
Host: target.com

通过 RequestDispatcher.forward() 将请求转发到 /admin/auth,Shiro 的 Filter 链可能不会对 forward 请求执行权限校验,从而绕过认证。

1.3 携带自定义 Header 的请求

👉 携带自定义 Header 的请求
GET /admin/auth HTTP/1.1
Host: target.com
Token: 4ra1n

2. 漏洞代码分析 — redirect vs forward3

2.1 Controller 层代码

@RequestMapping("/admin/{value}")
public String CVE_2022_40664_bypass(
        @PathVariable String value,
        HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {

    System.out.println("=========== /admin" + request.getRequestURI() + "/ ===========");

    // 方式1: forward(漏洞利用点)
    // request.getRequestDispatcher("/admin/auth").forward(request, response);

    // 方式2: return forward 字符串
    // return "forward:" + request.getRequestURI();

    // 方式3: redirect(不会触发漏洞)
    response.sendRedirect("/admin/auth");
    return ("Redirect:/admin/auth");
}

关键区别: redirect 是客户端行为(302 响应),浏览器会发起新的 GET 请求,Shiro 会正常拦截;而 forward 是服务端行为,请求在同一容器内转发,Shiro 的 Filter 链可能不会对 forward 类型的 Dispatcher 请求执行权限校验。

2.2 forward 触发方式4

👉 forward 的三种触发方式
// 方式1: 直接使用 RequestDispatcher.forward()
request.getRequestDispatcher("/admin/auth").forward(request, response);

// 方式2: Spring MVC return forward 字符串
return "forward:" + request.getRequestURI();

// 方式3: Spring MVC <jsp:forward> 标签(JSP 页面中)
// <jsp:forward page="/admin/auth" />

3. Shiro 1.10.0 修复方案

3.1 Define Bean 方式修复5

在 Shiro 1.10.0 中,可以通过配置 ShiroFilterConfiguration 并注册自定义 MyShiroFilterFactoryBean 来修复此漏洞:

SecurityManager 完整配置6

👉 修复配置代码
@Bean
public MyShiroFilterFactoryBean filterRegBean(SecurityManager securityManager) throws Exception {
    // CVE-2022-40664
    // fixed conf
    ShiroFilterConfiguration conf = new ShiroFilterConfiguration();
    conf.setFilterOncePerRequest(false);

    ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
    shiroFilterFactoryBean.setSecurityManager(securityManager);
    shiroFilterFactoryBean.setShiroFilterConfiguration(conf);
    AbstractShiroFilter filter = shiroFilterFactoryBean.getObject();

    MyShiroFilterFactoryBean reg = new MyShiroFilterFactoryBean();
    reg.setFilter(filter);
    reg.addUrlPattern("/*");
    reg.setName("shiroFilter");
    reg.setSecurityManager(securityManager);
    reg.setDispatcherTypes(EnumSet.allOf(DispatcherType.class));
    // fixed conf end.
    return reg;
}

3.2 修复要点

配置项 作用 说明
setFilterOncePerRequest(false) 允许 Filter 在同一请求中多次执行 确保 forward 请求也会经过 Filter 链
setDispatcherTypes(EnumSet.allOf(DispatcherType.class)) 注册所有 Dispatcher 类型 包括 FORWARDINCLUDEERRORASYNC 等类型

修复效果: 通过将 DispatcherType.FORWARDDispatcherType.INCLUDE 纳入 Filter 的处理范围,确保 forward/include 请求也会经过 Shiro 的权限校验 Filter 链,从而修复认证绕过漏洞。


4. 根因分析

层级 问题
设计层 Shiro 的 Filter 注册默认仅处理 REQUEST 类型的 Dispatcher,未覆盖 FORWARDINCLUDE
代码层 PathMatchingFilter 在处理非 REQUEST 类型的 Dispatcher 时跳过了路径匹配和权限校验
配置层 默认的 ShiroFilterFactoryBean 未将 FORWARD 等 Dispatcher 类型注册到 Filter 中

5. 影响评估

维度 影响
机密性 🔴 高 — 绕过认证后可访问受保护的敏感资源
完整性 🟠 中 — 可能执行未授权的写操作
可用性 🔵 低 — 不直接影响系统可用性
业务影响 🔴 高 — 所有基于 Shiro 的权限校验均可被绕过

6. 修复建议

6.1 紧急修复(P0)

  1. 升级 Shiro 版本:将 Apache Shiro 升级到 1.10.0+,这是最彻底的修复方式。
  2. 临时配置修复:在无法立即升级的情况下,通过上述 ShiroFilterConfiguration 配置将 FORWARDINCLUDE 类型纳入 Filter 处理范围。

6.2 短期加固(P1)

  1. 代码审计:检查项目中所有使用 RequestDispatcher.forward()include() 的地方,确认是否涉及敏感路径。
  2. WAF 规则:在 WAF 层面添加对 forward/include 请求的检测规则。
  3. 日志监控:对异常的 forward 请求进行监控和告警。

6.3 长期加固(P2)

  1. 框架升级策略:建立定期的依赖库版本检查和升级机制,及时跟进安全补丁。
  2. 纵深防御:在 Shiro Filter 之外增加额外的认证/授权层(如 Spring Security、API Gateway),避免单点防护失效。

参考

贡献开源文档

贡献当前开源文档
此之前,学习开源贡献CN | EN

此文档对您有帮助吗

在本文中