
مشروع التحقق من شروط التأثير المحلية وإصلاح ترقية الإصدار وإعادة الاختبار لـ 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
يعني هذا المسار:
class: الوصول إلى كائن Class في Java المقابل لكائن الأعمال الحاليmodule: الوصول إلى وحدة Java التي ينتمي إليها الفصلname: قراءة اسم الوحدةتستدعي عملية التشخيص فقط فحص قابلية قراءة الخصائص وطرق قراءة قيم الخصائص:
لذلك، يمكن لهذا التشخيص فقط مراقبة الفرق في الوصول إلى مسارات الخصائص الداخلية قبل الإصلاح وبعده، ولا يمكنه وحده إثبات تحقيق تنفيذ أوامر عن بُعد.
البيئة قبل الإصلاح تستخدم:
Spring Framework 5.3.17
مسار الخصائص المفحوص:
class.module.name
نتيجة التشخيص:
truenullتعني true أن البيئة الحالية يمكنها الاستمرار في تحليل module.name عبر خاصية class لكائن الأعمال العادي.
تكون نتيجة القراءة null لأن تطبيق WAR الحالي يعمل في الوحدة غير المسماة في Java، واسم الوحدة فارغ، ولا يعني ذلك فشل قراءة مسار الخصائص.
البيئة بعد الإصلاح تستخدم:
Spring Framework 5.3.18
إعادة التشخيص باستخدام نفس مسار الخصائص:
class.module.name
نتيجة التشخيص:
falseNot readableتشكل النتائج قبل الإصلاح وبعده مقارنة واضحة:
تشير هذه النتيجة إلى أنه بعد ترقية الإصدار، أصبح الوصول إلى مسار الخصائص الأصلي للتشخيص مقيدًا، ولم يعد المظهر الخطر الذي لوحظ قبل الإصلاح موجودًا.
يعتمد هذا المشروع ترقية إصدار Spring Framework كطريقة للإصلاح.
الإعداد قبل الإصلاح:
<spring.version>5.3.17</spring.version>
الإعداد بعد الإصلاح:
<spring.version>5.3.18</spring.version>
أُنجزت العمليات التالية أثناء الإصلاح:
fixed-demo.تشمل تبعيات Spring المنشورة فعليًا في المشروع بعد الإصلاح:
spring-beans-5.3.18.jarspring-core-5.3.18.jarspring-web-5.3.18.jarspring-webmvc-5.3.18.jarتثبت هذه النتيجة أنه تمت إعادة بناء الإصدار المُصلَح ونشره فعلًا، وليس مجرد تعديل رقم الإصدار في pom.xml.
بعد الترقية إلى Spring Framework 5.3.18، تمت إعادة زيارة الصفحة الرئيسية للمشروع المُصلَح وإرسال بيانات الاختبار التالية:
Alice[email protected]بعد الإرسال، ما زالت الصفحة تعرض بشكل طبيعي:
Alice[email protected]تشير هذه النتيجة إلى أن ترقية الإصدار لم تؤثر على ربط معاملات الطلبات الطبيعية ووظيفة عرض الصفحات في المشروع.
يمكن لآلية ربط البيانات التلقائية في Spring MVC الوصول إلى خصائص كائنات Java وفقًا لأسماء معاملات طلبات HTTP.
تحتاج معاملات الأعمال العادية name وemail فقط إلى الوصول إلى الخصائص العادية المقابلة في UserProfile.
ومع ذلك، تدعم آلية الوصول إلى الخصائص في Spring أيضًا مسارات الخصائص المتداخلة ذات النقاط. في الإصدارات المتأثرة، لم تكن القيود على بعض مسارات الخصائص الداخلية صارمة بما يكفي، مما قد يسمح للمعاملات الخارجية بالانتقال من كائنات الأعمال العادية إلى كائنات Java Class أو الوحدات أو محمّلات الفئات أو كائنات حاوية Servlet في بيئات محددة.
عندما توجد خصائص قابلة للكتابة في هذه الكائنات الداخلية يمكنها التأثير على إعدادات الخادم أو نظام الملفات، ويستوفي التطبيق شروط JDK وTomcat ونشر WAR وربط البيانات في الوقت نفسه، فقد يتشكل خطر تنفيذ أوامر عن بُعد.
لا تنبع هذه الثغرة من وجود مشكلة في خاصيتي name أو email نفسيهما، ولا تعني أن جميع المشاريع التي تستخدم Spring MVC قابلة للاستغلال بالضرورة. عادةً ما يتطلب تحقق الثغرة توفر شروط متعددة معًا.
في أنظمة الأعمال الحقيقية، يُنصح باتخاذ التدابير التالية:













أنجز هذا المشروع في بيئة محلية معزولة تأكيد شروط تأثير ثغرة CVE-2022-22965 في Spring Framework، وتشخيص المظهر الخطر، وإصلاح ترقية الإصدار، وإعادة الاختبار بعد الإصلاح.
استخدم المشروع قبل الإصلاح Spring Framework 5.3.17. في بيئة JDK 11 وSpring MVC وApache Tomcat 9.0.60 والنشر التقليدي كحزمة WAR، حُكم على مسار الخصائص class.module.name بأنه قابل للقراءة.
بعد الإصلاح، رُقّي المشروع Spring Framework إلى 5.3.18. أصبح مسار الخصائص نفسه غير قابل للقراءة، بينما ما زالت وظيفة ربط البيانات الطبيعية للاسم والبريد الإلكتروني تعمل.
لم ينفّذ هذا المشروع استغلالًا كاملًا للثغرة عن بُعد، بل أجرى التحقق من الفرق قبل وبعد الإصلاح من خلال طريقة قراءة فقط آمنة وموجهة.
يركّز المشروع على إظهار القدرات التالية: