
Spring Securityの認証バイパス脆弱性CVE-2022-31692に脆弱なアプリを示すプロジェクト
CVE-2022-31692 に対して脆弱な構成を示す、シンプルな Spring Boot アプリケーションです。
この脆弱性は、その深刻度から注目を集める可能性があります。認証バイパスを可能にするため、CVSS 3.x の基本スコアは 9.8 です。 このプロジェクトの目的は、アドバイザリに記載されている、脆弱性が適用可能となる条件を示すことです。
authorizeHttpRequests() メソッドを介して AuthorizationFilter を使用します。FilterChainProxy がフォワードおよび/またはインクルードリクエストに適用されるように構成します(例: spring.security.filter.dispatcher-types = request, error, async, forward, include)。authorizeHttpRequests().shouldFilterAllDispatcherTypes(true) を介して、Spring Security がすべてのディスパッチャタイプに適用されるように構成します。参考までに、脆弱性に対処するコミットはこれだと思います。
アプリケーションには3つのURLがあります。
/ インデックスページ/admin 管理者ページ。ユーザーは Basic 認証(認証情報は "user"/"pass")を提供し、ROLE_ADMIN ロールが割り当てられている必要があります。/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() のおかげで有効と判定されます。コントローラーがリクエストを処理し、forward:/admin を Dispatcher に返します。spring.security.filter.dispatcher-types と .shouldFilterAllDispatcherTypes(true) 設定の指示により、これは FORWARD タイプであるため、フィルタチェーンをもう一度通過する必要があります。この2回目のフィルタ通過により、リクエストは拒否されます(再び hasAuthority("ROLE_ADMIN") のおかげ)。
ユーザーが /forward にアクセスすると、リクエストはフィルタチェーンを1回通過し、有効と判定されます。フォワードが処理されますが、チェーンをもう一度通過する代わりに、そのまま有効と判定され、管理者ページが返されます。