CVE-2022-31692:Spring Security 中的授权规则可以通过 forward 或 include 调度器类型绕过

高危 | 2022 年 10 月 31 日 | CVE-2022-31692

描述

Spring Security 5.7 版本在 5.7.5 之前以及 5.6 版本在 5.6.9 之前可能容易受到通过 forward 或 include 调度器类型绕过授权规则的攻击。

具体来说,当满足以下所有条件时,应用程序是脆弱的:

  • 应用程序期望 Spring Security 将安全性应用于 forward 和 include 调度器类型。
  • 应用程序手动或通过 authorizeHttpRequests() 方法使用 AuthorizationFilter
  • 应用程序配置 FilterChainProxy 以应用于 forward 和/或 include 请求(例如 spring.security.filter.dispatcher-types = request, error, async, forward, include)。
  • 应用程序可能将请求 forward 或 include 到具有更高权限保护的端点。
  • 应用程序通过 authorizeHttpRequests().shouldFilterAllDispatcherTypes(true) 配置 Spring Security 以应用于所有调度器类型。

如果满足以下任一条件,应用程序则不易受攻击:

  • 应用程序不使用 authorizeHttpRequests()AuthorizationFilter
  • 应用程序不进行 forward/include 请求。
  • 应用程序不需要配置 Spring Security 以应用于 FORWARD 和 INCLUDE 调度器类型。

受影响的 Spring 产品和版本

  • Spring Security
    • 5.7.0 到 5.7.4
    • 5.6.0 到 5.6.8

缓解措施

受影响版本的用户应采取以下缓解措施:

  • 5.7.x 用户应升级到 5.7.5
  • 5.6.x 用户应升级到 5.6.9
  • 无法升级版本的用户应使用 authorizeRequests().filterSecurityInterceptorOncePerRequest(false),而不是 authorizeHttpRequests().shouldFilterAllDispatcherTypes(true)
  • 5.7.0 以下版本且不提供 shouldFilterAllDispatcherTypes 的用户应添加一个 ObjectPostProcessor
    authorizeHttpRequests().withObjectPostProcessor(new
    ObjectPostProcessor() {
      @Override
      public O postProcess(O filter) {
       filter.setObserveOncePerRequest(false);
       filter.setFilterAsyncDispatch(true);
       filter.setFilterErrorDispatch(true);
       return filter;
      }});

请注意,在 Spring Security 5 中,默认行为是不对同一请求多次应用过滤器,因此您必须显式配置 Spring Security 来实现这一点。此外,FilterChainProxy 默认也不配置为在 forward 和 include 调度器类型上调用,这取决于您自行进行配置。

已修复此问题的版本包括:

  • Spring Security
    • 5.7.5
    • 5.6.9

致谢

此问题由奇安信集团网神安全实验室(SGLAB of Legendsec at Qi'anxin Group)的 Osword 负责任地识别并报告。

参考资料

历史记录

  • 2022-10-31:首次发布漏洞报告。

快人一步

VMware 提供培训和认证,助您加速前进。

了解更多

获取支持

Tanzu Spring 通过一项简单的订阅,为 OpenJDK™、Spring 和 Apache Tomcat® 提供支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区的所有即将举行的活动。

查看全部