
أكدت Spring وجود ثغرة RCE في إطار عمل Spring. لقد نشر الفريق للتو البيان إلى جانب أدلة التخفيف للمشكلة. الآن، يمكن تتبع هذه الثغرة تحت معرف CVE-2022-22965.
أكدت Spring وجود ثغرة تنفيذ أوامر عن بعد (RCE) في إطار Spring. أصدر الفريق بيانًا رسميًا إلى جانب إرشادات التخفيف للمشكلة. يمكن تتبع هذه الثغرة الأمنية تحت المعرف CVE-2022-22965.
بعض المعلومات حول ثغرة Spring4Shell ومشاركة التفاصيل في منشور Spring4Shell: التفاصيل والاستغلال. بالإضافة إلى ذلك، أكد فريق الأمن من Praetorian أن Spring Core على JDK9+ معرض لتنفيذ الأوامر عن بعد بسبب تجاوز لثغرة CVE-2010-1622.
في البداية، بدأ الأمر في 30 مارس، حيث ألمح قائد فريق KnownSec 404، Heige، إلى أول إشعار بالثغرة. غرّد برسالة تحذيرية "Spring core RCE (JDK >=9" مع صورة الإثبات.

بينما ننشر قصة الثغرة، اختفى Heige من تويتر. لا نعرف السبب وراء ذلك ولكن قد يكون هناك شيء ما.
في نهاية عام 2021، اشتعلت الإنترنت بسبب تسريب ثغرة يوم الصفر لتنفيذ الأوامر عن بعد المعروفة أيضًا باسم Log4Shell، في Apache Log4j2. تم اكتشاف الثغرة بواسطة فريق أمن Alibaba Cloud.
اليوم، عثر الباحثون على ثغرة أخرى خطيرة قد تسبب أضرارًا جسيمة. يتم تتبع الخطأ الآن تحت المعرف CVE-2022-22965، ويمكننا تسميته Spring4Shell. توجد الثغرة في نواة Spring مع إصدار JDK أكبر من أو يساوي 9.0.
إطار Spring والأطر المشتقة منه، ملفات spring-beans-*.jar أو CachedIntrospectionResults.class
جميع التفاصيل أدناه مؤكدة الآن. لا أتحمل أي مسؤولية عن أي ضرر ناتج.
باعتباره أحد أشهر أطر العمل مفتوحة المصدر خفيفة الوزن في Java، يتيح Spring للمطورين التركيز على منطق الأعمال ويبسط دورة تطوير تطبيقات Java للمؤسسات.
يتطلب الاستغلال وجود نقطة نهاية مع تمكين DataBinder (مثل طلب POST يقوم بفك تشفير البيانات من جسم الطلب تلقائيًا) ويعتمد بشكل كبير على حاوية servlet الخاصة بالتطبيق. على سبيل المثال، عند نشر Spring على Apache Tomcat، يكون WebAppClassLoader متاحًا، مما يسمح للمهاجم باستدعاء getters و setters لكتابة ملف JSP ضار على القرص. ومع ذلك، إذا تم نشر Spring باستخدام حاوية Tomcat المضمنة، فإن مُحمل الفئات هو LaunchedURLClassLoader الذي يتمتع بوصول محدود.
ومع ذلك، في إصدار JDK9 (وما فوق) من إطار Spring، يمكن للمهاجم عن بعد الحصول على كائن AccessLogValve وقيم الحقول الضارة من خلال وظيفة ربط المعلمات (parameter binding) في الإطار، بشرط استيفاء شروط معينة.
على الخادم قيد التشغيل لنظام المؤسسة، قم بتشغيل الأمر "java -version" للتحقق من إصدار JDK قيد التشغيل. إذا كان رقم الإصدار أقل من أو يساوي 8، فإنه لا يتأثر بالثغرة.
بعد إتمام خطوتي التحري أعلاه، إذا تحقق الشرطان التاليان معًا، يتم تحديد أنه متأثر بهذه الثغرة:
الآن قام فريق Spring بإصلاح الثغرة وأصدر أحدث إصدارات Spring Boot 2.6.6 و 2.5.12 التي تعتمد على Spring Framework 5.3.18.
على أجهزة حماية الشبكة مثل WAF، قم بتنفيذ تصفية قاعدة للسلاسل مثل "class."، "Class."، ".class."، و ".Class." وفقًا لحركة المرور الفعلية للخدمات المنشورة. بعد تصفية القواعد، اختبر تشغيل الأعمال لتجنب أي تأثير إضافي.
يجب إجراء الإصلاح المؤقت للثغرة في الخطوتين التاليتين في وقت واحد:
ابحث عن التعليق التوضيحي @InitBinder عالميًا في التطبيق لمعرفة ما إذا كانت طريقة dataBinder.setDisallowedFields قد تم استدعاؤها في نص الطريقة. إذا تم العثور على إدخال هذا المقطع البرمجي، أضف {"class.", "Class.", ".class.", ".Class."} إلى القائمة السوداء الأصلية. (ملاحظة: إذا تم استخدام هذا المقطع البرمجي كثيرًا، فيجب إلحاقه في كل مكان.)
قم بإنشاء الفئة الشاملة التالية تحت حزمة مشروع نظام التطبيق، وتأكد من تحميل هذه الفئة بواسطة Spring (يوصى بإضافتها في الحزمة التي يوجد بها Controller). بعد إضافة الفئة، يحتاج المشروع إلى إعادة الترجمة والتعبئة، واختبار التحقق الوظيفي، وإعادة نشر المشروع.
import org.springframework.core.annotation.Order;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.InitBinder;
@ControllerAdvice
@Order(10000)
public class GlobalControllerAdvice{
@InitBinder
public void setAllowedFields(webdataBinder dataBinder){
String[]abd=new string[]{"class.*","Class.*","*.class.*","*.Class.*"};
dataBinder.setDisallowedFields(abd);
}
}

من مستودع Git لمشاريع Spring، يبدو أن مطوري Spring يعملون على إصلاح ثغرة تنفيذ الأوامر عن بعد، لكن علينا انتظار التأكيد الرسمي.