
Un proyecto que demuestra una aplicación vulnerable a la omisión de autorización de Spring Security CVE-2022-31692
Una aplicación Spring Boot simple que demuestra una configuración vulnerable a CVE-2022-31692.
Esta vulnerabilidad puede llamar la atención por su severidad - tiene una puntuación base CVSS 3.x de 9.8, ya que permite la omisión de autenticación. El propósito de este proyecto es demostrar las condiciones descritas en el aviso, que hacen que la vulnerabilidad sea aplicable.
AuthorizationFilter ya sea manualmente o mediante el método authorizeHttpRequests().FilterChainProxy para que se aplique a solicitudes forward y/o include (por ejemplo, spring.security.filter.dispatcher-types = request, error, async, forward, include).authorizeHttpRequests().shouldFilterAllDispatcherTypes(true)Como referencia, estoy bastante seguro de que este es el commit que aborda la vulnerabilidad.
La aplicación tiene tres URLs:
/ La página de inicio/admin Una página de administración, que requiere que el usuario proporcione autenticación Basic (credenciales "user"/"pass") y se le asigne el rol ROLE_ADMIN/forward Un forward del lado del servidor a la página de administraciónLos controles de acceso se especifican mediante authorizeHttpRequests() en la clase SecurityConfig.
.authorizeHttpRequests((authz) -> authz
.antMatchers("/").permitAll()
.antMatchers("/forward").permitAll()
.antMatchers("/admin").hasAuthority("ROLE_ADMIN")
.shouldFilterAllDispatcherTypes(true)
)
El usuario accede a / y no está autenticado (gracias a permitAll())
El usuario accede a /admin. No proporciona autenticación, y la solicitud es rechazada (401 No autorizado).
El usuario accede a /admin. Proporciona autenticación válida, pero la solicitud sigue siendo rechazada (403 No autorizado)
porque no tiene el rol requerido .hasAuthority("ROLE_ADMIN").
El usuario accede a /forward. Su solicitud pasa a través de la cadena de filtros de seguridad para GET /forward, siendo considerada válida
(gracias a permitAll()). El controlador procesa la solicitud y devuelve forward:/admin al Dispatcher.
Según lo indicado por los ajustes spring.security.filter.dispatcher-types y .shouldFilterAllDispatcherTypes(true),
este es un tipo FORWARD, por lo que debería pasar por la cadena de filtros nuevamente. Este segundo paso a través del filtro hace
que la solicitud sea rechazada (nuevamente, gracias a hasAuthority("ROLE_ADMIN")).
El usuario accede a /forward, la solicitud pasa por la cadena de filtros una vez y se considera válida. El forward es
procesado, pero en lugar de pasar nuevamente por la cadena, simplemente se considera válido, y la página de administración es
devuelta.