
Encuentra versiones vulnerables de Log4j2 en el disco y también dentro de archivos Java Archive (Log4Shell CVE-2021-44228, CVE-2021-45046, CVE-2021-45105)
Un script en Python3 para escanear el sistema de archivos y encontrar Log4j2 vulnerable a Log4Shell (CVE-2021-44228 y CVE-2021-45046 y CVE-2021-45105).
Escanea recursivamente tanto en disco como dentro de archivos Java Archive (JAR) (anidados).

log4j-finder identifica librerías log4j2 en tu sistema de archivos usando una lista de hashes MD5 conocidos como malos y conocidos como buenos de archivos específicos (actualmente solo JndiManager.class) presentes en los paquetes log4j2-core-*; el paquete principal afectado por log4shell. Busca estos archivos dentro de archivos Java Archive y en el sistema de archivos. La versión de se identifica entonces basándose en el hash MD5 de este archivo.
log4j2Para optimizar la velocidad de escaneo, busca en el sistema de archivos y procesa SOLO los siguientes nombres de archivo:
Java ARchive en el nombre (también anidados en estos archivos):
*.jar, *.war, *.earJndiManager.classSi el archivo coincide con una de las extensiones mencionadas anteriormente, se revisará dentro de estos archivos (todo en memoria, no se descomprime nada) para buscar los nombres de archivo para los que el script tiene hashes conocidos. También busca dentro de archivos anidados, por ejemplo, un archivo JAR dentro de un archivo WAR.
El script NO escanea otras extensiones de archivos comprimidos como 7z, RAR, TAR, BZ2, etc. Así que, por ejemplo, si un archivo JAR está dentro de un archivo 7z, el script no lo encontrará. La razón es que Java solo puede cargar formatos Java ARchive, por lo que solo escaneamos esos.
Los hashes MD5 desconocidos se muestran como UNKNOWN; esto podría ocurrir si un paquete Java que no es log4j2 usa el mismo nombre de archivo que este script busca.
Lo más probable es que no sea log4j2 si la ruta de archivo identificada no contiene referencias a org/apache/logging/log4j. Sin embargo, se recomienda una verificación manual.
Puedes instalar log4j-finder usando uno de los siguientes métodos:
Puedes descargar el binario correcto para tu sistema operativo:
Si estás en Linux, también puedes descargar la última versión y ejecutarla usando una de las siguientes formas:
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
Para distribuciones con Python 3.6+ instalado, uno de los siguientes métodos también funciona:
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
Hay una GitHub Action en el repositorio que genera automáticamente un binario de Windows y uno de Linux del script log4j-finder.py usando PyInstaller en cada commit. Los artefactos de compilación de estas ejecuciones del flujo de trabajo se usan para adjuntarlos a la página de Releases.
Somos conscientes de que a algunos proveedores de antivirus no les gustan los binarios de Windows; en ese caso, recomendamos generar el ejecutable tú mismo siguiendo los siguientes pasos (ten en cuenta que ahora también proporcionamos binarios firmados).
Si no tienes Python 3.6 o superior instalado, descárgalo primero desde https://www.python.org/downloads/
Python 3.8.10 si quieres que tu binario funcione en Windows 7:
Add Python 3.x to PATH, esto hace que los siguientes pasos sean mucho más fáciles.Abre un símbolo del sistema y usa pip para instalar el paquete pyinstaller:
pip install pyinstaller
# En la salida verás dónde está instalado pyinstaller, por ejemplo:
# C:\Users\User\AppData\Roaming\Python\Python310\Scripts
#
# Verifícalo usando --version
C:\Users\User\AppData\Roaming\Python\Python310\Scripts\pyinstaller.exe --version
4.7
Opcionalmente, instala el paquete colorama para añadir soporte de colores:
pip install colorama
Descarga la última versión del script log4j-finder.py y luego ejecuta PyInstaller:
pyinstaller --onefile --hidden-import colorama log4j-finder.py
El ejecutable de Windows está entonces en el directorio dist: dist\log4j-finder.exe
Ejemplo dado para Debian 11:
# Instala PyInstaller usando pip3
sudo apt update
sudo apt install python3-pip git
pip3 install --user pyinstaller
# Git clone y compila usando PyInstaller
git clone https://github.com/fox-it/log4j-finder
cd log4j-finder
~/.local/bin/pyinstaller --onefile log4j-finder.spec
# Verifica que el binario funciona
./dist/log4j-finder --help
Ejemplo de uso para escanear una ruta (por defecto /):
$ python3 log4j-finder.py /path/to/scan
O directamente un archivo JAR:
$ python3 log4j-finder.py /path/to/jarfile.jar
O múltiples directorios y/o archivos:
$ python3 log4j-finder.py /path/to/dir1 /path/to/dir2 /path/to/jarfile.jar
Excluir archivos o directorios:
$ python3 log4j-finder.py / --exclude "/*/.dontgohere" --exclude "/home/user/*.war"
Ten en cuenta que en Windows solo escanea la unidad raíz c:\ si no proporcionas argumentos adicionales.
Recomendamos especificar en la línea de comandos las unidades que necesitas escanear, como por ejemplo (las unidades que no existen se omiten):
log4j-finder.exe c:\ d:\ e:\ f:\
Los archivos o directorios a los que no se puede acceder (errores de Permiso denegado) no se muestran.
Si quieres ver más salida, puedes usar el flag -v para modo verboso, o -vv para modo depuración (solo recomendado para fines de depuración).
Argumentos de la aplicación:
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)
Los archivos se escanean recursivamente, tanto en disco como en archivos Java Archive (anidados).