一个简单的 Spring Boot 应用程序,演示了一种存在 CVE-2022-31692 漏洞的配置。
该漏洞因其严重性而备受关注——它的 CVSS 3.x 基础评分为 9.8,因为它允许身份验证绕过。 本项目的目的是演示安全公告中描述的、导致该漏洞成立的条件。
AuthorizationFilter,或通过 authorizeHttpRequests() 方法使用。FilterChainProxy 配置为应用于 forward 和/或 include 请求(例如 spring.security.filter.dispatcher-types = request, error, async, forward, include)。authorizeHttpRequests().shouldFilterAllDispatcherTypes(true) 将 Spring Security 配置为应用于所有调度器类型。作为参考,我很确定 这个提交 就是修复该漏洞的提交。
该应用程序有三个 URL:
/ 首页/admin 一个 admin 页面,要求用户提供 Basic 认证(凭据 "user"/"pass")并被分配 ROLE_ADMIN 角色/forward 一个服务端 forward 到 admin 页面访问控制通过 SecurityConfig 类中的 authorizeHttpRequests() 指定。
.authorizeHttpRequests((authz) -> authz
.antMatchers("/").permitAll()
.antMatchers("/forward").permitAll()
.antMatchers("/admin").hasAuthority("ROLE_ADMIN")
.shouldFilterAllDispatcherTypes(true)
)
用户访问 / 且未经过身份验证(由于 permitAll())
用户访问 /admin 。他们未提供身份验证,请求被拒绝(401 Not authorized)。
用户访问 /admin 。他们提供了有效的身份验证,但请求仍然被拒绝(403 Unauthorised)
因为他们没有所需的角色 .hasAuthority("ROLE_ADMIN")。
用户访问 /forward。他们的请求通过针对 GET /forward 的安全过滤器链,并通过
校验(由于 permitAll())。控制器处理请求,并向 Dispatcher 返回 forward:/admin。
按照 spring.security.filter.dispatcher-types 和 .shouldFilterAllDispatcherTypes(true) 设置的指示,
这是一个 FORWARD 类型,因此应再次通过过滤器链。第二次经过过滤器会导致请求被拒绝
(同样,由于 hasAuthority("ROLE_ADMIN"))。
用户访问 /forward,请求仅通过过滤器链一次,并通过校验。forward 被
处理,但不会再次通过过滤器链,而是直接通过校验,并返回
admin 页面。