
Un projet démontrant une application vulnérable au contournement d'autorisation Spring Security CVE-2022-31692
Une simple application Spring Boot démontrant une configuration vulnérable à CVE-2022-31692.
Cette vulnérabilité peut attirer l'attention en raison de sa sévérité - elle a un score de base CVSS 3.x de 9,8 car elle permet de contourner l'authentification. Le but de ce projet est de démontrer les conditions décrites dans l'avis, qui conduisent à l'applicabilité de la vulnérabilité.
AuthorizationFilter soit manuellement, soit via la méthode authorizeHttpRequests().FilterChainProxy pour s'appliquer aux requêtes forward et/ou include (par ex. spring.security.filter.dispatcher-types = request, error, async, forward, include).authorizeHttpRequests().shouldFilterAllDispatcherTypes(true)Pour référence, je suis presque sûr que ce commit est celui qui corrige la vulnérabilité.
L'application a trois URL :
/ La page d'accueil/admin Une page d'administration, qui nécessite que l'utilisateur fournisse une authentification Basic (identifiants "user"/"pass") et soit assigné au rôle ROLE_ADMIN/forward Un forward côté serveur vers la page d'administrationLes contrôles d'accès sont spécifiés via authorizeHttpRequests() dans la classe SecurityConfig.
.authorizeHttpRequests((authz) -> authz
.antMatchers("/").permitAll()
.antMatchers("/forward").permitAll()
.antMatchers("/admin").hasAuthority("ROLE_ADMIN")
.shouldFilterAllDispatcherTypes(true)
)
L'utilisateur accède à / et n'est pas authentifié (grâce à permitAll())
L'utilisateur accède à /admin. Il ne fournit pas d'authentification, et la requête est rejetée (401 Non autorisé).
L'utilisateur accède à /admin. Il fournit une authentification valide, mais la requête est toujours rejetée (403 Interdit) car il n'a pas le rôle requis .hasAuthority("ROLE_ADMIN").
L'utilisateur accède à /forward. Sa requête passe par la chaîne de filtres de sécurité pour GET /forward, qui est acceptée (grâce à permitAll()). Le contrôleur traite la requête et renvoie forward:/admin au répartiteur. Comme indiqué par les paramètres spring.security.filter.dispatcher-types et .shouldFilterAllDispatcherTypes(true), il s'agit d'un type FORWARD, donc il devrait être repassé dans la chaîne de filtres. Ce second passage dans le filtre entraîne le rejet de la requête (encore une fois, grâce à hasAuthority("ROLE_ADMIN")).
L'utilisateur accède à /forward, la requête est passée une fois dans la chaîne de filtres et est acceptée. Le forward est traité, mais au lieu d'être repassé dans la chaîne, il est simplement accepté, et la page d'administration est renvoyée.