
Dimostra la vulnerabilità CVE-2023-34035 in Spring Security con applicazioni di esempio vulnerabili e mitigate, insegnando la corretta configurazione del servlet mapping e del request matcher.
Questa repository è un insieme di esempi per dimostrare le configurazioni in cui le applicazioni possono essere vulnerabili a https://spring.io/security/cve-2023-34035[CVE-2023-34035].
Un'applicazione è vulnerabile quando sono vere tutte le seguenti condizioni:
Spring MVC è nel classpath
DispatcherServlet e almeno un'altra servlet sono mappate; una di esse con una mappatura servlet basata sul percorso (ad esempio, /path/**)
L'applicazione usa requestMatchers(String) per fare riferimento agli endpoint la cui mappatura servlet è della forma /path/**
== Esempi
C'è un insieme di esempi che usano Spring Boot e un insieme che non lo usa.
Gli esempi che contengono test che falliscono sono vulnerabili a CVE-2023-34035. Gli esempi i cui test passano non sono vulnerabili.
In tutti i casi, ciascuno di questi esempi contiene lo stesso errore di mitigazione di Spring Security, anche se si noti che tale mitigazione è temporanea in molte circostanze, in attesa del prossimo rilascio di manutenzione.
=== servlet:java-configuration:dispatcher-servlet-path
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/java-configuration/dispatcher-servlet-path[Questo esempio] rappresenta un'applicazione vulnerabile in cui DispatcherServlet è distribuita su /mvc/* invece della / predefinita.
È vulnerabile poiché Spring MVC è nel classpath, DispatcherServlet e almeno un'altra servlet sono mappate -- una di esse con una mappatura servlet basata sul percorso non-root (in questo caso, DispatcherServlet), e l'applicazione usa requestMatchers(String) per proteggere quegli endpoint.
=== servlet:java-configuration:jetty
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/java-configuration/jetty[Questo esempio] rappresenta un'applicazione sicura in cui DispatcherServlet è distribuita su / (la predefinita).
Non è vulnerabile. Sebbene Spring MVC sia nel classpath e DispatcherServlet sia in uso, è distribuita su / e non ci sono mappature servlet basate sul percorso non-root.
=== servlet:java-configuration:other-servlets
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/java-configuration/other-servlets[Questo esempio] rappresenta un'applicazione vulnerabile in cui DispatcherServlet è distribuita insieme a una servlet personalizzata MyServlet.
È vulnerabile poiché Spring MVC è nel classpath, DispatcherServlet e almeno un'altra servlet sono mappate -- una di esse con una mappatura servlet basata sul percorso non-root (in questo caso, MyServlet), e l'applicazione usa requestMatchers(String) per proteggere quegli endpoint.
=== servlet:java-configuration:tomcat
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/java-configuration/tomcat[Questo esempio] rappresenta un'applicazione sicura in cui DispatcherServlet è distribuita su / (la predefinita).
Non è vulnerabile. Sebbene Spring MVC sia nel classpath e DispatcherServlet sia in uso, è distribuita su / e non ci sono mappature servlet basate sul percorso non-root.
=== servlet:java-configuration:two-dispatcher-servlets
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/java-configuration/two-dispatcher-servlets[Questo esempio] rappresenta un'applicazione vulnerabile in cui DispatcherServlet è distribuita insieme a una servlet personalizzata MyServlet.
È vulnerabile poiché Spring MVC è nel classpath, DispatcherServlet e almeno un'altra servlet sono mappate -- una di esse con una mappatura servlet basata sul percorso non-root (in questo caso, una delle due DispatcherServlet), e l'applicazione usa requestMatchers(String) per proteggere quegli endpoint.
=== servlet:spring-boot:java:dispatcher-servlet-path
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/spring-boot/java/dispatcher-servlet-path[Questo esempio] rappresenta un'applicazione vulnerabile in cui DispatcherServlet è distribuita su /mvc/* invece della / predefinita.
È vulnerabile poiché Spring MVC è nel classpath, DispatcherServlet e almeno un'altra servlet sono mappate -- una di esse con una mappatura servlet basata sul percorso non-root (in questo caso, DispatcherServlet), e l'applicazione usa requestMatchers(String) per proteggere quegli endpoint.
=== servlet:spring-boot:java:jetty
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/spring-boot/java/jetty[Questo esempio] rappresenta un'applicazione sicura in cui DispatcherServlet è distribuita su / (la predefinita).
Non è vulnerabile. Sebbene Spring MVC sia nel classpath e DispatcherServlet sia in uso, è distribuita su / e non ci sono mappature servlet basate sul percorso non-root.
=== servlet:spring-boot:java:other-servlets
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/spring-boot/java/other-servlets[Questo esempio] rappresenta un'applicazione vulnerabile in cui DispatcherServlet è distribuita insieme a una servlet personalizzata MyServlet.
È vulnerabile poiché Spring MVC è nel classpath, DispatcherServlet e almeno un'altra servlet sono mappate -- una di esse con una mappatura servlet basata sul percorso non-root (in questo caso, MyServlet), e l'applicazione usa requestMatchers(String) per proteggere quegli endpoint.
=== servlet:spring-boot:java:tomcat
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/spring-boot/java/tomcat[Questo esempio] rappresenta un'applicazione sicura in cui DispatcherServlet è distribuita su / (la predefinita).
Non è vulnerabile. Sebbene Spring MVC sia nel classpath e DispatcherServlet sia in uso, è distribuita su / e non ci sono mappature servlet basate sul percorso non-root.
=== servlet:spring-boot:java:undertow
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/spring-boot/java/undertow[Questo esempio] rappresenta un'applicazione sicura in cui DispatcherServlet è distribuita su / (la predefinita).
Non è vulnerabile. Sebbene Spring MVC sia nel classpath e DispatcherServlet sia in uso, è distribuita su / e non ci sono mappature servlet basate sul percorso non-root.
== Mitigazioni
Nel caso in cui si riceva un errore come il seguente:
requestMatchers(MvcRequestMatcher);
otherwise, please use requestMatchers(AntPathRequestMatcher).[NOTE]
Le versioni 5.8.5, 6.0.5, 6.1.2 e 6.2.0-M1 di Spring Security hanno alcuni falsi positivi. Si noti che in molti casi quanto segue è temporaneo, in attesa del rilascio di 5.8.6, 6.0.6, 6.1.3 e 6.2.0-M2.
Come accennato dal messaggio di errore, la mitigazione principale consiste nell'usare un RequestMatcher completo. Questo serve a tenere meglio in considerazione la mappatura servlet.
Ad esempio, se un'applicazione ha una servlet distribuita su /my-servlet/* e autorizza quel traffico in questo modo:
allora, l'applicazione dovrebbe invece fare:
import static org.springframework.security.web.util.matcher.AntPathRequestMatcher.antMatcher;
@Bean MvcRequestMatcher.Builder mvc(HandlerMappingIntrospector introspector) { return new MvcRequestMatcher.Builder(introspector); }