
Prueba de concepto mínima para la redirección abierta de UrlHandlerFilter de Spring Framework (CVE-2026-47883), que demuestra que las solicitudes manipuladas de doble barra producen cabeceras Location controladas por el atacante.
Este repositorio es un PoC de reproducción mínima de CVE-2026-47883, publicado a través del aviso de seguridad oficial de 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 — Redirección de URL a sitio no confiable (Open Redirect)Si se configura UrlHandlerFilter de Spring Framework con un patrón muy amplio y en modo de redirección, se puede generar un encabezado Location que apunte a un origen externo, lo que puede provocar un open redirect. El aviso oficial de Spring indica que tanto las variantes del filtro para Spring MVC como para Spring WebFlux están dentro del alcance.
En la ruta Servlet de este PoC, la ubicación de la redirección se utiliza en el encabezado de respuesta después de eliminar el trailing slash del URI de la solicitud.
String location = trimTrailingSlash(request.getRequestURI());
response.setHeader(HttpHeaders.LOCATION, location);
Si el URI de solicitud raw es //attacker.example/, el resultado es //attacker.example. Según RFC 3986 §4.2, //attacker.example es una network-path reference, por lo que el navegador puede interpretarlo como una dirección externa que conserva el esquema actual (por ejemplo, https://attacker.example).
Este PoC utiliza las siguientes condiciones:
UrlHandlerFilter está registrado en modo de redirección./**.//.UrlHandlerFilter.trailingSlashHandler("/**")
.redirect(HttpStatus.PERMANENT_REDIRECT)
.build();
Artefactos afectados según el aviso oficial:
org.springframework:spring-webmvcorg.springframework:spring-webfluxVersiones afectadas:
7.0.0 - 7.0.86.2.0 - 6.2.19Versiones corregidas:
| Versión corregida | Alcance de soporte |
|---|---|
7.0.9 | OSS |
7.0.8.1 | Enterprise Support Only |
6.2.20 | Enterprise Support Only |
UrlHandlerFilterBootServletIntegrationTest (reproducción principal)Inicia una aplicación real de Spring Boot + Tomcat embebido y registra el siguiente filtro:
UrlHandlerFilter.trailingSlashHandler("/**")
.redirect(HttpStatus.PERMANENT_REDIRECT)
.build();
Envía la solicitud mediante un socket TCP raw para evitar que el cliente HTTP normalice previamente la ruta //.
embeddedServletContainerEmitsNetworkPathReferenceForDoubleSlashPath
GET //attacker.example/ HTTP/1.1.308 Permanent Redirect y Location: //attacker.example.embeddedServletContainerKeepsExpectedSameOriginRelativeLocationForOrdinaryPath
GET /account/ HTTP/1.1.Location: /account.UrlHandlerFilterOpenRedirectTest (prueba auxiliar)Verifica directamente la API del filtro Servlet con objetos mock y comprueba el control de rutas normales.
En la prueba auxiliar reactiva se verifica que un URI concreto creado con MockServerHttpRequest se normaliza a /attacker.example. Sin embargo, esto no es una reproducción end-to-end del raw request-target de WebFlux, ni significa que WebFlux no esté afectado. El alcance del aviso oficial de Spring incluye tanto Spring MVC como Spring WebFlux.
Windows:
.\mvnw.cmd test
macOS/Linux:
./mvnw test
Resultado esperado con la versión vulnerable:
UrlHandlerFilterBootServletIntegrationTest: Tests run: 2, Failures: 0, Errors: 0, Skipped: 0
UrlHandlerFilterOpenRedirectTest: Tests run: 4, Failures: 0, Errors: 0, Skipped: 0
BUILD SUCCESS
Que las pruebas tengan éxito significa que se ha reproducido el comportamiento vulnerable. En la prueba de integración principal, una solicitud raw manipulada genera un valor Location que puede interpretarse como un origen externo, mientras que las solicitudes normales mantienen la ruta relativa same-origin.
Este repositorio utiliza la siguiente combinación:
Spring Boot 3.5.14
Spring Framework 6.2.18
Apache Tomcat 10.1.54
Java 17+
Spring Boot y Tomcat son el entorno de ejecución del PoC; el producto oficialmente afectado es Spring Framework. La versión de Spring Framework 6.2.18 utilizada en el PoC está incluida en el rango oficial afectado 6.2.0 - 6.2.19.
Un atacante puede utilizar la URL de una aplicación en la que el usuario confía para inducirlo a navegar a un sitio externo. Esto puede utilizarse en escenarios de phishing, abuso de relaciones de confianza y posterior robo de credenciales.
El vector CVSS oficial no requiere privilegios previos, pero requiere interacción del usuario; evalúa el impacto a la confidencialidad y a la integridad como Low y el impacto a la disponibilidad como None.
Según la recomendación oficial de Spring, debe actualizar a la versión corregida correspondiente a su canal de soporte. El aviso oficial indica que no se requieren medidas de mitigación adicionales después de la actualización.
El aviso oficial de Spring incluye lo siguiente:
@daehyuh)