
Spring Security 인가 우회 CVE-2022-31692에 취약한 앱을 시연하는 프로젝트입니다.
간단한 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 관리자 페이지. 사용자가 Basic auth(자격 증명 "user"/"pass")를 제공하고 ROLE_ADMIN 역할을 할당받아야 합니다./forward 관리자 페이지로의 서버 측 forward접근 제어는 SecurityConfig 클래스의 authorizeHttpRequests()를 통해 지정됩니다.
.authorizeHttpRequests((authz) -> authz
.antMatchers("/").permitAll()
.antMatchers("/forward").permitAll()
.antMatchers("/admin").hasAuthority("ROLE_ADMIN")
.shouldFilterAllDispatcherTypes(true)
)
/에 접근하고 인증되지 않습니다(permitAll() 덕분에)./admin에 접근합니다. 인증을 제공하지 않으면 요청이 거부됩니다(401 Not authorized)./admin에 접근합니다. 유효한 인증을 제공하지만, 필요한 역할 .hasAuthority("ROLE_ADMIN")이 없으므로 요청은 여전히 거부됩니다(403 Unauthorised)./forward에 접근합니다. 요청은 GET /forward에 대한 보안 필터 체인을 통과하며 permitAll() 덕분에 유효한 것으로 통과합니다. 컨트롤러는 요청을 처리하고 Dispatcher에 forward:/admin을 반환합니다. spring.security.filter.dispatcher-types 및 .shouldFilterAllDispatcherTypes(true) 설정에 따라 이는 FORWARD 유형이므로 필터 체인을 다시 통과해야 합니다. 필터를 두 번째로 통과하면 요청이 거부됩니다(역시 hasAuthority("ROLE_ADMIN") 덕분에).사용자가 /forward에 접근하면 요청은 필터 체인을 한 번 통과하여 유효한 것으로 통과합니다. forward가 처리되지만, 다시 체인을 통과하는 대신 그냥 유효한 것으로 통과되어 관리자 페이지가 반환됩니다.