
Uno Scanner intelligente per Log4Shell/Log4j/CVE-2021-44228
Sebbene siano stati rilasciati alcuni strumenti eccellenti per aiutare le organizzazioni a scansionare i propri ambienti alla ricerca di applicazioni vulnerabili alla critica vulnerabilità Log4J / CVE-2021-44228, ho ritenuto che:
Così è nato Log4Shell Sentinel. Log4Shell Sentinel è uno scanner basato su file con alcune caratteristiche uniche. Non intende sostituire tutti gli altri strumenti disponibili, ma può integrarli.
Log4Shell Sentinel è uno scanner basato su file. Cerca applicazioni Java-based scandagliando un sistema target alla ricerca di artefatti nei seguenti formati di file:
| Tipo di file | Dettagli |
|---|---|
| Simple jar | Caso in cui il file log4j-core non è incorporato. |
| Fat / Uber jar | Un uber jar è un jar che contiene sia le tue classi/pacchetto che tutte le dipendenze dell'applicazione (librerie, risorse e file metadati) all'interno di un unico file jar. Questa è l'opzione di deployment più comune. |
| WAR | Un file war (Web Application Archive) contiene codice JSP, HTML e JavaScript oltre alle librerie e altre risorse. Questo formato è meno comune. |
| EAR | Un file ear (Enterprise Application Archive) è un altro formato che era più comune con Jakarta EE per i deployment. |
e cerca istanze di jar log4j-core vulnerabili. Quindi:
calcola un hash MD5 dell'artefatto. Ciò consente a un analista di identificare la stessa applicazione in esecuzione su macchine/container diversi e trattarla come un unico risultato
per i file determinati come appartenenti a un container, ad esempio: /var/lib/docker/overlay2/192768f471818601094bf4edd96d14bfc0e2b178a04a2efd00b2231ad4e46b33/merged/app/spring-boot-application.jar, esegue il lavoro pesante di mappare il file all'immagine corrispondente. Ad esempio, tradurrebbe quanto sopra nell'immagine: ghcr.io/christophetd/log4shell-vulnerable-app:latest. Poiché i vari runtime dei container memorizzano questa mappatura in modi diversi, ciò può far risparmiare ore di frustrazione a un analista. Inoltre consente a un analista di trattare un certo numero di container che eseguono una singola applicazione come un unico risultato.
rimuove corrispondenze inutili come quelle relative a container attualmente non in esecuzione, incluse immagini in cache. Ciò consente all'analista di concentrarsi su ciò che è importante e risparmia ore di lavoro inutili
consente a un analista di ignorare corrispondenze in base a:
Ciò permette all'analista di rimuovere applicazioni che sa non essere vulnerabili o che corrispondono ad applicazioni da riga di comando che non rappresentano una minaccia. Ad esempio, se viene rilevata un'istanza di Logstash, un analista può scegliere di ignorarla se non utilizza lo strumento o lo esegue occasionalmente da riga di comando.
è ottimizzato per funzionare con i tuoi strumenti di configuration management come Ansible, dandoti la possibilità di scansionare rapidamente il tuo ambiente in pochi minuti
Per i dettagli sull'arricchimento dei metadati aggiunto da Log4Shell Sentinel, consulta il mio post sul blog.
Il modo più semplice è scaricare direttamente il binario precompilato.
Anche questo è semplice. Tuttavia, probabilmente vorrai compilare una versione staticamente collegata per evitare variazioni legate a GLIBC nel tuo ambiente. Lo strumento utilizza i seguenti moduli che usano CGO per default:
os/usernetPer compilare una versione staticamente collegata che utilizzi le versioni Go di queste librerie, basta clonare il repository e poi eseguire:
$ 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)
Di default, una scansione analizzerà semplicemente la directory corrente. Ad esempio:
$ ./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
Riceverai immediatamente un WARNING se lo esegui come utente non-root poiché richiede permessi di root:
Funzionerà comunque senza privilegi di root ma potrebbe non darti i migliori risultati.
Un esempio di risultato è:
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
Alcuni campi sono intenzionalmente lasciati vuoti perché l'analista li compili in Excel, ecc. Una breve descrizione di ciascun campo è riportata di seguito:
Lo strumento offre le seguenti opzioni:
Una delle caratteristiche uniche di Log4Shell Sentinel, non presente in nessun altro strumento, è la capacità di tradurre jar trovati in scansioni del filesystem, come:
/var/lib/docker/overlay2/192768f471818601094bf4edd96d14bfc0e2b178a04a2efd00b2231ad4e46b33/merged/app/spring-boot-application.jar
nell'immagine container corrispondente (l'esempio sopra si traduce ad esempio in ghcr.io/christophetd/log4shell-vulnerable-app:latest). Poiché i vari runtime dei container memorizzano questa mappatura in modi diversi, ciò può far risparmiare ore di frustrazione a un analista. Inoltre consente a un analista di trattare un certo numero di container che eseguono una singola applicazione come un unico risultato. La soluzione attualmente supporta le seguenti ricerche:
Il numero di applicazioni identificate potrebbe inizialmente sembrare schiacciante, oppure potresti volerti concentrare su un dato sottoinsieme di applicazioni identificate, come quelle esposte per prime agli utenti esterni. Oppure potresti volerti concentrare su un dato perimetro di conformità. Per supportare ciò, l'applicazione supporta la specifica di una lista. Log4Shell attualmente supporta 3 liste di ignorati:
Invece di semplici liste, si aspetta un file CSV come input. Ciò incoraggia l'analista a documentare perché ignora un dato risultato. Man mano che l'analista elabora i risultati e identifica applicazioni non vulnerabili tramite analisi manuale o automatizzata del codice sorgente o strumenti DAST, ecc.
La lista è un semplice file CSV nel seguente formato:
MD5Sum,AppName,Reason
Le colonne AppName e Reason possono essere vuote, ma sono lì per tenere traccia del motivo per cui includi o escludi determinate applicazioni.
NOTA Poiché questa funzionalità utilizza l'hash MD5 calcolato per l'applicazione, funzionerà solo per applicazioni che sono fat/uber jar, EAR o WAR.
Ad esempio, se avessimo il seguente risultato:
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
e avessimo determinato che l'applicazione non è vulnerabile, possiamo semplicemente salvare quanto segue in hashes.csv:
4e615cd580758b70c49ade1f79103328,Demo App,Not vulnerable
e poi rieseguire:
# ./log4shell_sentinel --im hashes.csv --path /
il risultato sopra verrebbe soppresso.
La lista è un semplice file CSV nel seguente formato:
Container Image,AppName,Reason
Basandoci sull'esempio precedente, possiamo dirgli di ignorare qualsiasi risultato in cui l'immagine container è: ghcr.io/christophetd/log4shell-vulnerable-app:latest creando un file images.csv come questo:
ghcr.io/christophetd/log4shell-vulnerable-app:latest,,
e poi eseguendo:
# ./log4shell_sentinel --ic images.csv -p /
Ancora una volta, il nostro risultato precedente verrebbe soppresso.
Anche questa è un semplice file CSV nel seguente formato:
Path,AppName,Reason
Utilizzando l'esempio sopra, se creiamo il seguente file paths.csv:
/run/containerd/io.containerd.runtime.v2.task/k8s.io/dc2c9c214809f506283c917244cd126a9b056ac7274322d12b59c9196d95dd9b/rootfs/app/spring-boot-application.jar,Demo App,Not vulnerable
il risultato precedente verrebbe soppresso.
ATTENZIONE Quando possibile, è meglio usare un hash MD5 o il nome dell'immagine container per la soppressione, poiché il percorso potrebbe non essere univoco.
Sebbene sia perfettamente accettabile eseguire Log4Shell Sentinel su un singolo server, dà il meglio di sé quando combinato con il tuo strumento di configuration management preferito (Ansible, Chef, Puppet, Salt, AWS SSM, ecc.) o anche con semplici strumenti SSH paralleli come parellel-ssh.
Questo ti offre numerosi vantaggi, tra cui:
Per un esempio completo di questo in azione, consulta il mio post sul blog.
Fare riferimento alla sezione Scansione di massa del tuo ambiente.
root (richiede accesso a dove potrebbero essere installate le tue applicazioni) o di non aver specificato il path corretto. Si consiglia di eseguirlo come utente root e impostare --path /A partire dalla v1.0.0, lo strumento attualmente supporta la mappatura per:
Se stai usando qualcos'altro, la mappatura non funzionerà. Se stai usando uno dei precedenti, potrebbe dipendere dal fatto che non stai eseguendo lo strumento come utente root o che il socket/i file utilizzati si trovano in una posizione non predefinita.
Sviluppato da: Osama Elnaggar
| Campo | Esempio | Descrizione |
|---|
| IP | 192.168.121.121 | Se l'istanza ha più IP, viene aggiunto l'IP primario |
| Hostname | server3 | Nome host |
| AppName | Lasciato all'utente dopo il completamento della scansione | |
| Team | Lasciato all'utente dopo il completamento della scansione | |
| Ignore (Y/N) | Lasciato all'utente dopo il completamento della scansione | |
| Comment | Lasciato all'utente dopo il completamento della scansione | |
| MD5Hash | 4e615cd580758b70c49ade1f79103328 | Impronta digitale univoca dell'applicazione |
| Timestamp | 2021-12-21T07:38:09Z | Timestamp di quando è stata eseguita la scansione. Utile per aggregare più scansioni dello stesso host |
| Container | true | True = si tratta di un container |
| ContainerImage | ghcr.io/christophetd/log4shell-vulnerable-app:latest | Se è stato rilevato un container, questa è l'immagine corrispondente |
| FullPath | /run/containerd/io.containerd. runtime.v2.task/k8s.io/.../spring-boot-application.jar | Percorso completo del risultato. In questo esempio, il JAR vulnerabile fa parte di un fat/uber jar |
| Version | log4j-core-2.14.1.jar | Versione di log4j-core rilevata |
| Opzione | Dettagli |
|---|
--path value, -p value | Specifica quali percorsi cercare. Di default cerca nella directory corrente. IMPORTANTE Si consiglia di impostarlo su / per coprire l'intero filesystem |
--no-banner, --nb | Sopprime il banner |
--no-messages, --nm | Sopprime messaggi come quelli di avanzamento |
--no-header, --nh | Sopprime l'intestazione dell'output CSV. Consigliato quando si esegue su più server |
--imd5 value, --im value | Ignora hash MD5. Maggiori dettagli nella sezione Ignore Lists |
--ipath value, --ip value | Ignora corrispondenze di percorso file. Maggiori dettagli nella sezione Ignore Lists |
--icimage value, --ic value | Ignora corrispondenze di immagine container. Maggiori dettagli nella sezione Ignore Lists |
--print-headers, --ph | Stampa solo le intestazioni CSV. Quando esegui Log4Shell Sentinel su più server e aggreghi i risultati, di solito disabiliti l'intestazione. Questo comando produce solo l'intestazione in modo da poterla aggiungere al tuo foglio Excel |