
ابحث عن إصدارات Log4j2 الضعيفة على القرص وأيضًا داخل ملفات أرشيف Java (Log4Shell CVE-2021-44228, CVE-2021-45046, CVE-2021-45105)
سكريبت بلغة Python3 لمسح نظام الملفات للعثور على Log4j2 المعرض لثغرة Log4Shell (CVE-2021-44228 و CVE-2021-45046 و CVE-2021-45105). يقوم بالمسح بشكل متكرر على القرص وداخل ملفات أرشيف Java (JARs) المتداخلة.

يحدد log4j-finder مكتبات log4j2 على نظام الملفات الخاص بك باستخدام قائمة من تجزئات MD5 المعروفة بالسيئة و المعروفة بالجيدة لملفات محددة (حاليًا فقط JndiManager.class) الموجودة في حزم log4j2-core-*؛ الحزمة الرئيسية المتأثرة بـ log4shell. يبحث عن هذه الملفات داخل ملفات أرشيف Java وعلى نظام الملفات. ثم يتم التعرف على إصدار log4j2 بناءً على تجزئة MD5 لهذا الملف.
لتحسين سرعة المسح، يبحث في نظام الملفات ويعالج فقط أسماء الملفات التالية:
Java ARchive في اسم الملف (أيضًا المتداخلة في هذه الأرشيفات):
*.jar, *.war, *.earJndiManager.classإذا تطابق الملف مع أحد الامتدادات المذكورة أعلاه، فسيتحقق داخل هذه الأرشيفات (كلها في الذاكرة، لا شيء يتم فك ضغطه) للبحث عن أسماء الملفات التي لدى السكريبت تجزئات معروفة لها. كما يبحث داخل الأرشيفات المتداخلة، على سبيل المثال، ملف JAR داخل ملف WAR.
لا يقوم السكريبت بمسح امتدادات ملفات أرشيف أخرى مثل 7z, RAR, TAR, BZ2, إلخ. لذا، على سبيل المثال، إذا كان ملف JAR داخل ملف 7z، فلن يجده السكريبت. المنطق هو أن Java يمكنها تحميل تنسيقات Java ARchive فقط لذلك نقوم بمسح تلك فقط.
تظهر تجزئات MD5 غير المعروفة كـ UNKNOWN؛ قد يحدث هذا إذا استخدمت حزمة Java غير تابعة لـ log4j2 نفس اسم الملف الذي يبحث عنه هذا السكريبت. من المحتمل جدًا ألا يكون log4j2 إذا كان مسار الملف المحدد لا يحتوي على إشارات إلى org/apache/logging/log4j. ومع ذلك، لا يزال التحقق اليدوي موصى به.
يمكنك تثبيت log4j-finder باستخدام إحدى الطرق التالية:
يمكنك تنزيل الملف الثنائي الصحيح لنظام التشغيل الخاص بك:
إذا كنت على لينكس، يمكنك أيضًا تنزيل أحدث إصدار وتشغيله باستخدام إحدى الطرق التالية:
curl -L https://github.com/fox-it/log4j-finder/releases/latest/download/log4j-finder -o log4j-finder
chmod +x log4j-finder
sudo ./log4j-finder
wget https://github.com/fox-it/log4j-finder/releases/latest/download/log4j-finder -O log4j-finder
chmod +x log4j-finder
sudo ./log4j-finder
للتوزيع مع تثبيت Python 3.6+، تعمل إحدى الطرق التالية أيضًا:
curl -L https://github.com/fox-it/log4j-finder/raw/main/log4j-finder.py -o log4j-finder.py
sudo python3 log4j-finder.py
wget https://github.com/fox-it/log4j-finder/raw/main/log4j-finder.py
sudo python3 log4j-finder.py
git clone https://github.com/fox-it/log4j-finder
cd log4j-finder
sudo python3 log4j-finder.py
يوجد GitHub Action في المستودع يقوم تلقائيًا بإنشاء ملف ثنائي لويندوز ولينكس لسكريبت log4j-finder.py باستخدام PyInstaller في كل commit. تُستخدم نتائج بناء هذه العمليات لإرفاقها بصفحة الإصدارات.
نحن نعلم أن بعض موفري مضادات الفيروسات لا يحبون الملفات الثنائية لويندوز، في هذه الحالة نوصي بإنشاء الملف التنفيذي بنفسك باستخدام الخطوات التالية (لاحظ أننا نوفر الآن أيضًا ملفات ثنائية موقعة).
إذا لم يكن لديك Python 3.6 أو أعلى مثبتًا، قم بتنزيله أولاً من https://www.python.org/downloads/
Python 3.8.10 إذا كنت تريد أن يعمل ملفك الثنائي على ويندوز 7:
Add Python 3.x to PATH، فهذا يسهل الخطوات التالية.افتح موجه الأوامر واستخدم pip لتثبيت حزمة pyinstaller:
pip install pyinstaller
# In the output you will see where pyinstaller is installed, for example:
# C:\Users\User\AppData\Roaming\Python\Python310\Scripts
#
# Verify using --version
C:\Users\User\AppData\Roaming\Python\Python310\Scripts\pyinstaller.exe --version
4.7
اختياريًا، قم بتثبيت حزمة colorama لإضافة دعم للألوان:
pip install colorama
قم بتنزيل أحدث إصدار من سكريبت log4j-finder.py ثم قم بتشغيل PyInstaller:
pyinstaller --onefile --hidden-import colorama log4j-finder.py
سيكون الملف التنفيذي لويندوز بعد ذلك في مجلد dist: dist\log4j-finder.exe
مثال معطى لـ Debian 11:
# Install PyInstaller using pip3
sudo apt update
sudo apt install python3-pip git
pip3 install --user pyinstaller
# Git clone and build using PyInstaller
git clone https://github.com/fox-it/log4j-finder
cd log4j-finder
~/.local/bin/pyinstaller --onefile log4j-finder.spec
# Verify that the binary works
./dist/log4j-finder --help
مثال استخدام لمسح مسار (الافتراضي هو /):
$ python3 log4j-finder.py /path/to/scan
أو مباشرة ملف JAR:
$ python3 log4j-finder.py /path/to/jarfile.jar
أو أدلة متعددة و/أو ملفات:
$ python3 log4j-finder.py /path/to/dir1 /path/to/dir2 /path/to/jarfile.jar
استبعاد ملفات أو أدلة:
$ python3 log4j-finder.py / --exclude "/*/.dontgohere" --exclude "/home/user/*.war"
لاحظ أنه على ويندوز يقوم فقط بمسح محرك الأقراص الجذر c:\ إذا لم تعطِ أي وسائط إضافية.
نوصي بتحديد محركات الأقراص التي تحتاج إلى مسحها في سطر الأوامر مثل (يتم تخطي محركات الأقراص غير الموجودة):
log4j-finder.exe c:\ d:\ e:\ f:\
الملفات أو الأدلة التي لا يمكن الوصول إليها (أخطاء الرفض) لا تتم طباعتها.
إذا كنت تريد رؤية مخرجات أكثر، يمكنك إعطاء علامة -v للوضع المفصل، أو -vv لوضع التصحيح (موصى به فقط لأغراض التصحيح).
وسائط التطبيق:
positional arguments:
PATH Directory or file(s) to scan (recursively) (default:
['/'])
optional arguments:
-h, --help show this help message and exit
-v, --verbose verbose output (-v is info, -vv is debug) (default: 0)
-n, --no-color disable color output (default: False)
-q, --quiet be more quiet, disables banner and summary (default:
False)
-b, --no-banner disable banner (default: False)
-V, --version show program's version number and exit
-e PATTERN, --exclude PATTERN
exclude files/directories by pattern (can be used
multiple times) (default: None)
يتم مسح الملفات بشكل متكرر، على القرص وفي ملفات أرشيف Java المتداخلة.