
Preuve de concept minimale pour la redirection ouverte du Spring Framework UrlHandlerFilter (CVE-2026-47883), démontrant que des requêtes forgées à double barre oblique produisent des en-têtes Location contrôlés par l'attaquant.
Ce dépôt est un PoC de reproduction minimale de CVE-2026-47883, publié dans l'avis de sécurité officiel 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 — URL Redirection to Untrusted Site (Open Redirect)Lorsque UrlHandlerFilter de Spring Framework est configuré avec un motif très large et en mode redirection, un en-tête Location pointant vers un origin externe peut être généré, entraînant un open redirect. L'avis officiel de Spring indique que les variantes du filtre pour Spring MVC et Spring WebFlux sont toutes deux concernées.
Dans le chemin Servlet de ce PoC, l'emplacement de redirection est utilisé dans l'en-tête de réponse après suppression du slash final de l'URI de la requête.
String location = trimTrailingSlash(request.getRequestURI());
response.setHeader(HttpHeaders.LOCATION, location);
Si l'URI brute de la requête est //attacker.example/, le résultat est //attacker.example. Selon la RFC 3986 §4.2, //attacker.example est une reference network-path ; le navigateur peut donc l'interpréter comme une adresse externe conservant le schéma courant (par ex. https://attacker.example).
Ce PoC utilise les conditions suivantes.
UrlHandlerFilter enregistré en mode redirection./** est appliqué.//.UrlHandlerFilter.trailingSlashHandler("/**")
.redirect(HttpStatus.PERMANENT_REDIRECT)
.build();
Artefacts impactés selon l'avis officiel :
org.springframework:spring-webmvcorg.springframework:spring-webfluxVersions affectées :
7.0.0 - 7.0.86.2.0 - 6.2.19Versions corrigées :
| Version corrigée | Portée |
|---|---|
7.0.9 | OSS |
7.0.8.1 | Enterprise Support Only |
6.2.20 | Enterprise Support Only |
UrlHandlerFilterBootServletIntegrationTest (reproduction principale)Démarre une véritable application Spring Boot + Tomcat embarqué et enregistre le filtre suivant.
UrlHandlerFilter.trailingSlashHandler("/**")
.redirect(HttpStatus.PERMANENT_REDIRECT)
.build();
Pour empêcher le client HTTP de normaliser au préalable le chemin //, la requête est envoyée via un socket TCP brut.
embeddedServletContainerEmitsNetworkPathReferenceForDoubleSlashPath
GET //attacker.example/ HTTP/1.1.308 Permanent Redirect et Location: //attacker.example.embeddedServletContainerKeepsExpectedSameOriginRelativeLocationForOrdinaryPath
GET /account/ HTTP/1.1.Location: /account est conservé.UrlHandlerFilterOpenRedirectTest (test auxiliaire)Vérifie directement l'API du filtre Servlet avec des objets mock et confirme le groupe témoin de chemin normal.
Le test auxiliaire reactive vérifie qu'un URI donné construit avec MockServerHttpRequest est normalisé en /attacker.example. Ce n'est toutefois pas une reproduction de bout en bout de la cible de requête brute WebFlux, et cela ne signifie pas que WebFlux n'est pas affecté. Le périmètre d'impact de l'avis officiel de Spring couvre à la fois Spring MVC et Spring WebFlux.
Windows :
.\mvnw.cmd test
macOS/Linux :
./mvnw test
Résultat attendu avec une version vulnérable :
UrlHandlerFilterBootServletIntegrationTest: Tests run: 2, Failures: 0, Errors: 0, Skipped: 0
UrlHandlerFilterOpenRedirectTest: Tests run: 4, Failures: 0, Errors: 0, Skipped: 0
BUILD SUCCESS
La réussite des tests signifie que « le comportement vulnérable a été reproduit ». Dans le test d'intégration principal, la requête brute forgée produit une valeur Location pouvant être interprétée comme un origin externe, tandis que les requêtes normales conservent un chemin relatif same-origin.
Ce dépôt utilise la combinaison suivante.
Spring Boot 3.5.14
Spring Framework 6.2.18
Apache Tomcat 10.1.54
Java 17+
Spring Boot et Tomcat constituent l'environnement d'exécution du PoC ; le produit officiellement impacté est Spring Framework. La version 6.2.18 de Spring Framework utilisée dans le PoC est incluse dans le périmètre officiel affecté 6.2.0 - 6.2.19.
Un attaquant peut inciter un utilisateur à quitter une application de confiance vers un site externe en exploitant l'URL de cette application. Cela peut être utilisé dans des scénarios de hameçonnage, d'exploitation de relations de confiance et de vol ultérieur d'identifiants.
Le vecteur CVSS officiel ne requiert aucun privilège préalable mais nécessite une interaction de l'utilisateur ; il évalue l'impact sur la confidentialité et l'intégrité comme Low et l'impact sur la disponibilité comme None.
Selon l'avis officiel de Spring, il convient de mettre à niveau vers la version corrigée correspondant à votre canal de support. L'avis officiel précise qu'aucune mesure d'atténuation supplémentaire n'est nécessaire après la mise à niveau.
L'avis officiel de Spring mentionne :
@daehyuh)