
Поиск уязвимых версий Log4j2 на диске, а также внутри JAR-файлов (Log4Shell CVE-2021-44228, CVE-2021-45046, CVE-2021-45105)
Скрипт на Python3 для сканирования файловой системы для поиска Log4j2, уязвимого к Log4Shell (CVE-2021-44228 & CVE-2021-45046 & CVE-2021-45105). Он рекурсивно сканирует как на диске, так и внутри (вложенных) файлов Java Archive (JAR).

log4j-finder идентифицирует библиотеки log4j2 в вашей файловой системе, используя список заведомо плохих и заведомо хороших MD5-хешей определенных файлов (сейчас только JndiManager.class), присутствующих в пакетах log4j2-core-*; основном пакете, затронутом log4shell. Он ищет эти файлы внутри файлов Java Archive и в файловой системе. Затем версия 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, используя один из следующих методов:
Вы можете загрузить правильный бинарный файл для вашей операционной системы:
Если вы в Linux, вы также можете загрузить последний релиз и запустить одним из следующих способов:
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, который автоматически генерирует бинарные файлы для Windows и Linux из скрипта log4j-finder.py с помощью PyInstaller при каждом коммите. Артефакты сборки этих запусков используются для прикрепления к странице Releases.
Мы знаем, что некоторые антивирусные вендоры не любят бинарные файлы Windows; в этом случае мы рекомендуем сгенерировать исполняемый файл самостоятельно, используя следующие шаги (обратите внимание, что теперь мы также предоставляем подписанные бинарные файлы).
Если у вас не установлен Python 3.6 или выше, сначала загрузите его с https://www.python.org/downloads/
Python 3.8.10, если вы хотите, чтобы ваш бинарный файл работал на Windows 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
Исполняемый файл Windows затем находится в каталоге 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"
Обратите внимание, что в Windows он сканирует только корневой диск c:\, если вы не укажете дополнительные аргументы. Мы рекомендуем указывать диски, которые нужно сканировать, в командной строке, например (диски, которые не существуют, пропускаются):
log4j-finder.exe c:\ d:\ e:\ f:\
Файлы или каталоги, к которым нет доступа (ошибки Permission denied), не выводятся.
Если вы хотите видеть больше вывода, вы можете указать флаг -v для подробного вывода или -vv для отладки (рекомендуется только для отладки).
Аргументы приложения:
positional arguments:
PATH Directory or file(s) to scan (recursively) (default:
['/'])