
Este repositorio es un conjunto de ejemplos para demostrar las configuraciones en las que las aplicaciones pueden ser vulnerables a https://spring.io/security/cve-2023-34035[CVE-2023-34035].
Una aplicación es vulnerable cuando se cumplen todas las siguientes condiciones:
Spring MVC está en el classpath
DispatcherServlet y al menos otro servlet están mapeados; uno de ellos con un mapeo de servlet basado en rutas (por ejemplo, /path/**)
La aplicación utiliza requestMatchers(String) para referirse a endpoints cuyo mapeo de servlet tiene la forma /path/**
== Ejemplos
Hay un conjunto de ejemplos que utilizan Spring Boot y otro que no.
Los ejemplos que contienen pruebas fallidas son vulnerables a CVE-2023-34035. Los ejemplos cuyas pruebas pasan no son vulnerables.
En todos los casos, cada uno de estos ejemplos contiene el mismo error de mitigación de Spring Security, aunque hay que tener en cuenta que dicha mitigación es temporal en muchas circunstancias, a la espera de la siguiente versión de mantenimiento.
=== servlet:java-configuration:dispatcher-servlet-path
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/java-configuration/dispatcher-servlet-path[Este ejemplo] representa una aplicación vulnerable en la que DispatcherServlet está desplegado en /mvc/* en lugar de la / por defecto.
Es vulnerable porque Spring MVC está en el classpath, DispatcherServlet y al menos otro servlet están mapeados -- uno de ellos con un mapeo de servlet basado en rutas no raíz (en este caso, DispatcherServlet), y la aplicación utiliza requestMatchers(String) para proteger esos endpoints.
=== servlet:java-configuration:jetty
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/java-configuration/jetty[Este ejemplo] representa una aplicación segura en la que DispatcherServlet está desplegado en / (la opción por defecto).
No es vulnerable. Si bien Spring MVC está en el classpath y DispatcherServlet está en uso, está desplegado en / y no hay mapeos de servlet basados en rutas no raíz.
=== servlet:java-configuration:other-servlets
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/java-configuration/other-servlets[Este ejemplo] representa una aplicación vulnerable en la que DispatcherServlet está desplegado junto con un servlet personalizado MyServlet.
Es vulnerable porque Spring MVC está en el classpath, DispatcherServlet y al menos otro servlet están mapeados -- uno de ellos con un mapeo de servlet basado en rutas no raíz (en este caso, MyServlet), y la aplicación utiliza requestMatchers(String) para proteger esos endpoints.
=== servlet:java-configuration:tomcat
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/java-configuration/tomcat[Este ejemplo] representa una aplicación segura en la que DispatcherServlet está desplegado en / (la opción por defecto).
No es vulnerable. Si bien Spring MVC está en el classpath y DispatcherServlet está en uso, está desplegado en / y no hay mapeos de servlet basados en rutas no raíz.
=== servlet:java-configuration:two-dispatcher-servlets
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/java-configuration/two-dispatcher-servlets[Este ejemplo] representa una aplicación vulnerable en la que DispatcherServlet está desplegado junto con un servlet personalizado MyServlet.
Es vulnerable porque Spring MVC está en el classpath, DispatcherServlet y al menos otro servlet están mapeados -- uno de ellos con un mapeo de servlet basado en rutas no raíz (en este caso, uno de los dos DispatcherServlets), y la aplicación utiliza requestMatchers(String) para proteger esos endpoints.
=== servlet:spring-boot:java:dispatcher-servlet-path
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/spring-boot/java/dispatcher-servlet-path[Este ejemplo] representa una aplicación vulnerable en la que DispatcherServlet está desplegado en /mvc/* en lugar de la / por defecto.
Es vulnerable porque Spring MVC está en el classpath, DispatcherServlet y al menos otro servlet están mapeados -- uno de ellos con un mapeo de servlet basado en rutas no raíz (en este caso, DispatcherServlet), y la aplicación utiliza requestMatchers(String) para proteger esos endpoints.
=== servlet:spring-boot:java:jetty
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/spring-boot/java/jetty[Este ejemplo] representa una aplicación segura en la que DispatcherServlet está desplegado en / (la opción por defecto).
No es vulnerable. Si bien Spring MVC está en el classpath y DispatcherServlet está en uso, está desplegado en / y no hay mapeos de servlet basados en rutas no raíz.
=== servlet:spring-boot:java:other-servlets
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/spring-boot/java/other-servlets[Este ejemplo] representa una aplicación vulnerable en la que DispatcherServlet está desplegado junto con un servlet personalizado MyServlet.
Es vulnerable porque Spring MVC está en el classpath, DispatcherServlet y al menos otro servlet están mapeados -- uno de ellos con un mapeo de servlet basado en rutas no raíz (en este caso, MyServlet), y la aplicación utiliza requestMatchers(String) para proteger esos endpoints.
=== servlet:spring-boot:java:tomcat
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/spring-boot/java/tomcat[Este ejemplo] representa una aplicación segura en la que DispatcherServlet está desplegado en / (la opción por defecto).
No es vulnerable. Si bien Spring MVC está en el classpath y DispatcherServlet está en uso, está desplegado en / y no hay mapeos de servlet basados en rutas no raíz.
=== servlet:spring-boot:java:undertow
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/spring-boot/java/undertow[Este ejemplo] representa una aplicación segura en la que DispatcherServlet está desplegado en / (la opción por defecto).
No es vulnerable. Si bien Spring MVC está en el classpath y DispatcherServlet está en uso, está desplegado en / y no hay mapeos de servlet basados en rutas no raíz.
== Mitigaciones
En caso de que obtenga un error como el siguiente:
requestMatchers(MvcRequestMatcher);
otherwise, please use requestMatchers(AntPathRequestMatcher).debe seguir sus instrucciones.
[NOTE]
Las versiones 5.8.5, 6.0.5, 6.1.2 y 6.2.0-M1 de Spring Security tienen algunos falsos positivos.
Tenga en cuenta que en muchos casos lo siguiente es temporal, a la espera del lanzamiento de 5.8.6, 6.0.6, 6.1.3 y 6.2.0-M2.
Como sugiere el mensaje de error, la mitigación principal es utilizar un RequestMatcher completo.
Esto permite que el mapeo del servlet se tenga en cuenta con mayor claridad.
Por ejemplo, si una aplicación tiene un servlet desplegado en /my-servlet/* y está autorizando ese tráfico de la siguiente manera:
entonces, la aplicación debería hacer lo siguiente en su lugar:
import static org.springframework.security.web.util.matcher.AntPathRequestMatcher.antMatcher;
@Bean MvcRequestMatcher.Builder mvc(HandlerMappingIntrospector introspector) { return new MvcRequestMatcher.Builder(introspector); }
O bien, si DispatcherServlet está desplegado en una ruta diferente, como /spring-mvc/*, entonces en lugar de:
la aplicación debería hacer:
@Bean MvcRequestMatcher.Builder mvc(HandlerMappingIntrospector introspector) { return new MvcRequestMatcher.Builder(introspector).servletPath("/spring-mvc"); }
Separar la ruta del servlet al construir un MvcRequestMatcher es importante para garantizar que la solicitud coincida correctamente.
== Ramas
En este repositorio, hay una rama para cada versión menor de Spring Security. En esa rama, hay un commit para cada ejemplo afectado con la mitigación necesaria.
Por ejemplo, en la rama 5.8.x, hay ocho commits para corregir los ocho ejemplos que requieren mitigación.
Cuando se publiquen 5.8.6, 6.0.6, 6.1.3 y 6.2.0-M2, se realizarán cambios adicionales en esas ramas para que la mitigación de mejores prácticas quede clara.