
Encontre versões vulneráveis do Log4j2 no disco e também dentro de arquivos Java Archive (Log4Shell CVE-2021-44228, CVE-2021-45046, CVE-2021-45105)
Um script Python3 para escanear o sistema de arquivos para encontrar Log4j2 que é vulnerável ao Log4Shell (CVE-2021-44228 & CVE-2021-45046 & CVE-2021-45105).
Ele escaneia recursivamente tanto no disco quanto dentro de arquivos Java Archive (JARs) aninhados.

O log4j-finder identifica bibliotecas log4j2 no seu sistema de arquivos usando uma lista de hashes MD5 conhecidos como ruins e conhecidos como bons de arquivos específicos (atualmente apenas JndiManager.class) presentes nos pacotes log4j2-core-*; o pacote principal afetado pelo log4shell. Ele procura por esses arquivos dentro de arquivos Java Archive e no sistema de arquivos. A versão do é então identificada com base no hash MD5 desse arquivo.
log4j2Para otimizar a velocidade de varredura, ele escaneia o sistema de arquivos e processa APENAS os seguintes nomes de arquivo:
Java ARchive no nome do arquivo (também aninhados nesses arquivos):
*.jar, *.war, *.earJndiManager.classSe o arquivo corresponder a uma das extensões mencionadas acima, ele verificará dentro desses arquivos (tudo em memória, nada é descompactado) para procurar os nomes de arquivo para os quais o script tem hashes conhecidos. Ele também procura dentro de arquivos aninhados, por exemplo, um arquivo JAR dentro de um arquivo WAR.
O script NÃO escaneia outras extensões de arquivo de arquivamento como 7z, RAR, TAR, BZ2, etc. Então, por exemplo, se um arquivo JAR estiver dentro de um arquivo 7z, o script não o encontrará. A lógica é que o Java só pode carregar formatos Java ARchive, então escaneamos apenas esses.
Hashes MD5 desconhecidos são mostrados como UNKNOWN; isso pode acontecer se um pacote Java que não é log4j2 usar o mesmo nome de arquivo que este script procura. Muito provavelmente não é log4j2 se o caminho do arquivo identificado não contiver referências a org/apache/logging/log4j. No entanto, a verificação manual ainda é recomendada.
Você pode instalar o log4j-finder usando um dos seguintes métodos:
Você pode baixar o binário correto para o seu sistema operacional:
Se você estiver no Linux, também pode baixar a última versão e executar usando uma das seguintes 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 distribuição com Python 3.6+ instalado, um dos seguintes métodos também 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
Há uma GitHub Action no repositório que gera automaticamente um binário para Windows e Linux do script log4j-finder.py usando PyInstaller a cada commit. Os artefatos de build dessas execuções de workflow são usados para anexar à página de Releases.
Estamos cientes de que alguns fornecedores de antivírus não gostam dos binários do Windows; nesse caso, recomendamos gerar o executável você mesmo usando os seguintes passos (note que agora também fornecemos binários assinados).
Se você não tiver Python 3.6 ou superior instalado, baixe-o primeiro de https://www.python.org/downloads/
Python 3.8.10 se quiser que seu binário funcione no Windows 7:
Add Python 3.x to PATH, isso torna os próximos passos muito mais fáceis.Abra um prompt de comando e use pip para instalar o pacote pyinstaller:
pip install pyinstaller
# Na saída, você verá onde o pyinstaller está instalado, por exemplo:
# C:\Users\User\AppData\Roaming\Python\Python310\Scripts
#
# Verifique usando --version
C:\Users\User\AppData\Roaming\Python\Python310\Scripts\pyinstaller.exe --version
4.7
Opcionalmente, instale o pacote colorama para adicionar suporte a cores:
pip install colorama
Baixe a versão mais recente do script log4j-finder.py e depois execute o PyInstaller:
pyinstaller --onefile --hidden-import colorama log4j-finder.py
O executável do Windows estará então no diretório dist: dist\log4j-finder.exe
Exemplo dado para 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
Exemplo de uso para escanear um caminho (padrão é /):
$ python3 log4j-finder.py /path/to/scan
Ou diretamente um arquivo JAR:
$ python3 log4j-finder.py /path/to/jarfile.jar
Ou múltiplos diretórios e/ou arquivos:
$ python3 log4j-finder.py /path/to/dir1 /path/to/dir2 /path/to/jarfile.jar
Excluir arquivos ou diretórios:
$ python3 log4j-finder.py / --exclude "/*/.dontgohere" --exclude "/home/user/*.war"
Note que no Windows ele escaneia apenas a raiz c:\ se você não fornecer argumentos extras. Recomendamos especificar as unidades que você precisa escanear na linha de comando, como (unidades que não existem são ignoradas):
log4j-finder.exe c:\ d:\ e:\ f:\
Arquivos ou diretórios que não podem ser acessados (erros de permissão negada) não são exibidos.
Se quiser ver mais saída, você pode usar a flag -v para verbose, ou -vv para modo debug (recomendado apenas para fins de depuração).
Argumentos da aplicação:
argumentos posicionais:
PATH Diretório ou arquivo(s) para escanear (recursivamente) (padrão:
['/'])
argumentos opcionais:
-h, --help mostra esta mensagem de ajuda e sai
-v, --verbose saída detalhada (-v é info, -vv é debug) (padrão: 0)
-n, --no-color desabilita saída colorida (padrão: False)
-q, --quiet fica mais silencioso, desabilita banner e resumo (padrão:
False)
-b, --no-banner desabilita banner (padrão: False)
-V, --version mostra o número da versão do programa e sai
-e PATTERN, --exclude PATTERN
exclui arquivos/diretórios por padrão (pode ser usado
várias vezes) (padrão: None)
Arquivos são escaneados recursivamente, tanto no disco quanto em arquivos Java Archive aninhados.