
مشروع التحقق من شروط التأثير المحلية وإصلاح ترقية الإصدار وإعادة الاختبار لـ Spring Framework CVE-2022-22965
هذا المشروع مخصص لتعلم والتحقق من شروط التأثير والمخاطر وأسلوب الإصلاح وإجراءات إعادة الاختبار بعد الإصلاح لثغرة Spring Framework CVE-2022-22965، والمعروفة أيضًا باسم Spring4Shell.
تم تنفيذ المشروع في بيئة محلية مرخصة أُعدت شخصيًا. لا يركّز المشروع على مهاجمة أهداف حقيقية، بل على بناء بيئتي اختبار Spring MVC قبل الإصلاح وبعده، لتأكيد شروط التأثير المرتبطة بالثغرة عنصرًا بعنصر، ومراقبة الفرق في مسارات الخصائص الداخلية لربط بيانات Spring قبل وبعد ترقية الإصدار بطريقة آمنة وموجهة للقراءة فقط.
أنجز هذا المشروع الخطوات التالية:
يُستخدم هذا المشروع فقط في بيئة محلية شخصية أو بيئة اختبار أمان مرخّصة بوضوح.
لا يستهدف المشروع أي مواقع ويب عامة أو خوادم أو أنظمة أعمال تابعة لجهات خارجية بأي عمليات فحص أو استكشاف أو استغلال للثغرات، ولا يتضمن بيانات مستخدمين حقيقية أو بيانات أعمال حقيقية.
لم تُنفَّذ أثناء الاختبار العمليات التالية:
يُحظر استخدام أساليب الاختبار في هذا المشروع ضد أي أهداف غير مرخصة.
تُعرف CVE-2022-22965 عادةً باسم Spring4Shell، وهي ثغرة تنفيذ أوامر عن بُعد في Spring Framework تتعلق بآلية ربط بيانات معاملات الطلبات.
يدعم Spring MVC الربط التلقائي لمعاملات HTTP بخصائص كائنات Java. على سبيل المثال، يستقبل هذا المشروع معاملي الاسم والبريد الإلكتروني بالطريقة التالية:
@ModelAttribute("profile") UserProfile profile
في الظروف الطبيعية، يتم ربط معاملي الطلب name وemail بكائن UserProfile وفقًا لأسماء الخصائص.
في الإصدارات المتأثرة، لم تكن القيود على الوصول إلى بعض مسارات الخصائص الداخلية صارمة بما يكفي. عند استخدام JDK 9 أو إصدار أحدث واستيفاء شروط معينة تتعلق بحاوية Servlet وطريقة النشر وربط البيانات، قد تتمكن معاملات الطلبات الخارجية من الوصول عبر كائنات الأعمال العادية إلى كائنات Java الداخلية المتعلقة بـ Class أو الوحدات (Modules) أو محمّلات الفئات (ClassLoaders) أو الحاوية.
في البيئات القابلة للاستغلال تحديدًا، قد يتمكن المهاجم من تعديل إعدادات الخادم أو كتابة ملفات على الخادم، مما يؤدي إلى خطر تنفيذ أوامر عن بُعد.
لا ينفّذ هذا المشروع استغلالًا كاملًا للثغرة عن بُعد، بل يستخدم مسار الخصائص التالي لإجراء تشخيص آمن للقراءة فقط للمقارنة:
class.module.name
تم تنفيذ هذا المشروع في بيئة معزولة محلية باستخدام VMware.
127.0.0.1بيانات اختبار الوظيفة الطبيعية:
Alice[email protected]مسار خاصية التشخيص الأمني:
class.module.name
spring4shell-local-verification-lab/
README.md: مقدمة المشروع ومنهجية الاختبار ونتائج التحقق وشرح الإصلاحdocs/: تقرير التحقق المحلي من شروط تأثير Spring4Shell والإصلاح وإعادة الاختبارimages/: لقطات بيئة المشروع وعملية الاختبار وإعادة الاختبارvulnerable-demo/: مشروع ما قبل الإصلاح باستخدام Spring Framework 5.3.17fixed-demo/: مشروع ما بعد الإصلاح باستخدام Spring Framework 5.3.18notes/: ملاحظات التعلم وسجلات العمليةالهيكل الرئيسي للمصدر:
config/: فئات إعداد Spring MVC وفئة تهيئة التطبيقcontroller/: معالجة النماذج ووحدة تحكم تشخيص مسار الخصائصmodel/: فئة UserProfile المستخدمة لاستقبال معاملي الاسم والبريد الإلكترونيWEB-INF/views/: صفحات JSP للصفحة الرئيسية ونتائج التقديم ونتائج التشخيصيُنشئ هذا المشروع تطبيقَي Spring MVC، أحدهما قبل الإصلاح والآخر بعده.
دليل المشروع:
vulnerable-demo
الإصدار المستخدم:
Spring Framework 5.3.17
ملف WAR المُنشأ:
spring4shell-vulnerable-demo.war
عنوان الوصول:
http://127.0.0.1:8080/spring4shell-vulnerable-demo/
صفحة التشخيص:
http://127.0.0.1:8080/spring4shell-vulnerable-demo/binding-probe
دليل المشروع:
fixed-demo
الإصدار المستخدم:
Spring Framework 5.3.18
ملف WAR المُنشأ:
spring4shell-fixed-demo.war
عنوان الوصول:
http://127.0.0.1:8080/spring4shell-fixed-demo/
صفحة التشخيص:
http://127.0.0.1:8080/spring4shell-fixed-demo/binding-probe
يوفر مشروع الاختبار نموذجًا بسيطًا لبيانات المستخدم، ويتضمن:
تستقبل وحدة التحكم معاملات الطلبات بالطريقة التالية:
@ModelAttribute("profile") UserProfile profile
عندما يرسل المستخدم الاسم والبريد الإلكتروني، يقوم Spring MVC تلقائيًا بربط معاملي name وemail بكائن UserProfile.
تقرأ صفحة النتائج الكائن المرتبط وتعرض الاسم والبريد الإلكتروني اللذين أدخلهما المستخدم.
تُستخدم هذه الوظيفة لتأكيد أن المشروع يعمل بشكل طبيعي، ولإثبات وجود نقطة ربط بيانات صالحة لمعاملات طلبات Spring MVC في التطبيق.
يتبع هذا المشروع منهجية "تأكيد الوظيفة الطبيعية أولًا، ثم تأكيد شروط التأثير، ثم إجراء تشخيص مخاطر القراءة فقط، وأخيرًا الإصلاح وإعادة الاختبار".
@ModelAttribute لربط معاملات الطلبات بكائن UserProfile.BeanWrapper من Spring لإجراء تشخيص القراءة فقط لـ class.module.name.قام هذا المشروع بتأكيد شروط التأثير التالية عنصرًا بعنصر:
spring-webmvc@ModelAttribute في وحدة التحكمتشمل تبعيات Spring المنشورة فعليًا في المشروع قبل الإصلاح:
spring-beans-5.3.17.jarspring-core-5.3.17.jarspring-web-5.3.17.jarspring-webmvc-5.3.17.jarلا يحكم هذا المشروع على وجود الثغرة من إصدار Spring Framework وحده، بل يجري تحليلًا شاملًا يجمع بين JDK وSpring MVC وTomcat ونشر WAR ونقطة ربط البيانات.
لتجنب تنفيذ استغلال الثغرة بأسلوب مدمر، يستخدم هذا المشروع BeanWrapper من Spring Framework لإجراء فحص القراءة فقط لمسار الخصائص التالي:
class.module.name
يعني هذا المسار: