一个简单的 Spring Boot 应用程序,演示了易受CVE-2022-31692攻击的配置。
此漏洞可能因其严重性而引起关注——它的 CVSS 3.x 基本分数为 9.8,因为它允许绕过身份验证。该项目的目的是演示公告中描述的导致漏洞适用的条件。
应用程序期望 Spring Security 应用安全性来转发和包含调度程序类型。
应用程序使用AuthorizationFilter
手动或通过authorizeHttpRequests()
方法。
应用程序将其配置FilterChainProxy
为适用于转发和/或包含请求(例如spring.security.filter.dispatcher-types = request, error, async, forward, include
)。
应用程序可以将请求转发或包含到更高特权保护的端点。
应用程序将 Spring Security 配置为通过以下方式应用于每个调度程序类型authorizeHttpRequests().shouldFilterAllDispatcherTypes(true)
作为参考,我很确定这是解决漏洞的提交。
该应用程序具有三个 URL:
/
索引页面
/admin
管理页面,要求用户提供基本身份验证(凭据“用户”/“通行证”)并分配 ROLE_ADMIN 角色
/forward
服务器端转发到管理页面
访问控制是通过 SecurityConfig 类中的 authorizeHttpRequests() 指定的。
.authorizeHttpRequests((authz) -> authz
.antMatchers("/").permitAll()
.antMatchers("/forward").permitAll()
.antMatchers("/admin").hasAuthority("ROLE_ADMIN")
.shouldFilterAllDispatcherTypes(true)
)
用户访问/
但未通过身份验证(感谢permitAll()
)
用户访问/admin
。他们不提供身份验证,请求被拒绝(401 未授权)。
用户访问/admin
。他们提供有效的身份验证,但请求仍然被拒绝(403 Unauthorized),因为他们没有所需的角色.hasAuthority("ROLE_ADMIN")
。
用户访问/forward
。他们的请求通过 GET /forward 的安全过滤器链,它通过了有效(感谢permitAll()
)。控制器处理请求,并返回forward:/admin
到 Dispatcher。按照spring.security.filter.dispatcher-types
and.shouldFilterAllDispatcherTypes(true)
设置的指示,这是一个 FORWARD 类型,所以应该再次通过过滤器链。第二次通过过滤器会导致请求被拒绝(再次感谢hasAuthority("ROLE_ADMIN")
)。
用户访问/forward
,请求通过过滤器链一次,并作为有效通过。转发被处理,但不是再次通过链传递,而是作为有效传递,并返回管理页面。
原文地址:https://github.com/SpindleSec/cve-2022-31692
点击阅读原文——跳转