
Spring Framework UrlHandlerFilter のオープンリダイレクト (CVE-2026-47883) の最小限の概念実証 (PoC)。細工された二重スラッシュリクエストが、攻撃者が制御する Location ヘッダーを生成することを実証します。
このリポジトリは、Spring公式セキュリティアドバイザリとして公開された CVE-2026-47883 の最小再現PoCです。
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)Spring Frameworkの UrlHandlerFilter を非常に広範なパターンとリダイレクトモードで設定すると、
外部オリジンへ向かう Location ヘッダーが生成され、オープンリダイレクトが発生する可能性があります。
Spring公式アドバイザリは、Spring MVC と Spring WebFlux の両方のフィルター変種を影響範囲として
明記しています。
このPoCのServletパスでは、リダイレクト位置はリクエストURIの末尾スラッシュを除去した後、 レスポンスヘッダーに使用されます。
String location = trimTrailingSlash(request.getRequestURI());
response.setHeader(HttpHeaders.LOCATION, location);
rawリクエストURIが //attacker.example/ の場合、結果は //attacker.example になります。
RFC 3986 §4.2 では //attacker.example は network-path reference であるため、ブラウザはこれを
現在のスキームを維持した外部アドレス(例: https://attacker.example)として解釈できます。
このPoCは以下の条件を使用します。
UrlHandlerFilter がリダイレクトモードで登録されている。/** のような非常に広範なパターンが適用されている。// で始まるrawリクエストターゲットをサーバーまで届けることができる。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 Only |
6.2.20 | Enterprise Support Only |
UrlHandlerFilterBootServletIntegrationTest (主要な再現)実際のSpring Boot + embedded Tomcatアプリケーションを起動し、次のフィルターを登録します。
UrlHandlerFilter.trailingSlashHandler("/**")
.redirect(HttpStatus.PERMANENT_REDIRECT)
.build();
HTTPクライアントが // パスを事前に正規化できないよう、raw TCPソケットでリクエストを送信します。
embeddedServletContainerEmitsNetworkPathReferenceForDoubleSlashPath
GET //attacker.example/ HTTP/1.1 を送信します。308 Permanent Redirect と Location: //attacker.example を確認します。embeddedServletContainerKeepsExpectedSameOriginRelativeLocationForOrdinaryPath
GET /account/ HTTP/1.1 を送信します。Location: /account が維持されることを確認します。UrlHandlerFilterOpenRedirectTest (補助テスト)ServletフィルターAPIをモックオブジェクトで直接検証し、正常なパスの対照群を確認します。
Reactive補助テストでは、MockServerHttpRequest で作成した特定のURIが /attacker.example に正規化される動作を確認します。ただし、これはraw WebFlux request-targetのエンドツーエンドの再現ではなく、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リクエストが外部オリジンとして解釈され得る Location 値を生成し、正常なリクエストは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公式の勧告に従い、利用中のサポートチャネルに該当する修正バージョンにアップグレードする必要があります。公式アドバイザリは、アップグレード後に追加の緩和策は不要と明記しています。
Spring公式アドバイザリには次のように記載されています。
@daehyuh)