浅谈Apache shiro 权限绕过漏洞(CVE-2023-34478)
字数 1864 2025-08-06 08:34:54

Apache Shiro 权限绕过漏洞(CVE-2023-34478)深度分析

0x00 漏洞背景

Apache Shiro 是一个功能强大且易于使用的 Java 安全框架,提供身份验证、授权、加密和会话管理等功能。CVE-2023-34478 是一个与路径解析差异相关的权限绕过漏洞,影响非 Spring 框架特定场景下的 Shiro 使用。

0x01 漏洞描述

该漏洞允许攻击者通过构造特定格式的请求路径,在非 Spring 框架环境下(如 Jersey)绕过 Shiro 的身份验证机制。这是由于 Shiro 与 Jersey 框架对路径解析处理方式不同导致的。

0x02 技术原理分析

2.1 Shiro 请求解析机制

Shiro 的请求解析主要发生在 org.apache.shiro.web.filter.mgt.PathMatchingFilterChainResolver#getChain 方法中:

  1. 路径获取:通过 getPathWithinApplication 方法获取应用程序内的 URI 相对路径

    • 使用 request.getServletPath() + request.getPathInfo() 获取原始 URI
    • 调用 removeSemicolon 移除分号
    • 调用 normalize 方法处理路径
  2. 路径规范化normalize 方法会处理路径穿越符 (.././),确保路径不会超出应用范围

  3. 过滤器链匹配:最终根据处理后的 URL 进行路径匹配,确定需要执行的过滤器链

2.2 Jersey 请求解析机制

Jersey 的请求处理流程:

  1. 核心处理:通过 ApplicationHandler.handle 方法处理请求,最终调用 this.runtime.process(request)

  2. 路由阶段

    • 使用 Stages.process() 方法处理请求
    • 主要依赖 org.glassfish.jersey.server.internal.routing.RoutingStage 解析请求 URI
  3. 路径处理特点

    • 调用 encodedRelativePath 获取编码后的相对路径
    • 使用 stripMatrixParams 剔除 URI 中的矩阵参数
    • 关键差异:Jersey 不会对路径穿越符 (../) 进行额外处理

2.3 解析差异导致的安全问题

当 Shiro 和 Jersey 同时使用时:

  • Shiro 会规范化路径中的 ../,认为请求是合法的
  • Jersey 不处理 ../,直接按原始路径路由
  • 这种差异导致攻击者可以构造特殊路径绕过 Shiro 的认证检查

0x03 漏洞复现

环境配置示例

  1. Shiro 配置
@Bean
ShiroFilterFactoryBean shiroFilterFactoryBean() {
    ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
    bean.setSecurityManager(securityManager());
    bean.setLoginUrl("/login");
    bean.setSuccessUrl("/index");
    bean.setUnauthorizedUrl("/unauthorizedurl");
    
    Map<String, String> map = new LinkedHashMap<>();
    map.put("/doLogin/", "anon");
    map.put("/api/**", "authc");  // 要求认证
    bean.setFilterChainDefinitionMap(map);
    return bean;
}
  1. Jersey 资源类
@GET
@Path("/{path : .*}")  // 匹配任意路径
public Response getUser(@PathParam("path") @Encoded String path) {
    return Response.ok().entity(path).build();
}

攻击方式

  1. 正常访问 /api/page 会被重定向到登录页面(302)
  2. 构造特殊请求:/api/../page 或 URL 编码形式 /api/%2e%2e/page
    • Shiro 解析为 /api/page,要求认证
    • Jersey 解析为 /page,绕过认证检查

0x04 修复方案

