
يوضح ثغرة CVE-2023-34035 في Spring Security من خلال تطبيقات نموذجية ضعيفة ومخففة، مع تعليم التكوين الصحيح لتعيين servlet ومطابقة الطلبات.
هذا المستودع عبارة عن مجموعة من الأمثلة لتوضيح الحالات التي قد تكون فيها التطبيقات عرضة لـ https://spring.io/security/cve-2023-34035[CVE-2023-34035].
يكون التطبيق عرضة للخطر عندما تكون جميع الشروط التالية صحيحة:
DispatcherServlet و servlet آخر واحد على الأقل مُعيَّنين؛ واحد منهما له تعيين servlet قائم على المسار (مثل /path/**)requestMatchers(String) للإشارة إلى نقاط النهاية التي يكون تعيين servlet الخاص بها من النموذج /path/**== أمثلة
هناك مجموعة من الأمثلة تستخدم Spring Boot ومجموعة لا تستخدمه.
الأمثلة التي تحتوي على اختبارات فاشلة معرضة لـ CVE-2023-34035. الأمثلة التي نجحت اختباراتها ليست عرضة للخطر.
في جميع الحالات، يحتوي كل من هذه الأمثلة على نفس خطأ التخفيف من Spring Security، مع ملاحظة أن هذا التخفيف مؤقت في العديد من الظروف، بانتظار الإصدار الرئيسي التالي.
=== servlet:java-configuration:dispatcher-servlet-path
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/java-configuration/dispatcher-servlet-path[هذا المثال] يمثل تطبيقًا عرضة للخطر حيث يتم نشر DispatcherServlet على /mvc/* بدلاً من / الافتراضي.
إنه عرضة للخطر نظرًا لأن Spring MVC موجود في مسار الفئات، و DispatcherServlet و servlet آخر واحد على الأقل مُعيَّنان - واحد منهما له تعيين servlet قائم على المسار وغير جذري (في هذه الحالة، DispatcherServlet) - ويستخدم التطبيق requestMatchers(String) لتأمين نقاط النهاية تلك.
=== servlet:java-configuration:jetty
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/java-configuration/jetty[هذا المثال] يمثل تطبيقًا آمنًا حيث يتم نشر DispatcherServlet على / (الافتراضي).
إنه ليس عرضة للخطر. بينما Spring MVC موجود في مسار الفئات و DispatcherServlet قيد الاستخدام، إلا أنه منشور على / ولا توجد تعيينات servlet قائمة على المسار وغير جذرية.
=== servlet:java-configuration:other-servlets
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/java-configuration/other-servlets[هذا المثال] يمثل تطبيقًا عرضة للخطر حيث يتم نشر DispatcherServlet بالإضافة إلى servlet مخصص MyServlet.
إنه عرضة للخطر نظرًا لأن Spring MVC موجود في مسار الفئات، و DispatcherServlet و servlet آخر واحد على الأقل مُعيَّنان - واحد منهما له تعيين servlet قائم على المسار وغير جذري (في هذه الحالة، MyServlet) - ويستخدم التطبيق requestMatchers(String) لتأمين نقاط النهاية تلك.
=== servlet:java-configuration:tomcat
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/java-configuration/tomcat[هذا المثال] يمثل تطبيقًا آمنًا حيث يتم نشر DispatcherServlet على / (الافتراضي).
إنه ليس عرضة للخطر. بينما Spring MVC موجود في مسار الفئات و DispatcherServlet قيد الاستخدام، إلا أنه منشور على / ولا توجد تعيينات servlet قائمة على المسار وغير جذرية.
=== servlet:java-configuration:two-dispatcher-servlets
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/java-configuration/two-dispatcher-servlets[هذا المثال] يمثل تطبيقًا عرضة للخطر حيث يتم نشر DispatcherServlet بالإضافة إلى servlet مخصص MyServlet.
إنه عرضة للخطر نظرًا لأن Spring MVC موجود في مسار الفئات، و DispatcherServlet و servlet آخر واحد على الأقل مُعيَّنان - واحد منهما له تعيين servlet قائم على المسار وغير جذري (في هذه الحالة، واحد من اثنين من DispatcherServlets) - ويستخدم التطبيق requestMatchers(String) لتأمين نقاط النهاية تلك.
=== servlet:spring-boot:java:dispatcher-servlet-path
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/spring-boot/java/dispatcher-servlet-path[هذا المثال] يمثل تطبيقًا عرضة للخطر حيث يتم نشر DispatcherServlet على /mvc/* بدلاً من / الافتراضي.
إنه عرضة للخطر نظرًا لأن Spring MVC موجود في مسار الفئات، و DispatcherServlet و servlet آخر واحد على الأقل مُعيَّنان - واحد منهما له تعيين servlet قائم على المسار وغير جذري (في هذه الحالة، DispatcherServlet) - ويستخدم التطبيق requestMatchers(String) لتأمين نقاط النهاية تلك.
=== servlet:spring-boot:java:jetty
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/spring-boot/java/jetty[هذا المثال] يمثل تطبيقًا آمنًا حيث يتم نشر DispatcherServlet على / (الافتراضي).
إنه ليس عرضة للخطر. بينما Spring MVC موجود في مسار الفئات و DispatcherServlet قيد الاستخدام، إلا أنه منشور على / ولا توجد تعيينات servlet قائمة على المسار وغير جذرية.
=== servlet:spring-boot:java:other-servlets
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/spring-boot/java/other-servlets[هذا المثال] يمثل تطبيقًا عرضة للخطر حيث يتم نشر DispatcherServlet بالإضافة إلى servlet مخصص MyServlet.
إنه عرضة للخطر نظرًا لأن Spring MVC موجود في مسار الفئات، و DispatcherServlet و servlet آخر واحد على الأقل مُعيَّنان - واحد منهما له تعيين servlet قائم على المسار وغير جذري (في هذه الحالة، MyServlet) - ويستخدم التطبيق requestMatchers(String) لتأمين نقاط النهاية تلك.
=== servlet:spring-boot:java:tomcat
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/spring-boot/java/tomcat[هذا المثال] يمثل تطبيقًا آمنًا حيث يتم نشر DispatcherServlet على / (الافتراضي).
إنه ليس عرضة للخطر. بينما Spring MVC موجود في مسار الفئات و DispatcherServlet قيد الاستخدام، إلا أنه منشور على / ولا توجد تعيينات servlet قائمة على المسار وغير جذرية.
=== servlet:spring-boot:java:undertow
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/spring-boot/java/undertow[هذا المثال] يمثل تطبيقًا آمنًا حيث يتم نشر DispatcherServlet على / (الافتراضي).
إنه ليس عرضة للخطر. بينما Spring MVC موجود في مسار الفئات و DispatcherServlet قيد الاستخدام، إلا أنه منشور على / ولا توجد تعيينات servlet قائمة على المسار وغير جذرية.
== التخفيفات (Mitigations)
في حالة ظهور خطأ مثل التالي:
requestMatchers(MvcRequestMatcher);
otherwise, please use requestMatchers(AntPathRequestMatcher).يجب اتباعه.
[NOTE]
تحتوي إصدارات Spring Security 5.8.5 و 6.0.5 و 6.1.2 و 6.2.0-M1 على بعض الإيجابيات الكاذبة.
الآن في كثير من الحالات، ما يلي مؤقت، بانتظار إصدار 5.8.6 و 6.0.6 و 6.1.3 و 6.2.0-M2.
كما أشارت رسالة الخطأ، فإن التخفيف الأساسي هو استخدام RequestMatcher كامل.
وذلك ليمكن أخذ تعيين servlet في الاعتبار بشكل أكثر وضوحًا.
على سبيل المثال، إذا كان التطبيق يحتوي على servlet منشور على /my-servlet/* ويقوم بتفويض ذلك المرور كما يلي:
فيجب على التطبيق بدلاً من ذلك القيام بما يلي:
import static org.springframework.security.web.util.matcher.AntPathRequestMatcher.antMatcher;
@Bean MvcRequestMatcher.Builder mvc(HandlerMappingIntrospector introspector) { return new MvcRequestMatcher.Builder(introspector); }
أو، إذا تم نشر DispatcherServlet على مسار مختلف، مثل /spring-mvc/*، فبدلاً من:
يجب على التطبيق القيام بما يلي:
@Bean MvcRequestMatcher.Builder mvc(HandlerMappingIntrospector introspector) { return new MvcRequestMatcher.Builder(introspector).servletPath("/spring-mvc"); }
يعد فصل مسار servlet عند إنشاء MvcRequestMatcher أمرًا مهمًا لضمان مطابقة الطلب بشكل صحيح.
== الفروع (Branches)
في هذا المستودع، يوجد فرع (branch) لكل إصدار فرعي من Spring Security. على هذا الفرع، يوجد commit لكل مثال متأثر مع التخفيف المطلوب.
على سبيل المثال، في الفرع 5.8.x، يوجد ثمانية commits لإصلاح الأمثلة الثمانية التي تتطلب تخفيفًا.
عندما يتم إصدار 5.8.6 و 6.0.6 و 6.1.3 و 6.2.0-M2، سيتم إجراء تغييرات إضافية على تلك الفروع حتى يكون التخفيف الأفضل واضحًا.