
Prova de conceito mínima para o open redirect do UrlHandlerFilter do Spring Framework (CVE-2026-47883), demonstrando que requisições com barras duplas manipuladas produzem cabeçalhos Location controlados pelo atacante.
Este repositório é um PoC de reprodução mínima do CVE-2026-47883, divulgado no aviso de segurança oficial da Spring.
Spring Framework Open Redirect in UrlHandlerFilter5.4 (AV:N/AC:L/PR:N/UI:R/S:U/C:L/I:L/A:N)CWE-601 — Redirecionamento de URL para site não confiável (Open Redirect)Se o UrlHandlerFilter do Spring Framework for configurado com um padrão muito amplo e no modo de redirecionamento, um cabeçalho Location que aponta para uma origem externa pode ser gerado, resultando em um open redirect. O aviso oficial da Spring indica que ambas as variantes do filtro, Spring MVC e Spring WebFlux, estão no escopo de impacto.
No caminho Servlet deste PoC, a localização do redirecionamento é usada no cabeçalho de resposta após a remoção da barra final (trailing slash) do URI da requisição.
String location = trimTrailingSlash(request.getRequestURI());
response.setHeader(HttpHeaders.LOCATION, location);
Se o URI bruto da requisição for //attacker.example/, o resultado será //attacker.example. De acordo com a RFC 3986 §4.2, //attacker.example é uma network-path reference; portanto, o navegador pode interpretá-lo como um endereço externo que mantém o esquema atual (por exemplo, https://attacker.example).
Este PoC utiliza as seguintes condições:
UrlHandlerFilter registrado no modo de redirecionamento./**.// até o servidor.UrlHandlerFilter.trailingSlashHandler("/**")
.redirect(HttpStatus.PERMANENT_REDIRECT)
.build();
Artifacts impactados conforme o aviso oficial:
org.springframework:spring-webmvcorg.springframework:spring-webfluxVersões afetadas:
7.0.0 - 7.0.86.2.0 - 6.2.19Versões corrigidas:
| Versão corrigida | Disponibilidade |
|---|---|
7.0.9 | OSS |
7.0.8.1 | Somente suporte Enterprise |
6.2.20 | Somente suporte Enterprise |
UrlHandlerFilterBootServletIntegrationTest (reprodução principal)Inicia uma aplicação real Spring Boot + Tomcat embutido e registra o seguinte filtro:
UrlHandlerFilter.trailingSlashHandler("/**")
.redirect(HttpStatus.PERMANENT_REDIRECT)
.build();
Envia a requisição por meio de um socket TCP bruto para que o cliente HTTP não normalize previamente o caminho //.
embeddedServletContainerEmitsNetworkPathReferenceForDoubleSlashPath
GET //attacker.example/ HTTP/1.1.308 Permanent Redirect e Location: //attacker.example.embeddedServletContainerKeepsExpectedSameOriginRelativeLocationForOrdinaryPath
GET /account/ HTTP/1.1 como controle normal.Location: /account é mantido.UrlHandlerFilterOpenRedirectTest (teste auxiliar)Valida diretamente a API do filtro Servlet com objetos mock e confere o controle de caminho normal.
No teste auxiliar reativo, verifica-se que um determinado URI criado com MockServerHttpRequest é normalizado para /attacker.example. No entanto, isso não é uma reprodução de ponta a ponta do request-target bruto do WebFlux, nem significa que o WebFlux não seja afetado. O escopo de impacto do aviso oficial da Spring inclui tanto Spring MVC quanto Spring WebFlux.
Windows:
.\mvnw.cmd test
macOS/Linux:
./mvnw test
Resultado esperado com a versão vulnerável:
UrlHandlerFilterBootServletIntegrationTest: Tests run: 2, Failures: 0, Errors: 0, Skipped: 0
UrlHandlerFilterOpenRedirectTest: Tests run: 4, Failures: 0, Errors: 0, Skipped: 0
BUILD SUCCESS
O sucesso nos testes significa que o comportamento vulnerável foi reproduzido. No teste de integração principal, uma requisição bruta especialmente elaborada gera um valor de Location que pode ser interpretado como uma origem externa, enquanto as requisições normais mantêm o caminho relativo de mesma origem.
Este repositório utiliza a seguinte combinação:
Spring Boot 3.5.14
Spring Framework 6.2.18
Apache Tomcat 10.1.54
Java 17+
Spring Boot e Tomcat são o ambiente de execução do PoC; o produto oficialmente afetado é o Spring Framework. A versão 6.2.18 do Spring Framework usada no PoC está dentro do escopo oficial afetado, 6.2.0 - 6.2.19.
Um atacante pode usar a URL de um aplicativo em que o usuário confia para induzi-lo a navegar para um site externo. Isso pode ser usado em cenários de phishing, exploração de relações de confiança e subsequente roubo de credenciais.
O vetor CVSS oficial não exige privilégios prévios, mas requer interação do usuário, e avalia o impacto na confidencialidade e na integridade como Baixo, e na disponibilidade como Nenhum.
Conforme a recomendação oficial da Spring, é necessário atualizar para a versão corrigida adequada ao seu canal de suporte. O aviso oficial afirma que nenhuma medida de mitigação adicional é necessária após a atualização.
O aviso oficial da Spring lista o seguinte:
@daehyuh)