
إثبات مفهوم بسيط لثغرة إعادة التوجيه المفتوحة في Spring Framework UrlHandlerFilter (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 في ترويسة الاستجابة بعد إزالة الشرطة المائلة اللاحقة (trailing slash) من URI الخاص بالطلب.
String location = trimTrailingSlash(request.getRequestURI());
response.setHeader(HttpHeaders.LOCATION, location);
إذا كان URI الخام للطلب هو //attacker.example/، فإن النتيجة ستكون //attacker.example. وفقًا لـ RFC 3986 §4.2، فإن //attacker.example هو مرجع مسار شبكة (network-path reference)، وبالتالي يمكن للمتصفح تفسيره كعنوان خارجي يحافظ على المخطط (scheme) الحالي (مثل https://attacker.example).
يستخدم هذا الـ PoC الشروط التالية:
UrlHandlerFilter في وضع redirect./**.// إلى الخادم.UrlHandlerFilter.trailingSlashHandler("/**")
.redirect(HttpStatus.PERMANENT_REDIRECT)
.build();
القطع (artifacts) المتأثرة وفقًا للاستشارة الرسمية:
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 + Tomcat مدمج (embedded) فعليًا وتسجيل الفلتر التالي:
UrlHandlerFilter.trailingSlashHandler("/**")
.redirect(HttpStatus.PERMANENT_REDIRECT)
.build();
يتم إرسال الطلب عبر مقبس TCP خام (raw TCP socket) لمنع عميل HTTP من تطبيع مسار // مسبقًا.
embeddedServletContainerEmitsNetworkPathReferenceForDoubleSlashPath
GET //attacker.example/ HTTP/1.1.308 Permanent Redirect وLocation: //attacker.example.embeddedServletContainerKeepsExpectedSameOriginRelativeLocationForOrdinaryPath
GET /account/ HTTP/1.1 كمجموعة ضابطة طبيعية.Location: /account كما هو.UrlHandlerFilterOpenRedirectTest (اختبار مساعد)يتحقق مباشرةً من Servlet Filter API باستخدام كائنات mock ويتحقق من المجموعة الضابطة للمسار الطبيعي.
في الاختبار المساعد التفاعلي (Reactive)، يتم التحقق من أن URI معين تم إنشاؤه بواسطة MockServerHttpRequest يتم تطبيعه إلى /attacker.example. ومع ذلك، فإن هذا ليس إعادة إنتاج شاملة (end-to-end) لهدف الطلب الخام في 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
يعني نجاح الاختبار أنه «تم إعادة إنتاج السلوك القابل للاستغلال». في اختبار التكامل الرئيسي، ينتج الطلب الخام المُعدّ (crafted 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. الإصدار 6.2.18 من Spring Framework المستخدم في الـ PoC يقع ضمن نطاق التأثير الرسمي 6.2.0 - 6.2.19.
يمكن للمهاجم استغلال عنوان URL الخاص بتطبيق يثق به المستخدم لحثّه على الانتقال إلى موقع خارجي. ويمكن استخدام ذلك في سيناريوهات التصيد الاحتيالي، واستغلال علاقات الثقة، والاستيلاء اللاحق على بيانات الاعتماد.
يشير متجه CVSS الرسمي إلى أنه لا يتطلب صلاحيات مسبقة ولكنه يتطلب تفاعل المستخدم، ويقيّم تأثير السرية والسلامة عند مستوى Low وتأثير التوافر عند None.
وفقًا للتوصية الرسمية من Spring، يجب الترقية إلى الإصدار المصحح المناسب لقناة الدعم المستخدمة. وتنص الاستشارة الرسمية على عدم الحاجة إلى أي إجراءات تخفيف إضافية بعد الترقية.
ورد في الاستشارة الأمنية الرسمية من Spring ما يلي:
@daehyuh)