
Finde anfällige Log4j2-Versionen auf der Festplatte und auch in Java Archive Files (Log4Shell CVE-2021-44228, CVE-2021-45046, CVE-2021-45105)
Ein Python3-Skript, um das Dateisystem zu durchsuchen und Log4j2 zu finden, das anfällig für Log4Shell (CVE-2021-44228 & CVE-2021-45046 & CVE-2021-45105) ist. Es durchsucht rekursiv sowohl die Festplatte als auch (verschachtelte) Java-Archivdateien (JARs).

log4j-finder identifiziert log4j2-Bibliotheken auf Ihrem Dateisystem mithilfe einer Liste von bekannt schlechten und bekannt guten MD5-Hashes bestimmter Dateien (derzeit nur JndiManager.class), die in log4j2-core-*-Paketen vorhanden sind; dem Hauptpaket, das von log4shell betroffen ist. Es sucht nach diesen Dateien in Java-Archivdateien und auf dem Dateisystem. Die -Version wird dann basierend auf dem MD5-Hash dieser Datei identifiziert.
log4j2Um die Scan-Geschwindigkeit zu optimieren, durchsucht es das Dateisystem und verarbeitet NUR die folgenden Dateinamen:
Java ARchive-Dateierweiterungen im Dateinamen (auch verschachtelt in diesen Archiven):
*.jar, *.war, *.earJndiManager.classWenn die Datei mit einer der oben genannten Erweiterungen übereinstimmt, wird in diesen Archiven (alles im Speicher, nichts wird entpackt) nach den Dateinamen gesucht, für die das Skript bekannte Hashes hat. Es sucht auch in verschachtelten Archiven, z. B. einer JAR-Datei in einer WAR-Datei.
Das Skript scannt KEINE anderen Archivdateierweiterungen wie 7z, RAR, TAR, BZ2 usw. Wenn sich also z. B. eine JAR-Datei in einer 7z-Datei befindet, wird das Skript sie nicht finden. Der Grund ist, dass Java nur Java ARchive-Formate laden kann, daher scannen wir nur diese.
Unbekannte MD5-Hashes werden als UNKNOWN angezeigt; dies kann passieren, wenn ein nicht zu log4j2 gehörendes Java-Paket denselben Dateinamen verwendet, nach dem dieses Skript sucht. Es ist höchstwahrscheinlich nicht log4j2, wenn der identifizierte Dateipfad keine Verweise auf org/apache/logging/log4j enthält. Dennoch wird eine manuelle Überprüfung empfohlen.
Sie können log4j-finder mit einer der folgenden Methoden installieren:
Sie können das richtige Binary für Ihr Betriebssystem herunterladen:
Wenn Sie Linux verwenden, können Sie das neueste Release auch auf eine der folgenden Arten herunterladen und ausführen:
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
Für Distributionen mit installiertem Python 3.6+ funktionieren auch die folgenden Methoden:
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
Im Repository gibt es eine GitHub Action, die bei jedem Commit automatisch ein Windows- und Linux-Binary des Skripts log4j-finder.py mit PyInstaller erstellt. Die Build-Artefakte dieser Workflow-Läufe werden verwendet, um sie an die Releases-Seite anzuhängen.
Wir sind uns bewusst, dass einige Antivirenanbieter die Windows-Binaries nicht mögen. In diesem Fall empfehlen wir, die ausführbare Datei selbst mit den folgenden Schritten zu erstellen (beachten Sie, dass wir jetzt auch signierte Binaries bereitstellen).
Wenn Sie Python 3.6 oder höher nicht installiert haben, laden Sie es zunächst von https://www.python.org/downloads/ herunter.
Python 3.8.10, wenn Ihr Binary unter Windows 7 funktionieren soll:
Add Python 3.x to PATH auswählen, das erleichtert die folgenden Schritte erheblich.Öffnen Sie eine Eingabeaufforderung und verwenden Sie pip, um das Paket pyinstaller zu installieren:
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
Optional können Sie das Paket colorama installieren, um Farbunterstützung hinzuzufügen:
pip install colorama
Laden Sie die neueste Version des Skripts log4j-finder.py herunter und führen Sie dann PyInstaller aus:
pyinstaller --onefile --hidden-import colorama log4j-finder.py
Das Windows-Executable befindet sich dann im Verzeichnis dist: dist\log4j-finder.exe
Beispiel für 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
Beispiel zur Verwendung zum Scannen eines Pfads (Standard: /):
$ python3 log4j-finder.py /path/to/scan
Oder direkt eine JAR-Datei:
$ python3 log4j-finder.py /path/to/jarfile.jar
Oder mehrere Verzeichnisse und/oder Dateien:
$ python3 log4j-finder.py /path/to/dir1 /path/to/dir2 /path/to/jarfile.jar
Ausschließen von Dateien oder Verzeichnissen:
$ python3 log4j-finder.py / --exclude "/*/.dontgohere" --exclude "/home/user/*.war"
Beachten Sie, dass es unter Windows nur das Stammverzeichnis c:\ scannt, wenn Sie keine zusätzlichen Argumente angeben. Wir empfehlen, die zu scannenden Laufwerke in der Befehlszeile anzugeben, z. B. (nicht vorhandene Laufwerke werden übersprungen):
log4j-finder.exe c:\ d:\ e:\ f:\
Dateien oder Verzeichnisse, auf die nicht zugegriffen werden kann (Permission denied-Fehler), werden nicht ausgegeben.
Wenn Sie mehr Ausgabe sehen möchten, können Sie das -v-Flag für ausführliche Ausgabe oder -vv für den Debug-Modus verwenden (nur zu Debugging-Zwecken empfohlen).
Anwendungsargumente:
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)
Dateien werden rekursiv gescannt, sowohl auf der Festplatte als auch in (verschachtelten) Java-Archivdateien.