
Zeigt die CVE-2023-34035-Sicherheitslücke in Spring Security mit anfälligen und abgemilderten Beispielanwendungen und vermittelt die richtige Servlet-Mapping- und Request-Matcher-Konfiguration.
Dieses Repository enthält eine Reihe von Beispielen, die die Konstellationen demonstrieren, in denen Anwendungen anfällig für https://spring.io/security/cve-2023-34035[CVE-2023-34035] sein können.
Eine Anwendung ist anfällig, wenn alle der folgenden Bedingungen zutreffen:
DispatcherServlet und mindestens ein weiterer Servlet sind gemappt; einer von ihnen hat ein pfadbasiertes Servlet-Mapping (z. B. /path/**)requestMatchers(String), um auf Endpunkte zu verweisen, deren Servlet-Mapping die Form /path/** hat== Beispiele
Es gibt eine Reihe von Beispielen, die Spring Boot verwenden, und eine Reihe, die dies nicht tun.
Die Beispiele, die fehlschlagende Tests enthalten, sind anfällig für CVE-2023-34035. Die Beispiele, deren Tests bestanden werden, sind nicht anfällig.
In allen Fällen enthält jedes dieser Beispiele denselben Fehler in der Schadensbegrenzung von Spring Security, wobei zu beachten ist, dass eine solche Begrenzung in vielen Fällen vorübergehend ist, bis das nächste Wartungs-Release veröffentlicht wird.
=== servlet:java-configuration:dispatcher-servlet-path
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/java-configuration/dispatcher-servlet-path[Dieses Beispiel] stellt eine anfällige Anwendung dar, bei der DispatcherServlet auf /mvc/* statt auf das Standard-/ bereitgestellt wird.
Es ist anfällig, da Spring MVC im Classpath ist, DispatcherServlet und mindestens ein weiterer Servlet gemappt sind – einer von ihnen mit einem nicht-root-pfadbasierten Servlet-Mapping (in diesem Fall DispatcherServlet) – und die Anwendung requestMatchers(String) verwendet, um diese Endpunkte zu schützen.
=== servlet:java-configuration:jetty
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/java-configuration/jetty[Dieses Beispiel] stellt eine sichere Anwendung dar, bei der DispatcherServlet auf / (das Standard) bereitgestellt wird.
Es ist nicht anfällig. Obwohl Spring MVC im Classpath ist und DispatcherServlet verwendet wird, ist es auf / bereitgestellt und es gibt keine nicht-root-pfadbasierten Servlet-Mappings.
=== servlet:java-configuration:other-servlets
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/java-configuration/other-servlets[Dieses Beispiel] stellt eine anfällige Anwendung dar, bei der sowohl DispatcherServlet als auch ein benutzerdefinierter Servlet MyServlet bereitgestellt werden.
Es ist anfällig, da Spring MVC im Classpath ist, DispatcherServlet und mindestens ein weiterer Servlet gemappt sind – einer von ihnen mit einem nicht-root-pfadbasierten Servlet-Mapping (in diesem Fall MyServlet) – und die Anwendung requestMatchers(String) verwendet, um diese Endpunkte zu schützen.
=== servlet:java-configuration:tomcat
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/java-configuration/tomcat[Dieses Beispiel] stellt eine sichere Anwendung dar, bei der DispatcherServlet auf / (das Standard) bereitgestellt wird.
Es ist nicht anfällig. Obwohl Spring MVC im Classpath ist und DispatcherServlet verwendet wird, ist es auf / bereitgestellt und es gibt keine nicht-root-pfadbasierten Servlet-Mappings.
=== servlet:java-configuration:two-dispatcher-servlets
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/java-configuration/two-dispatcher-servlets[Dieses Beispiel] stellt eine anfällige Anwendung dar, bei der DispatcherServlet sowie ein benutzerdefinierter Servlet MyServlet bereitgestellt werden.
Es ist anfällig, da Spring MVC im Classpath ist, DispatcherServlet und mindestens ein weiterer Servlet gemappt sind – einer von ihnen mit einem nicht-root-pfadbasierten Servlet-Mapping (in diesem Fall einer der beiden DispatcherServlets) – und die Anwendung requestMatchers(String) verwendet, um diese Endpunkte zu schützen.
=== servlet:spring-boot:java:dispatcher-servlet-path
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/spring-boot/java/dispatcher-servlet-path[Dieses Beispiel] stellt eine anfällige Anwendung dar, bei der DispatcherServlet auf /mvc/* statt auf das Standard-/ bereitgestellt wird.
Es ist anfällig, da Spring MVC im Classpath ist, DispatcherServlet und mindestens ein weiterer Servlet gemappt sind – einer von ihnen mit einem nicht-root-pfadbasierten Servlet-Mapping (in diesem Fall DispatcherServlet) – und die Anwendung requestMatchers(String) verwendet, um diese Endpunkte zu schützen.
=== servlet:spring-boot:java:jetty
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/spring-boot/java/jetty[Dieses Beispiel] stellt eine sichere Anwendung dar, bei der DispatcherServlet auf / (das Standard) bereitgestellt wird.
Es ist nicht anfällig. Obwohl Spring MVC im Classpath ist und DispatcherServlet verwendet wird, ist es auf / bereitgestellt und es gibt keine nicht-root-pfadbasierten Servlet-Mappings.
=== servlet:spring-boot:java:other-servlets
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/spring-boot/java/other-servlets[Dieses Beispiel] stellt eine anfällige Anwendung dar, bei der sowohl DispatcherServlet als auch ein benutzerdefinierter Servlet MyServlet bereitgestellt werden.
Es ist anfällig, da Spring MVC im Classpath ist, DispatcherServlet und mindestens ein weiterer Servlet gemappt sind – einer von ihnen mit einem nicht-root-pfadbasierten Servlet-Mapping (in diesem Fall MyServlet) – und die Anwendung requestMatchers(String) verwendet, um diese Endpunkte zu schützen.
=== servlet:spring-boot:java:tomcat
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/spring-boot/java/tomcat[Dieses Beispiel] stellt eine sichere Anwendung dar, bei der DispatcherServlet auf / (das Standard) bereitgestellt wird.
Es ist nicht anfällig. Obwohl Spring MVC im Classpath ist und DispatcherServlet verwendet wird, ist es auf / bereitgestellt und es gibt keine nicht-root-pfadbasierten Servlet-Mappings.
=== servlet:spring-boot:java:undertow
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/spring-boot/java/undertow[Dieses Beispiel] stellt eine sichere Anwendung dar, bei der DispatcherServlet auf / (das Standard) bereitgestellt wird.
Es ist nicht anfällig. Obwohl Spring MVC im Classpath ist und DispatcherServlet verwendet wird, ist es auf / bereitgestellt und es gibt keine nicht-root-pfadbasierten Servlet-Mappings.
== Abhilfemaßnahmen
Falls ein Fehler wie der folgende auftritt:
requestMatchers(MvcRequestMatcher);
otherwise, please use requestMatchers(AntPathRequestMatcher).sollten Sie ihn befolgen.
[HINWEIS]
Die Versionen 5.8.5, 6.0.5, 6.1.2 und 6.2.0-M1 von Spring Security weisen einige Fehlalarme auf.
Nun ist das Folgende in vielen Fällen vorübergehend, bis die Versionen 5.8.6, 6.0.6, 6.1.3 und 6.2.0-M2 veröffentlicht werden.
Wie die Fehlermeldung andeutet, besteht die primäre Abhilfemaßnahme darin, einen vollständigen RequestMatcher zu verwenden.
Dadurch kann das Servlet-Mapping genauer berücksichtigt werden.
Wenn eine Anwendung beispielsweise einen Servlet unter /my-servlet/* bereitgestellt hat und den Datenverkehr wie folgt autorisiert:
dann sollte die Anwendung stattdessen Folgendes tun:
import static org.springframework.security.web.util.matcher.AntPathRequestMatcher.antMatcher;
@Bean MvcRequestMatcher.Builder mvc(HandlerMappingIntrospector introspector) { return new MvcRequestMatcher.Builder(introspector); }
Oder wenn DispatcherServlet auf einen anderen Pfad bereitgestellt wird, z. B. /spring-mvc/*, dann anstelle von:
sollte eine Anwendung Folgendes tun:
@Bean MvcRequestMatcher.Builder mvc(HandlerMappingIntrospector introspector) { return new MvcRequestMatcher.Builder(introspector).servletPath("/spring-mvc"); }
Die Trennung des Servlet-Pfads bei der Konstruktion eines MvcRequestMatcher ist wichtig, um sicherzustellen, dass die Anfrage korrekt zugeordnet wird.
== Branches
In diesem Repository gibt es einen Branch für jedes Minor-Release von Spring Security. Auf diesem Branch gibt es einen Commit für jedes betroffene Beispiel mit der erforderlichen Abhilfemaßnahme.
Zum Beispiel gibt es auf dem 5.8.x-Branch acht Commits, um die acht Beispiele zu reparieren, die eine Abhilfemaßnahme erfordern.
Wenn 5.8.6, 6.0.6, 6.1.3 und 6.2.0-M2 veröffentlicht werden, werden zusätzliche Änderungen an diesen Branches vorgenommen, damit die bewährte Abhilfemaßnahme klar ist.