
تحليل تقني متعمق لـ CVE-2022-22965 (Spring4Shell) مع إعداد البيئة، وشرح التصحيح خطوة بخطوة، وتحليل سلسلة الاستغلال للتمرين المختبري التعليمي.
Spring4Shell هو اسم CVE موجود في Spring Core من إطار العمل Spring.
بنقطة CVSS 3.x البالغة 9.8، تم تصنيف الثغرة ضمن أعلى مستوى مخاطر (حرج). تسمح هذه الثغرة للمهاجم بتنفيذ تعليمات برمجية خبيثة عن بُعد والتحكم في الخادم الذي يحتوي على الثغرة.
إلى جانب انتشار Spring Core على الإنترنت وخطورة Spring4Shell، يقيم الخبراء أن تأثير هذه الثغرة لا يقل عن Log4shell.
لا تؤثر Spring4Shell على جميع تطبيقات الويب التي تستخدم إطار العمل Spring على الإنترنت، بل تتطلب وجود العناصر التالية في تطبيق الويب:
البيئة التي قمت بإعدادها ستحتوي على المواصفات التالية:
تثبيت Apache Tomcat
كما ذكرت أعلاه، أستخدم kali 2021.4a و Apache Tomcat 9.0.45. إذا كنت لا تعرف كيفية تثبيت Apache Tomcat وتريد تثبيته على Kali Linux، يمكنك الاطلاع على هذا الرابط.
ملاحظة: استبدل الرابط https://mirror.kiu.ac.ug/apache/tomcat/tomcat-9/v9.0.45/bin/apache-tomcat-9.0.45.tar.gz بـ https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.45/bin/apache-tomcat-9.0.45.tar.gz
اختيار بيئة التطوير المتكاملة IDE
نحتاج إلى IDE لكتابة المشروع، وتجميعه على شكل ملف .war، والأهم من ذلك هو التصحيح. أنا أستخدم Intellij، يمكنك استخدام Eclipse أو Netbeans... المهم أن IDE يدعم java.
إنشاء مشروع بسيط يحتوي على الثغرة
مشروعي بسيط جدًا، ويتكون من:
نموذج HelloWorld.java

وحدة تحكم HelloWorldController.java

عرض hello.jsp

بناء ملف .war
لتجميع المشروع، قم بما يلي: Build -> Build Artifacts -> helloworld:war -> Build.
انتظر حتى يكتمل البناء بنجاح، عندها سيظهر مجلد إضافي باسم out في المشروع. اذهب إلى ./out/artifacts/your_war_name/ وستجد ملفًا باسم your_war_name.war، هذا الملف .war هو مشروع الويب بعد التجميع والتعبئة، ويمكن استخدامه للنشر على خوادم Java Servlet مثل Apache Tomcat.
إذا كان Build Artifacts غير نشط (لا يمكن بناء Artifacts)، فهذا يعني أن Build Artifacts لم يتم إعداده لهذا المشروع. اذهب إلى: File -> Project Structure -> Artifacts -> احذف جميع artifacts الموجودة -> Add (علامة +) -> Web Application: Exploded -> From Modules... -> OK (انتهاء إنشاء Exploded) -> Add (علامة +) -> Web Application: Archive -> For ‘helloworld:war exploded’ -> OK. ثم أعد تنفيذ Build Artifacts.
النشر وإعداد التصحيح
النشر
لنشر ملف .war على Apache Tomcat،只需 copy ملف .war إلى المجلد /webapps داخل مجلد Apache Tomcat (مثال: بالنسبة لي، سأقوم بنسخ ملف helloworld.war (أعدت تسميته لسهولة الاستدعاء) إلى المجلد /opt/tomcat/apache-tomcat-9.0.45/webapps/). بعد ذلك، قم بتشغيل خادم Tomcat بإحدى طريقتين (لنظام linux):
بعد النشر، تفضل بزيارة http://localhost:8080/helloworld
إعداد التصحيح
لإعداد التصحيح (عن بُعد) لـ Tomcat، اتبع ما يلي:
جانب الخادم:
افتح ملف catalina.sh واستبدل قيمة localhost بـ ip_may_ao للمعامل JPDA_ADDRESS

أعد تشغيل خادم Tomcat باستخدام: /opt/tomcat/apache-tomcat-9.0.45/bin/catalina.sh jpda start. في هذه الحالة، بالإضافة إلى فتح المنفذ 8080 لخادم HTTP، سيفتح Tomcat أيضًا المنفذ 8000 للسماح لنا بالاتصال به والتصحيح
ملاحظة: في جزء التصحيح هذا، أقوم بتشغيل Intellij على Windows 10 وتشغيل Tomcat على الآلة الافتراضية Kali، لذلك أحتاج إلى تغيير JPDA_ADDRESS. إذا قمت بإعداد كل من Intellij و Windows 10 على نفس الجهاز، فلا تحتاج إلى تغييره.
جانب Intellij:
اذهب إلى Run -> Edit Configurations... -> Add (علامة +) -> Remote JVM Debug
قم بتسميته -> قم بتعديل Host و Port ليكون عنوان IP والمنفذ الذي قمت بتعديله في ملف catalina.sh -> OK -> Shift + F9 (بدء التصحيح)

أولاً، سأقوم بتحليل المشروع الذي أستخدمه للتصحيح، كما ذكرت أعلاه، هذا المشروع ببساطة يتكون من:
لدي مثال كما يلي:

قام التطبيق بأخذ المعلومات من معاملات طلب POST وإنشاء كائن helloWorld{"person":"Leo", "message":"Hi there"}، هذا الكائن helloWorld هو المدخل لدالة helloPost. سيقوم التطبيق بالعمل كما ذكرت أعلاه لإعادة الاستجابة للمستخدم.
عملية تحويل المعاملات في جسم طلب POST إلى كائن helloWorld تتم بالكامل تلقائيًا بواسطة Spring، فكيف يعمل ذلك؟ وهل يقوم بالتحقق من صحة المعاملات المدخلة؟
هذه الصورة ملتقطة أثناء عملية التصحيح، مثال تم تنفيذه بطلب body هو "class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT" (سأشير إلى الجانب الأيسر (تتبع الاستدعاءات stack trace) بـ (1) والجانب الأيمن بـ (2)):
