
Demonstra a vulnerabilidade CVE-2023-34035 no Spring Security com aplicações de exemplo vulneráveis e mitigadas, ensinando a configuração correta de mapeamento de servlet e correspondente de requisições.
Este repositório é um conjunto de exemplos para demonstrar as configurações nas quais aplicações podem ser vulneráveis a https://spring.io/security/cve-2023-34035[CVE-2023-34035].
Uma aplicação é vulnerável quando todas as seguintes condições são verdadeiras:
Spring MVC está no classpath
DispatcherServlet e pelo menos um outro servlet estão mapeados; um deles tendo um mapeamento de servlet baseado em caminho (por exemplo, /path/**)
A aplicação usa requestMatchers(String) para referir-se a endpoints cujo mapeamento de servlet é da forma /path/**
== Amostras
Há um conjunto de amostras que usam Spring Boot e um conjunto que não usam.
As amostras que contêm testes falhando são vulneráveis ao CVE-2023-34035. As amostras cujos testes passam não são vulneráveis.
Em todos os casos, cada uma dessas amostras contém o mesmo erro de mitigação do Spring Security, embora note-se que tal mitigação é temporária em muitas circunstâncias, até o próximo lançamento de manutenção.
=== servlet:java-configuration:dispatcher-servlet-path
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/java-configuration/dispatcher-servlet-path[Esta amostra] representa uma aplicação vulnerável onde DispatcherServlet é implantado em /mvc/* em vez do padrão /.
É vulnerável pois Spring MVC está no classpath, DispatcherServlet e pelo menos um outro servlet estão mapeados — um deles com um mapeamento de servlet baseado em caminho não raiz (neste caso, DispatcherServlet), e a aplicação usa requestMatchers(String) para proteger esses endpoints.
=== servlet:java-configuration:jetty
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/java-configuration/jetty[Esta amostra] representa uma aplicação segura onde DispatcherServlet é implantado em / (o padrão).
Não é vulnerável. Embora Spring MVC esteja no classpath e DispatcherServlet esteja em uso, ele é implantado em / e não há mapeamentos de servlet baseados em caminho não raiz.
=== servlet:java-configuration:other-servlets
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/java-configuration/other-servlets[Esta amostra] representa uma aplicação vulnerável onde DispatcherServlet é implantado, bem como um servlet personalizado MyServlet.
É vulnerável pois Spring MVC está no classpath, DispatcherServlet e pelo menos um outro servlet estão mapeados — um deles com um mapeamento de servlet baseado em caminho não raiz (neste caso, MyServlet), e a aplicação usa requestMatchers(String) para proteger esses endpoints.
=== servlet:java-configuration:tomcat
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/java-configuration/tomcat[Esta amostra] representa uma aplicação segura onde DispatcherServlet é implantado em / (o padrão).
Não é vulnerável. Embora Spring MVC esteja no classpath e DispatcherServlet esteja em uso, ele é implantado em / e não há mapeamentos de servlet baseados em caminho não raiz.
=== servlet:java-configuration:two-dispatcher-servlets
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/java-configuration/two-dispatcher-servlets[Esta amostra] representa uma aplicação vulnerável onde DispatcherServlet é implantado, bem como um servlet personalizado MyServlet.
É vulnerável pois Spring MVC está no classpath, DispatcherServlet e pelo menos um outro servlet estão mapeados — um deles com um mapeamento de servlet baseado em caminho não raiz (neste caso, um dos dois DispatcherServlets), e a aplicação usa requestMatchers(String) para proteger esses 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[Esta amostra] representa uma aplicação vulnerável onde DispatcherServlet é implantado em /mvc/* em vez do padrão /.
É vulnerável pois Spring MVC está no classpath, DispatcherServlet e pelo menos um outro servlet estão mapeados — um deles com um mapeamento de servlet baseado em caminho não raiz (neste caso, DispatcherServlet), e a aplicação usa requestMatchers(String) para proteger esses endpoints.
=== servlet:spring-boot:java:jetty
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/spring-boot/java/jetty[Esta amostra] representa uma aplicação segura onde DispatcherServlet é implantado em / (o padrão).
Não é vulnerável. Embora Spring MVC esteja no classpath e DispatcherServlet esteja em uso, ele é implantado em / e não há mapeamentos de servlet baseados em caminho não raiz.
=== servlet:spring-boot:java:other-servlets
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/spring-boot/java/other-servlets[Esta amostra] representa uma aplicação vulnerável onde DispatcherServlet é implantado, bem como um servlet personalizado MyServlet.
É vulnerável pois Spring MVC está no classpath, DispatcherServlet e pelo menos um outro servlet estão mapeados — um deles com um mapeamento de servlet baseado em caminho não raiz (neste caso, MyServlet), e a aplicação usa requestMatchers(String) para proteger esses endpoints.
=== servlet:spring-boot:java:tomcat
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/spring-boot/java/tomcat[Esta amostra] representa uma aplicação segura onde DispatcherServlet é implantado em / (o padrão).
Não é vulnerável. Embora Spring MVC esteja no classpath e DispatcherServlet esteja em uso, ele é implantado em / e não há mapeamentos de servlet baseados em caminho não raiz.
=== servlet:spring-boot:java:undertow
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/spring-boot/java/undertow[Esta amostra] representa uma aplicação segura onde DispatcherServlet é implantado em / (o padrão).
Não é vulnerável. Embora Spring MVC esteja no classpath e DispatcherServlet esteja em uso, ele é implantado em / e não há mapeamentos de servlet baseados em caminho não raiz.
== Mitigações
No caso de você obter um erro como o seguinte:
requestMatchers(MvcRequestMatcher);
otherwise, please use requestMatchers(AntPathRequestMatcher).você deve segui-lo.
[NOTE]
As versões 5.8.5, 6.0.5, 6.1.2 e 6.2.0-M1 do Spring Security têm alguns falsos positivos.
Agora que em muitos casos o seguinte é temporário, até o lançamento das versões 5.8.6, 6.0.6, 6.1.3 e 6.2.0-M2.
Conforme aludido pela mensagem de erro, a mitigação principal é usar um RequestMatcher completo.
Isso para que o mapeamento do servlet possa ser mais claramente considerado.
Por exemplo, se uma aplicação tem um servlet implantado em /my-servlet/* e está autorizando esse tráfego da seguinte forma:
então, a aplicação deveria fazer o seguinte:
import static org.springframework.security.web.util.matcher.AntPathRequestMatcher.antMatcher;
@Bean MvcRequestMatcher.Builder mvc(HandlerMappingIntrospector introspector) { return new MvcRequestMatcher.Builder(introspector); }
Ou, se DispatcherServlet está implantado em um caminho diferente, como /spring-mvc/*, então em vez de:
uma aplicação deve fazer:
@Bean MvcRequestMatcher.Builder mvc(HandlerMappingIntrospector introspector) { return new MvcRequestMatcher.Builder(introspector).servletPath("/spring-mvc"); }
Separar o caminho do servlet ao construir um MvcRequestMatcher é importante para garantir que a requisição seja correspondida corretamente.
== Ramos
Neste repositório, há um ramo (branch) para cada lançamento menor do Spring Security. Nesse ramo, há um commit para cada amostra afetada com a mitigação necessária.
Por exemplo, no ramo 5.8.x, há oito commits para reparar as oito amostras que exigem mitigação.
Quando as versões 5.8.6, 6.0.6, 6.1.3 e 6.2.0-M2 forem lançadas, alterações adicionais serão feitas nesses ramos para que a mitigação de melhor prática fique clara.