
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); }
Oppure, se DispatcherServlet è distribuita su un percorso diverso, come /spring-mvc/*, allora invece di:
un'applicazione dovrebbe fare:
@Bean MvcRequestMatcher.Builder mvc(HandlerMappingIntrospector introspector) { return new MvcRequestMatcher.Builder(introspector).servletPath("/spring-mvc"); }
Separare il percorso servlet quando si costruisce un MvcRequestMatcher è importante per garantire che la richiesta venga abbinata correttamente.
== Branch
In questa repository c'è un branch per ogni release minore di Spring Security. Su quel branch c'è un commit per ogni esempio interessato con la mitigazione necessaria.
Ad esempio, sul branch 5.8.x, ci sono otto commit per correggere gli otto esempi che richiedono la mitigazione.
Quando 5.8.6, 6.0.6, 6.1.3 e 6.2.0-M2 verranno rilasciate, verranno apportate modifiche aggiuntive a quei branch in modo che la mitigazione best practice sia chiara.