
Un progetto che dimostra un'app vulnerabile al bypass dell'autorizzazione di Spring Security CVE-2022-31692
Una semplice applicazione Spring Boot che dimostra una configurazione vulnerabile a CVE-2022-31692.
Questa vulnerabilità può attirare l'attenzione per la sua gravità: ha un punteggio base CVSS 3.x di 9.8 in quanto consente il bypass dell'autenticazione. Lo scopo di questo progetto è dimostrare le condizioni descritte nell'avviso, che portano all'applicabilità della vulnerabilità.
AuthorizationFilter manualmente o tramite il metodo authorizeHttpRequests().FilterChainProxy per applicarsi a richieste forward e/o include (ad es. spring.security.filter.dispatcher-types = request, error, async, forward, include).authorizeHttpRequests().shouldFilterAllDispatcherTypes(true)Per riferimento, sono abbastanza sicuro che questo sia il commit che risolve la vulnerabilità.
L'applicazione ha tre URL:
/ La pagina principale/admin Una pagina di amministrazione, che richiede all'utente di fornire autenticazione Basic (credenziali "user"/"pass") e di avere il ruolo ROLE_ADMIN/forward Un forward lato server verso la pagina di amministrazioneI controlli di accesso sono specificati tramite authorizeHttpRequests() nella classe SecurityConfig.
.authorizeHttpRequests((authz) -> authz
.antMatchers("/").permitAll()
.antMatchers("/forward").permitAll()
.antMatchers("/admin").hasAuthority("ROLE_ADMIN")
.shouldFilterAllDispatcherTypes(true)
)
L'utente accede a / e non è autenticato (grazie a permitAll())
L'utente accede a /admin. Non fornisce autenticazione e la richiesta viene rifiutata (401 Non autorizzato).
L'utente accede a /admin. Fornisce autenticazione valida, ma la richiesta viene comunque rifiutata (403 Non autorizzato)
perché non ha il ruolo richiesto .hasAuthority("ROLE_ADMIN").
L'utente accede a /forward. La sua richiesta attraversa la catena di filtri di sicurezza per GET /forward, che passa
come valida (grazie a permitAll()). Il controller elabora la richiesta e restituisce forward:/admin al Dispatcher.
Come indicato dalle impostazioni spring.security.filter.dispatcher-types e .shouldFilterAllDispatcherTypes(true),
questo è un tipo FORWARD, quindi dovrebbe essere nuovamente passato attraverso la catena di filtri. Questo secondo passaggio
attraverso il filtro comporta il rifiuto della richiesta (ancora, grazie a hasAuthority("ROLE_ADMIN")).
L'utente accede a /forward, la richiesta viene passata attraverso la catena di filtri una volta e passa come valida. Il forward viene elaborato, ma invece di essere passato nuovamente attraverso la catena, viene semplicemente considerato valido e viene restituita la pagina di amministrazione.