Shiro 官方修复

  1. 引入 InvalidRequestFilter 过滤器
  2. isValid 方法中增加 containsTraversal 检查:
    • 检测 ./../ 等路径穿越符
    • 考虑 URL 编码绕过情况(如 %2e%2e/

其他安全建议

  1. Spring Security 参考方案

    • 使用 StrictHttpFirewall 拦截非法请求
    • 拦截内容包括:
      • 分号 (;, %3b, %3B)
      • 斜杠 (%2f, %2F)
      • 反斜杠 (\, %5c, %5B)
      • URL 编码的百分号 (%25)
      • 英文句点 (., %2e, %2E)
  2. 通用防御措施

    • 保持框架版本更新
    • 实施多层防御机制
    • 对关键接口进行额外权限校验

0x05 总结

CVE-2023-34478 展示了当安全框架与其他 Web 框架配合使用时,由于路径解析逻辑差异可能导致的安全问题。开发者应当:

  1. 充分了解各框架的请求处理机制
  2. 及时应用安全补丁
  3. 实施深度防御策略
  4. 对关键接口进行独立权限验证

该漏洞也提醒我们,在微服务架构中,不同组件间的安全假设必须保持一致,否则可能产生安全边界被突破的风险。

Apache Shiro 权限绕过漏洞(CVE-2023-34478)深度分析 0x00 漏洞背景 Apache Shiro 是一个功能强大且易于使用的 Java 安全框架,提供身份验证、授权、加密和会话管理等功能。CVE-2023-34478 是一个与路径解析差异相关的权限绕过漏洞,影响非 Spring 框架特定场景下的 Shiro 使用。 0x01 漏洞描述 该漏洞允许攻击者通过构造特定格式的请求路径,在非 Spring 框架环境下(如 Jersey)绕过 Shiro 的身份验证机制。这是由于 Shiro 与 Jersey 框架对路径解析处理方式不同导致的。 0x02 技术原理分析 2.1 Shiro 请求解析机制 Shiro 的请求解析主要发生在 org.apache.shiro.web.filter.mgt.PathMatchingFilterChainResolver#getChain 方法中: 路径获取 :通过 getPathWithinApplication 方法获取应用程序内的 URI 相对路径 使用 request.getServletPath() + request.getPathInfo() 获取原始 URI 调用 removeSemicolon 移除分号 调用 normalize 方法处理路径 路径规范化 : normalize 方法会处理路径穿越符 ( ../ 或 ./ ),确保路径不会超出应用范围 过滤器链匹配 :最终根据处理后的 URL 进行路径匹配,确定需要执行的过滤器链 2.2 Jersey 请求解析机制 Jersey 的请求处理流程: 核心处理 :通过 ApplicationHandler.handle 方法处理请求,最终调用 this.runtime.process(request) 路由阶段 : 使用 Stages.process() 方法处理请求 主要依赖 org.glassfish.jersey.server.internal.routing.RoutingStage 解析请求 URI 路径处理特点 : 调用 encodedRelativePath 获取编码后的相对路径 使用 stripMatrixParams 剔除 URI 中的矩阵参数 关键差异 :Jersey 不会对路径穿越符 ( ../ ) 进行额外处理 2.3 解析差异导致的安全问题 当 Shiro 和 Jersey 同时使用时: Shiro 会规范化路径中的 ../ ,认为请求是合法的 Jersey 不处理 ../ ,直接按原始路径路由 这种差异导致攻击者可以构造特殊路径绕过 Shiro 的认证检查 0x03 漏洞复现 环境配置示例 Shiro 配置 : Jersey 资源类 : 攻击方式 正常访问 /api/page 会被重定向到登录页面(302) 构造特殊请求: /api/../page 或 URL 编码形式 /api/%2e%2e/page Shiro 解析为 /api/page ,要求认证 Jersey 解析为 /page ,绕过认证检查 0x04 修复方案 Shiro 官方修复 引入 InvalidRequestFilter 过滤器 在 isValid 方法中增加 containsTraversal 检查: 检测 ./ 、 ../ 等路径穿越符 考虑 URL 编码绕过情况(如 %2e%2e/ ) 其他安全建议 Spring Security 参考方案 : 使用 StrictHttpFirewall 拦截非法请求 拦截内容包括: 分号 ( ; , %3b , %3B ) 斜杠 ( %2f , %2F ) 反斜杠 ( \ , %5c , %5B ) URL 编码的百分号 ( %25 ) 英文句点 ( . , %2e , %2E ) 通用防御措施 : 保持框架版本更新 实施多层防御机制 对关键接口进行额外权限校验 0x05 总结 CVE-2023-34478 展示了当安全框架与其他 Web 框架配合使用时,由于路径解析逻辑差异可能导致的安全问题。开发者应当: 充分了解各框架的请求处理机制 及时应用安全补丁 实施深度防御策略 对关键接口进行独立权限验证 该漏洞也提醒我们,在微服务架构中,不同组件间的安全假设必须保持一致,否则可能产生安全边界被突破的风险。