
Минимальная proof-of-concept для открытого перенаправления UrlHandlerFilter в Spring Framework (CVE-2026-47883), демонстрирующая, что специально сформированные запросы с двойным слэшем приводят к заголовкам Location, контролируемым атакующим.
Этот репозиторий содержит минимальный воспроизводимый PoC для CVE-2026-47883, опубликованного в официальном бюллетене безопасности 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)Если UrlHandlerFilter в Spring Framework настроен с очень широким шаблоном и режимом redirect, может быть сформирован заголовок Location, ведущий на внешний origin, что приводит к open redirect. В официальном бюллетене Spring указано, что уязвимы обе вариации фильтра — для Spring MVC и Spring WebFlux.
В Servlet-пути этого PoC значение redirect формируется из URI запроса после удаления завершающего слэша и используется в заголовке ответа.
String location = trimTrailingSlash(request.getRequestURI());
response.setHeader(HttpHeaders.LOCATION, location);
Если raw request URI равен //attacker.example/, результатом будет //attacker.example. Согласно RFC 3986 §4.2, //attacker.example является network-path reference, поэтому браузер может интерпретировать его как внешний адрес с сохранением текущей схемы (например, https://attacker.example).
В этом PoC используются следующие условия.
UrlHandlerFilter зарегистрирован в режиме redirect./**.//.UrlHandlerFilter.trailingSlashHandler("/**")
.redirect(HttpStatus.PERMANENT_REDIRECT)
.build();
Затронутые артефакты согласно официальному бюллетеню:
org.springframework:spring-webmvcorg.springframework:spring-webfluxЗатронутые версии:
7.0.0 - 7.0.86.2.0 - 6.2.19Исправленные версии:
| Исправленная версия | Доступность |
|---|---|
7.0.9 | OSS |
7.0.8.1 | Только Enterprise Support |
6.2.20 | Только Enterprise Support |
UrlHandlerFilterBootServletIntegrationTest (основное воспроизведение)Запускается реальное приложение на Spring Boot + embedded Tomcat и регистрируется следующий фильтр.
UrlHandlerFilter.trailingSlashHandler("/**")
.redirect(HttpStatus.PERMANENT_REDIRECT)
.build();
Чтобы HTTP-клиент не мог заранее нормализовать путь //, запрос отправляется через raw TCP socket.
embeddedServletContainerEmitsNetworkPathReferenceForDoubleSlashPath
GET //attacker.example/ HTTP/1.1.308 Permanent Redirect и заголовок Location: //attacker.example.embeddedServletContainerKeepsExpectedSameOriginRelativeLocationForOrdinaryPath
GET /account/ HTTP/1.1.Location: /account сохраняется.UrlHandlerFilterOpenRedirectTest (вспомогательный тест)API Servlet-фильтра проверяется напрямую с помощью mock-объектов, а также проверяется контрольный пример с обычным путём.
Во вспомогательном reactive-тесте проверяется, что определённый URI, созданный с помощью MockServerHttpRequest, нормализуется до /attacker.example. Однако это не является end-to-end воспроизведением raw request-target в WebFlux и не означает, что WebFlux не затронут. Согласно официальному бюллетеню Spring, уязвимы как Spring MVC, так и Spring WebFlux.
Windows:
.\mvnw.cmd test
macOS/Linux:
./mvnw test
Ожидаемый результат для уязвимой версии:
UrlHandlerFilterBootServletIntegrationTest: Tests run: 2, Failures: 0, Errors: 0, Skipped: 0
UrlHandlerFilterOpenRedirectTest: Tests run: 4, Failures: 0, Errors: 0, Skipped: 0
BUILD SUCCESS
Успешное выполнение тестов означает, что «уязвимое поведение воспроизведено». В основном интеграционном тесте специально сформированный raw request создаёт значение Location, которое может быть интерпретировано как внешний origin, тогда как обычный запрос сохраняет same-origin относительный путь.
В этом репозитории используется следующая комбинация.
Spring Boot 3.5.14
Spring Framework 6.2.18
Apache Tomcat 10.1.54
Java 17+
Spring Boot и Tomcat — это среда запуска PoC; официально уязвимым продуктом является Spring Framework. Используемая в PoC версия Spring Framework 6.2.18 входит в официальную область воздействия 6.2.0 - 6.2.19.
Атакующий может использовать URL доверенного пользователем приложения, чтобы перенаправить его на внешний сайт. Это может использоваться в сценариях фишинга, эксплуатации доверительных отношений и последующего хищения учётных данных.
Официальный вектор CVSS не требует предварительных привилегий, но требует взаимодействия с пользователем; влияние на конфиденциальность и целостность оценивается как Low, влияние на доступность — None.
Согласно официальным рекомендациям Spring, необходимо обновиться до исправленной версии, соответствующей вашему каналу поддержки. В официальном бюллетене указано, что после обновления дополнительные меры mitigации не требуются.
В официальном бюллетене Spring указано следующее.
@daehyuh)