
Un scanner intelligent Log4Shell/Log4j/CVE-2021-44228
Bien que d'excellents outils aient été publiés pour aider les organisations à analyser leurs environnements à la recherche d'applications vulnérables à la faille critique Log4J / CVE-2021-44228, j'ai constaté que :
C'est ainsi qu'est né Log4Shell Sentinel. Log4Shell Sentinel est un scanner basé sur les fichiers doté de fonctionnalités uniques. Il n'a pas vocation à remplacer tous les autres outils disponibles mais peut les compléter.
Log4Shell Sentinel est un scanner basé sur les fichiers. Il recherche les applications basées sur Java en analysant un système cible à la recherche d'artefacts des formats de fichiers suivants :
| Type de fichier | Détails |
|---|---|
| Jar simple | C'est le cas où le fichier log4j-core n'est pas intégré. |
| Fat / Uber jar | Un uber jar est un jar qui contient à la fois vos classes / packages et toutes les dépendances de votre application (bibliothèques, ressources et fichiers de métadonnées) dans un seul fichier jar. C'est l'option de déploiement la plus couramment utilisée. |
| WAR | Un fichier war (Web Application Archive) est un fichier qui contient votre code JSP, HTML et JavaScript en plus de vos bibliothèques et autres ressources. Ce format est moins couramment utilisé. |
| EAR | Un ear (Enterprise Application Archive) est un autre format qui était plus couramment utilisé avec Jakarta EE pour les déploiements. |
et recherche les instances de jars log4j-core vulnérables. Ensuite, il :
calcule une empreinte MD5 de l'artefact. Cela permet à un analyste d'identifier la même application exécutée sur différentes machines / conteneurs et de la traiter comme une seule découverte
pour les fichiers identifiés comme appartenant à un conteneur, tels que : /var/lib/docker/overlay2/192768f471818601094bf4edd96d14bfc0e2b178a04a2efd00b2231ad4e46b33/merged/app/spring-boot-application.jar, il fait le gros du travail en mappant le fichier vers l'image correspondante. Par exemple, il traduirait le chemin ci-dessus en l'image suivante : ghcr.io/christophetd/log4shell-vulnerable-app:latest. Étant donné que les différents runtimes de conteneurs stockent ce mappage de différentes manières, cela peut éviter des heures de frustration à un analyste. Cela permet également à un analyste de traiter un certain nombre de conteneurs exécutant une seule application comme une seule découverte
il supprime les correspondances inutiles, telles que les correspondances relatives à des conteneurs actuellement non exécutés, y compris les images en cache. Cela permet à un analyste de se concentrer sur l'essentiel et lui évite encore des heures de travail inutile
il permet à un analyste d'ignorer des correspondances en fonction de :
Cela permet à l'analyste de supprimer les applications dont il sait qu'elles ne sont pas vulnérables ou qui correspondent à des applications basées sur une interface en ligne de commande (CLI) ne présentant pas de menace. Par exemple, si une instance de Logstash est détectée, un analyste peut choisir de l'ignorer s'il n'exécute pas l'outil ou s'il l'exécute simplement occasionnellement en ligne de commande.
il est optimisé pour fonctionner avec vos outils de gestion de configuration tels qu'Ansible, vous donnant la possibilité d'analyser rapidement votre environnement en quelques minutes
Pour plus de détails sur l'enrichissement des métadonnées ajouté par Log4Shell Sentinel, consultez mon article de blog post.
Le moyen le plus simple est de télécharger le binaire pré-compilé.
Là encore, c'est simple. Cependant, vous voudrez probablement compiler une version statique pour contourner les éventuelles variations liées à GLIBC dans votre environnement. L'outil utilise les modules suivants qui utilisent CGO par défaut :
os/usernetPour compiler une version statique qui utilise les versions Go de ces bibliothèques, clonez simplement le dépôt puis exécutez :
$ CGO_ENABLED=0 go build -ldflags="-s -w"
$ ldd log4shell_sentinel
not a dynamic executable
$ ./log4shell_sentinel -h
NAME:
Log4Shell Sentinel - by Osama Elnaggar
USAGE:
log4shell_sentinel [global options] command [command options] [arguments...]
VERSION:
v1.0.0
COMMANDS:
help, h Shows a list of commands or help for one command
GLOBAL OPTIONS:
--path value, -p value Path to search (default: ".")
--no-banner, --nb Suppress banner (default: false)
--no-messages, --nm Suppress messages except for CSV output (default: false)
--no-header, --nh Suppress header in CSV output (default: false)
--imd5 value, --im value Ignore MD5 hashes. Refer to the GitHub page for expected format
--ipath value, --ip value Ignore file path matches. Refer to the GitHub page for expected format
--icimage value, --ic value Ignore container image matches. Refer to the GitHub page for expected format
--print-headers, --ph Print CSV Headers only (default: false)
--help, -h show help (default: false)
--version, -v print the version (default: false)
Par défaut, une analyse se contente d'analyser le répertoire courant. Par exemple :
$ ./log4shell_sentinel
░█░░░█▀█░█▀▀░█░█░█▀▀░█░█░█▀▀░█░░░█░░░░░█▀▀░█▀▀░█▀█░▀█▀░▀█▀░█▀█░█▀▀░█░░
░█░░░█░█░█░█░░▀█░▀▀█░█▀█░█▀▀░█░░░█░░░░░▀▀█░█▀▀░█░█░░█░░░█░░█░█░█▀▀░█░░
░▀▀▀░▀▀▀░▀▀▀░░░▀░▀▀▀░▀░▀░▀▀▀░▀▀▀░▀▀▀░░░▀▀▀░▀▀▀░▀░▀░░▀░░▀▀▀░▀░▀░▀▀▀░▀▀▀
- A CVE-2021-44228/CVE-2021-45046/CVE-2021-45105 Scanner
- v1.0.0
- by Osama Elnaggar
[*] WARNING: Running as non-root user.
Non-readable files / dirs will be skipped
Container mapping will fail
[*] Starting shallow scan ............ [DONE]
[*] Starting deep scan ............... [DONE]
[*] Calculating MD5 hashes ........... [DONE]
[*] Performing container image lookups [DONE]
[*] Processing ignore list(s) ........ [DONE]
[*] Generating output ................ [DONE]
IP,Hostname,AppName,Team,Ignore (Y/N),Comments,MD5Hash,Timestamp,Container,ContainerImage,FullPath,Version
192.168.121.121,server3,,,,,4e615cd580758b70c49ade1f79103328,2021-12-21T07:38:09Z,true,ghcr.io/christophetd/log4shell-vulnerable-app:latest,/run/containerd/io.containerd.runtime.v2.task/k8s.io/dc2c9c214809f506283c917244cd126a9b056ac7274322d12b59c9196d95dd9b/rootfs/app/spring-boot-application.jar,log4j-core-2.14.1.jar
Vous obtiendrez immédiatement un AVERTISSEMENT si vous l'exécutez en tant qu'utilisateur non-root, car il nécessite les permissions root :
Il fonctionnera toujours sans privilèges root mais pourrait ne pas vous donner les meilleurs résultats.
Un exemple de découverte ressemble à ceci :
IP,Hostname,AppName,Team,Ignore (Y/N),Comments,MD5Hash,Timestamp,Container,ContainerImage,FullPath,Version
192.168.121.121,server3,,,,,4e615cd580758b70c49ade1f79103328,2021-12-21T07:38:09Z,true,ghcr.io/christophetd/log4shell-vulnerable-app:latest,/run/containerd/io.containerd.runtime.v2.task/k8s.io/dc2c9c214809f506283c917244cd126a9b056ac7274322d12b59c9196d95dd9b/rootfs/app/spring-boot-application.jar,log4j-core-2.14.1.jar
Certains champs sont volontairement laissés vides pour que l'analyste les remplisse dans Excel, etc. Une brève description de chaque champ est présentée ci-dessous :
L'outil est fourni avec les options suivantes :
L'une des fonctionnalités uniques de Log4Shell Sentinel, que l'on ne trouve dans aucun autre outil, est la capacité à traduire les jars trouvés lors des analyses du système de fichiers, tels que :
/var/lib/docker/overlay2/192768f471818601094bf4edd96d14bfc0e2b178a04a2efd00b2231ad4e46b33/merged/app/spring-boot-application.jar
vers l'image de conteneur correspondante (le chemin ci-dessus se traduit par exemple par ghcr.io/christophetd/log4shell-vulnerable-app:latest). Étant donné que les différents runtimes de conteneurs stockent ce mappage de différentes manières, cela peut éviter des heures de frustration à un analyste. Cela permet également à un analyste de traiter un certain nombre de conteneurs exécutant une seule application comme une seule découverte. La solution prend actuellement en charge les recherches suivantes :
Le nombre d'applications identifiées peut au départ sembler écrasant, ou vous pouvez vouloir vous concentrer d'abord sur un sous-ensemble donné d'applications identifiées, comme celles exposées aux utilisateurs externes. Vous pouvez également vouloir vous concentrer sur un périmètre de conformité donné. Pour prendre en charge cela, l'application permet de spécifier une liste. Log4Shell prend actuellement en charge 3 listes d'ignorés :
Au lieu de simples listes, il attend un fichier CSV en entrée. Cela encourage l'analyste à documenter la raison pour laquelle il ignore une découverte donnée, à mesure qu'il traite les découvertes et identifie les applications non vulnérables à l'aide d'une analyse manuelle ou automatisée du code source, d'outils DAST, etc.
La liste est un simple fichier CSV au format suivant :
MD5Sum,AppName,Reason
Les colonnes AppName et Reason peuvent être vides mais sont là pour vous permettre de garder une trace de la raison pour laquelle vous incluez ou excluez des applications spécifiques.
REMARQUE Comme cette fonctionnalité utilise l'empreinte MD5 calculée pour l'application, elle ne fonctionnera que pour les applications qui sont des fat / uber jars, des EAR ou des WAR.
Par exemple, si nous avions la découverte suivante :
IP,Hostname,AppName,Team,Ignore (Y/N),Comments,MD5Hash,Timestamp,Container,ContainerImage,FullPath,Version
192.168.121.121,server3,,,,,4e615cd580758b70c49ade1f79103328,2021-12-21T07:38:09Z,true,ghcr.io/christophetd/log4shell-vulnerable-app:latest,/run/containerd/io.containerd.runtime.v2.task/k8s.io/dc2c9c214809f506283c917244cd126a9b056ac7274322d12b59c9196d95dd9b/rootfs/app/spring-boot-application.jar,log4j-core-2.14.1.jar
et que nous déterminions que l'application n'est pas vulnérable, nous pouvons simplement enregistrer ce qui suit dans hashes.csv :
4e615cd580758b70c49ade1f79103328,Demo App,Not vulnerable
puis la relancer :
# ./log4shell_sentinel --im hashes.csv --path /
la découverte ci-dessus serait supprimée.
La liste est un simple fichier CSV au format suivant :
Container Image,AppName,Reason
En poursuivant avec l'exemple précédent, nous pouvons lui demander d'ignorer toute découverte dont l'image du conteneur est : ghcr.io/christophetd/log4shell-vulnerable-app:latest en créant un fichier images.csv comme celui-ci :
ghcr.io/christophetd/log4shell-vulnerable-app:latest,,
puis en l'exécutant ainsi :
# ./log4shell_sentinel --ic images.csv -p /
Là encore, notre découverte précédente serait supprimée.
Là encore, il s'agit d'un simple fichier CSV au format suivant :
Path,AppName,Reason
En utilisant l'exemple ci-dessus, si nous créons le fichier paths.csv suivant :
/run/containerd/io.containerd.runtime.v2.task/k8s.io/dc2c9c214809f506283c917244cd126a9b056ac7274322d12b59c9196d95dd9b/rootfs/app/spring-boot-application.jar,Demo App,Not vulnerable
la découverte précédente serait supprimée.
AVERTISSEMENT Dans la mesure du possible, il est préférable d'utiliser une empreinte MD5 ou le nom de l'image du conteneur pour la suppression, car le chemin peut ne pas être unique.
Bien qu'il soit parfaitement acceptable d'exécuter Log4Shell Sentinel sur un seul serveur, il révèle tout son potentiel lorsqu'il est combiné avec votre outil de gestion de configuration préféré (Ansible, Chef, Puppet, Salt, AWS SSM, etc.) ou même avec de simples outils SSH parallèles tels que parellel-ssh.
Cela vous apporte de nombreux avantages, notamment :
Pour un exemple complet de cette mise en œuvre, consultez mon article de blog post.
Reportez-vous à la section Analyse à grande échelle de votre environnement.
root (il nécessite l'accès à l'emplacement où vos applications peuvent être installées), soit au fait de ne pas avoir spécifié le bon path. Il est recommandé de l'exécuter en tant qu'utilisateur root et de définir --path /.Depuis la v1.0.0, l'outil prend actuellement en charge le mappage pour les éléments suivants :
Si vous utilisez autre chose, le mappage ne fonctionnera pas. Si vous utilisez l'un des éléments ci-dessus, il se peut que vous n'exécutiez pas l'outil en tant qu'utilisateur root ou que le socket / les fichiers utilisés se trouvent dans un emplacement non standard.
Développé par : Osama Elnaggar
| Champ | Exemple | Description |
|---|
| IP | 192.168.121.121 | Si l'instance possède plusieurs adresses IP, l'adresse IP principale est ajoutée |
| Hostname | server3 | Nom d'hôte |
| AppName | Ce champ est laissé à l'utilisateur pour être complété après l'analyse | |
| Team | Ce champ est laissé à l'utilisateur pour être complété après l'analyse | |
| Ignore (Y/N) | Ce champ est laissé à l'utilisateur pour être complété après l'analyse | |
| Comment | Ce champ est laissé à l'utilisateur pour être complété après l'analyse | |
| MD5Hash | 4e615cd580758b70c49ade1f79103328 | Une empreinte unique de notre application |
| Timestamp | 2021-12-21T07:38:09Z | Un horodatage indiquant quand l'analyse a été effectuée. Utile si vous souhaitez regrouper plusieurs analyses du même hôte |
| Container | true | true = il s'agit d'un conteneur |
| ContainerImage | ghcr.io/christophetd/log4shell-vulnerable-app:latest | Si un conteneur a été détecté, il s'agit de l'image correspondante |
| FullPath | /run/containerd/io.containerd. runtime.v2.task/k8s.io/.../spring-boot-application.jar | Le chemin complet de la découverte. Dans cet exemple, le fichier JAR vulnérable fait partie d'un fat / uber jar |
| Version | log4j-core-2.14.1.jar | La version de log4j-core détectée |
| Option | Détails |
|---|
--path value, -p value | Spécifie les chemins à analyser. Par défaut, il analyse le répertoire courant. IMPORTANT Il est recommandé de définir cette valeur sur / pour couvrir l'intégralité de votre système de fichiers |
--no-banner, --nb | Supprime la bannière |
--no-messages, --nm | Supprime les messages, tels que les messages liés à la progression |
--no-header, --nh | Supprime l'en-tête de la sortie CSV. Recommandé lors d'une exécution sur plusieurs serveurs |
--imd5 value, --im value | Ignore les empreintes MD5. Plus de détails dans la section Listes d'ignorés |
--ipath value, --ip value | Ignore les correspondances de chemins de fichiers. Plus de détails dans la section Listes d'ignorés |
--icimage value, --ic value | Ignore les correspondances d'images de conteneurs. Plus de détails dans la section Listes d'ignorés |
--print-headers, --ph | Affiche uniquement les en-têtes CSV. Lorsque vous exécutez Log4Shell Sentinel sur plusieurs serveurs et regroupez les résultats, vous désactivez généralement la sortie des en-têtes. Cette commande génère uniquement l'en-tête afin que vous puissiez l'ajouter à votre feuille Excel |