
Proof-of-concept minimale per l'open redirect di UrlHandlerFilter di Spring Framework (CVE-2026-47883), che dimostra come richieste con doppio slash appositamente costruite producano header Location controllati dall'attaccante.
Questo repository è una proof-of-concept (PoC) minima che riproduce la CVE-2026-47883, pubblicata tramite l'avviso di sicurezza ufficiale di 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)Se si configura UrlHandlerFilter di Spring Framework con un pattern molto ampio e in modalità redirect,
viene generato un header Location che punta a un origin esterno, causando un open redirect.
L'avviso ufficiale di Spring indica come interessate entrambe le varianti del filtro in Spring MVC
e Spring WebFlux.
Nel percorso Servlet di questa PoC, la posizione di redirect viene utilizzata nell'header di risposta dopo aver rimosso lo slash finale (trailing slash) dalla URI della richiesta.
String location = trimTrailingSlash(request.getRequestURI());
response.setHeader(HttpHeaders.LOCATION, location);
Se la URI di richiesta grezza è //attacker.example/, il risultato è //attacker.example.
Secondo la RFC 3986 §4.2, //attacker.example è un network-path reference, quindi il browser può
interpretarlo come un indirizzo esterno che mantiene lo scheme corrente (ad esempio https://attacker.example).
Questa PoC utilizza le seguenti condizioni:
UrlHandlerFilter è registrato in modalità redirect./**.//.UrlHandlerFilter.trailingSlashHandler("/**")
.redirect(HttpStatus.PERMANENT_REDIRECT)
.build();
Artifact interessati secondo l'avviso ufficiale:
org.springframework:spring-webmvcorg.springframework:spring-webfluxVersioni interessate:
7.0.0 - 7.0.86.2.0 - 6.2.19Versioni corrette:
| Versione corretta | Disponibilità |
|---|---|
7.0.9 | OSS |
7.0.8.1 | Enterprise Support Only |
6.2.20 | Enterprise Support Only |
UrlHandlerFilterBootServletIntegrationTest (riproduzione principale)Avvia una vera applicazione Spring Boot + Tomcat embedded e registra il seguente filtro:
UrlHandlerFilter.trailingSlashHandler("/**")
.redirect(HttpStatus.PERMANENT_REDIRECT)
.build();
Invia la richiesta tramite un socket TCP grezzo, in modo che il client HTTP non possa normalizzare
in anticipo il percorso //.
embeddedServletContainerEmitsNetworkPathReferenceForDoubleSlashPath
GET //attacker.example/ HTTP/1.1.308 Permanent Redirect e Location: //attacker.example.embeddedServletContainerKeepsExpectedSameOriginRelativeLocationForOrdinaryPath
GET /account/ HTTP/1.1.Location: /account venga mantenuto.UrlHandlerFilterOpenRedirectTest (test ausiliario)Verifica direttamente l'API del filtro Servlet tramite oggetti mock e controlla il gruppo di controllo con percorsi normali.
Nel test ausiliario reactive si verifica che una specifica URI creata con MockServerHttpRequest
venga normalizzata in /attacker.example. Tuttavia, questa non è una riproduzione end-to-end del
request-target grezzo di WebFlux, e non significa che WebFlux non sia interessato.
L'ambito di impatto dell'avviso ufficiale di Spring comprende sia Spring MVC sia Spring WebFlux.
Windows:
.\mvnw.cmd test
macOS/Linux:
./mvnw test
Risultato atteso con la versione vulnerabile:
UrlHandlerFilterBootServletIntegrationTest: Tests run: 2, Failures: 0, Errors: 0, Skipped: 0
UrlHandlerFilterOpenRedirectTest: Tests run: 4, Failures: 0, Errors: 0, Skipped: 0
BUILD SUCCESS
Il successo dei test significa che il comportamento vulnerabile è stato riprodotto. Nel test di integrazione principale,
una richiesta grezza appositamente costruita genera un valore Location interpretabile come origin esterno,
mentre le richieste normali mantengono il percorso relativo same-origin.
Questo repository utilizza la seguente combinazione:
Spring Boot 3.5.14
Spring Framework 6.2.18
Apache Tomcat 10.1.54
Java 17+
Spring Boot e Tomcat sono l'ambiente di esecuzione della PoC; il prodotto ufficialmente interessato è Spring Framework.
La versione 6.2.18 di Spring Framework usata nella PoC rientra nell'intervallo ufficiale interessato
6.2.0 - 6.2.19.
Un attaccante può indurre l'utente a spostarsi su un sito esterno sfruttando l'URL di un'applicazione di cui l'utente si fida. Ciò può essere usato in scenari di phishing, abuso di relazioni di fiducia e successiva sottrazione di credenziali.
Il vettore CVSS ufficiale non richiede privilegi preliminari ma necessita dell'interazione dell'utente; valuta l'impatto su riservatezza e integrità come Low e quello sulla disponibilità come None.
Come indicato nell'avviso ufficiale di Spring, è necessario aggiornare a una versione corretta compatibile con il canale di supporto in uso. L'avviso ufficiale specifica che dopo l'aggiornamento non sono necessarie ulteriori misure di mitigazione.
Nell'avviso ufficiale di Spring è indicato quanto segue:
@daehyuh)