
Самый быстрый сканер файловой системы для поиска log4shell (CVE-2021-44228, CVE-2021-45046) и других уязвимых (CVE-2017-5645, CVE-2019-17571, CVE-2022-23305, CVE-2022-23307 ... ) экземпляров библиотеки log4j. Отличная производительность и низкое потребление памяти.

Python-порт https://github.com/mergebase/log4j-detector. log4j-detector защищён авторским правом (C) Copyright 2021 Mergebase Software Inc. https://mergebase.com/ Лицензия: GPLv3.
Мотивацией для портирования на Python было повышение производительности, снижение потребления памяти и улучшение читаемости кода. См. раздел о сравнении производительности ниже.
И похоже, это самый быстрый инструмент сканирования с наименьшими требованиями к памяти
Определяет версии log4j (1.x), reload4j (1.2.18+) и log4j-core (2.x) в вашей файловой системе, уязвимые к CVE-2021-44228, CVE-2021-45046 и многим другим — см. таблицу ниже. Он способен находить экземпляры, встроенные в более крупные приложения на несколько уровней вглубь. Работает на Linux, Windows, Mac и везде, где работает Python 3.8+.
Может корректно обнаруживать log4j внутри исполняемых spring-boot jar/wars, зависимостей, объединённых в uber jars, shaded jars и даже распакованных jar-файлов, просто лежащих на файловой системе без сжатия (так называемые *.class). Также умеет обрабатывать shaded-файлы классов — расширения .esclazz (elastic) и .classdata (Azure).
Ищет Java-архивы со следующими расширениями: .zip, .jar, .war, .ear, .aar, .jpi, .hpi, .rar, .nar, .wab, .eba, .ejb, .sar, .apk, .par, .kar
| Detects | CVE | CVSSv3 | Severity | Java | Vuln from | Vulnerable to | Fixed in | library |
|---|---|---|---|---|---|---|---|---|
| ДА | CVE-2021-44228 | 10.0 | Критическая | 8 | 2.0-beta9 | 2.14.1 | 2.15.0 | log4jv2 |
| ДА | CVE-2017-5645 | 9.8 | Критическая | 7 | 2.0-alpha1 | 2.8.1 | 2.8.2 | log4jv2 |
| ДА | CVE-2019-17571 | 9.8 | Критическая | 1.2.0 | 1.2.17 | nofix | log4jv1 | |
| ДА | CVE-2021-45046 | 9.0 | Критическая | 7/8 | 2.0-beta9 | 2.15.0, исключая 2.12.2 | 2.12.2/2.16.0 | log4jv2 |
| ДА | CVE-2022-23305 | 9.8 | Критическая | 1.2.0 | 1.2.17 | nofix / 1.2.18.1 | log4jv1, reload4j | |
| ДА | CVE-2022-23307 | 9.8 | Критическая | 1.2.0 | 1.2.17 | nofix / 1.2.18.1 | log4jv1, reload4j | |
| ДА | CVE-2022-23302 | 8.8 | Высокая | 1.0 | 1.2.17 | nofix / 1.2.18.1 | log4jv1, reload4j | |
| ДА | CVE-2021-4104 | 7.5 | Высокая | - | 1.0 | 1.2.17 | nofix | log4jv1 |
| ДА | CVE-2021-44832 | 6.6 | Средняя | 6/7/8 | 2.0-alpha7 | 2.17.0, исключая 2.3.2/2.12.4 | 2.3.2/2.12.4/2.17.1 | log4jv2 |
| - | CVE-2021-42550 | 6.6 | Средняя | - | 1.0 | 1.2.7 | 1.2.8 | logback |
| ДА | CVE-2021-45105 | 5.9 | Средняя | 6/7/8 | 2.0-beta9 | 2.16.0, исключая 2.12.3 | 2.3.1/2.12.3/2.17.0 | log4jv2 |
| - | CVE-2020-9488 | 3.7 | Низкая | 7/8 | 2.0-alpha1 | 2.13.1 | 2.12.3/2.13.2 | log4jv2 |
Для каждого экземпляра выводится соответствующий список CVE. Для каждого CVE анализируется файл библиотеки log4j — проверяется, применены ли рекомендуемые обходные меры (например, удалены JndiLookup.class или JMSAppender.class); в этом случае он считается неуязвимым. Статус STRANGE выводится для архивов с файлом pom.properties библиотеки log4j-core, но без фактических классов байт-кода; обычно это исходные пакеты, и их можно игнорировать.
Предупреждение Функция
--fixэкспериментальная, используйте её на свой страх и риск; перед использованием обязательно сделайте резервные копии ваших jar-файлов.
Аргумент --fix пытается переименовать экземпляры JndiLookup.class в JndiLookup.vulne, предотвращая таким образом загрузку класса. Внутри Java-архивов это делается путём переименования на месте, не требует повторной упаковки архива и выполняется мгновенно.
Готовые бинарные файлы доступны для Linux 64bit, MS Windows 64bit и 32bit — см. Releases.
Минимальная поддерживаемая версия Python — 3.8. Согласно моему тестированию, реализация zip в Python 3.6 не может открыть многие
.jar-файлы из моих тестовых данных.
log4shell finder оптимизирован на производительность и низкое потребление памяти.
Обновлено 23.1.2022, производительность измерена на каталоге с 26237 файлами в 2005 папках.
Время выполнения сокращено вдвое, потребление памяти — на 2/3, чтение файловой системы — по крайней мере на 90%
Command being timed: "./test_log4shell.py /home/hynek/war/ --exclude-dirs /mnt --same-fs"
User time (seconds): 17.68
System time (seconds): 1.20
Percent of CPU this job got: 127%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:14.47
Maximum resident set size (kbytes): 64144
File system inputs: 114424
Command being timed: "./log4j-finder.py /home/hynek/war/"
User time (seconds): 23.59
System time (seconds): 1.09
Percent of CPU this job got: 99%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:26.18
Maximum resident set size (kbytes): 38604
File system inputs: 142824
Command being timed: "java -jar log4j-detector-latest.jar /home/hynek/war"
User time (seconds): 30.56
System time (seconds): 1.39
Percent of CPU this job got: 113%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:28.26
Maximum resident set size (kbytes): 214116
File system inputs: 14416
Command being timed: "./log4j2-scan /home/hynek/war --scan-log4j1 --scan-zip"
User time (seconds): 52.05
System time (seconds): 25.32
Percent of CPU this job got: 88%
Elapsed (wall clock) time (h:mm:ss or m:ss): 1:27.86
Maximum resident set size (kbytes): 593080
File system inputs: 215416
all--no-csv-header для исключения заголовка CSV, что упрощает объединение результатов с нескольких хостов--threads для ручной настройки количества потоков сканирования--cvs-clean для записи строки "CLEAN" в CSV-вывод, если библиотека log4j не обнаружена--cvs-stats для записи строки "STATS" в CSV-вывод с временем выполнения в секундах и количеством просканированных файлов и папок--fix в версиях 1.19 и 1.20 могла повредить .jar-архивы.За предыдущие изменения см. Примечания к выпуску