
Ein intelligenter Log4Shell/Log4j/CVE-2021-44228-Scanner
Obwohl es bereits einige hervorragende Tools gibt, die Unternehmen dabei helfen, ihre Umgebungen nach Anwendungen zu durchsuchen, die anfällig für die kritische Log4J / CVE-2021-44228-Sicherheitslücke sind, fand ich, dass:
So wurde Log4Shell Sentinel geboren. Log4Shell Sentinel ist ein dateibasierter Scanner mit einigen einzigartigen Funktionen. Es soll nicht alle anderen verfügbaren Tools ersetzen, sondern kann sie ergänzen.
Log4Shell Sentinel ist ein dateibasierter Scanner. Er durchsucht ein Zielsystem nach Java-basierten Anwendungen, indem er nach Artefakten der folgenden Dateiformate sucht:
| Dateityp | Details |
|---|
| Einfaches jar | Dies ist der Fall, wenn die log4j-core-Datei nicht eingebettet ist. |
| Fat / Uber jar | Ein Uber jar ist ein Jar, das sowohl Ihre Klassen / Ihr Paket als auch alle Abhängigkeiten Ihrer Anwendung (Bibliotheken, Ressourcen und Metadatendateien) in einer einzigen Jar-Datei enthält. Dies ist die am häufigsten verwendete Bereitstellungsoption. |
| WAR | Eine war (Web Application Archive) -Datei ist eine Datei, die Ihren JSP-, HTML- und JavaScript-Code zusätzlich zu Ihren Bibliotheken und anderen Ressourcen enthält. Dieses Format wird seltener verwendet. |
| EAR | Ein ear (Enterprise Application Archive) ist ein weiteres Format, das früher häufiger bei Jakarta EE für Bereitstellungen verwendet wurde. |
und sucht nach Instanzen von anfälligen log4j-core-Jars. Anschließend:
berechnet es einen MD5-Hash des Artefakts. Dies ermöglicht es einem Analysten, dieselbe Anwendung, die auf verschiedenen Rechnern/Containern läuft, zu identifizieren und als einen einzigen Fund zu behandeln
führt es für Dateien, die als zu einem Container gehörend erkannt wurden (z. B.: /var/lib/docker/overlay2/192768f471818601094bf4edd96d14bfc0e2b178a04a2efd00b2231ad4e46b33/merged/app/spring-boot-application.jar), die schwere Arbeit durch, die Datei dem entsprechenden Image zuzuordnen. Zum Beispiel würde es das obige in das folgende Image übersetzen: ghcr.io/christophetd/log4shell-vulnerable-app:latest. Da die verschiedenen Container-Laufzeiten diese Zuordnung auf unterschiedliche Weise speichern, kann dies einem Analysten stundenlange Frustration ersparen. Dies ermöglicht es einem Analysten auch, eine Reihe von Containern, die eine einzelne Anwendung ausführen, als einen einzigen Fund zu behandeln.
entfernt es nutzlose Treffer, wie z. B. Treffer, die Containern entsprechen, die derzeit nicht ausgeführt werden, einschließlich gecachter Images. Dies ermöglicht es einem Analysten, sich auf das Wesentliche zu konzentrieren, und erspart dem Analysten erneut stundenlange unnötige Arbeit
ermöglicht es einem Analysten, Treffer zu ignorieren, basierend auf:
Dies ermöglicht es dem Analysten, Anwendungen zu entfernen, von denen bekannt ist, dass sie nicht anfällig sind, oder die CLI-basierten Anwendungen entsprechen, die keine Bedrohung darstellen. Wenn beispielsweise eine Instanz von Logstash erkannt wird, kann ein Analyst sie ignorieren, wenn sie das Tool nicht ausführen oder es nur gelegentlich von der CLI aus ausführen.
ist es optimiert für die Zusammenarbeit mit Ihren Konfigurationsmanagement-Tools wie Ansible, sodass Sie Ihre Umgebung in Minuten schnell scannen können.
Einzelheiten zur Metadaten-Anreicherung, die von Log4Shell Sentinel hinzugefügt wird, finden Sie in meinem Blog-Beitrag.
Der einfachste Weg ist, die vorkompilierte Binärdatei herunterzuladen.
Auch dies ist unkompliziert. Sie werden jedoch wahrscheinlich eine statisch kompilierte Version erstellen möchten, um GLIBC-bedingte Variationen in Ihrer Umgebung zu umgehen. Das Tool verwendet die folgenden Module, die standardmäßig CGO verwenden:
os/usernetUm eine statisch kompilierte Version zu erstellen, die die Go-Versionen dieser Bibliotheken verwendet, klonen Sie einfach das Repository und führen Sie dann Folgendes aus:
$ 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)
Standardmäßig scannt ein Scan das aktuelle Verzeichnis. Zum Beispiel:
$ ./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
Sie erhalten sofort eine WARNUNG, wenn Sie es als Nicht-Root-Benutzer ausführen, da es root-Berechtigungen benötigt:
Es funktioniert auch ohne root-Rechte, liefert aber möglicherweise nicht die besten Ergebnisse.
Ein beispielhafter Fund sieht so aus:
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
Einige Felder sind absichtlich leer gelassen und für den Analysten bestimmt, sie in Excel usw. auszufüllen. Eine kurze Beschreibung jedes Feldes finden Sie unten:
| Feld | Beispiel | Beschreibung |
|---|---|---|
| IP | 192.168.121.121 | Wenn die Instanz mehrere IPs hat, wird die primäre IP hinzugefügt |
| Hostname | server3 | Hostname |
| AppName | Dies bleibt dem Benutzer überlassen, nach Abschluss des Scans ausgefüllt zu werden | |
| Team | Dies bleibt dem Benutzer überlassen, nach Abschluss des Scans ausgefüllt zu werden | |
| Ignore (Y/N) | Dies bleibt dem Benutzer überlassen, nach Abschluss des Scans ausgefüllt zu werden | |
| Comment | Dies bleibt dem Benutzer überlassen, nach Abschluss des Scans ausgefüllt zu werden | |
| MD5Hash | 4e615cd580758b70c49ade1f79103328 | Ein eindeutiger Fingerabdruck unserer Anwendung |
| Timestamp | 2021-12-21T07:38:09Z | Ein Zeitstempel, wann der Scan durchgeführt wurde. Dies ist nützlich, wenn Sie mehrere Scans desselben Hosts zusammenführen möchten |
| Container | true | True = dies ist ein Container |
| ContainerImage | ghcr.io/christophetd/log4shell-vulnerable-app:latest | Wenn ein Container erkannt wurde, ist dies das entsprechende Image |
| FullPath | /run/containerd/io.containerd. runtime.v2.task/k8s.io/.../spring-boot-application.jar | Der vollständige Pfad des Funds. In diesem Beispiel ist die anfällige JAR-Datei Teil eines Fat / Uber Jars |
| Version | log4j-core-2.14.1.jar | Die erkannte log4j-core-Version |
Das Tool bietet die folgenden Optionen:
| Option | Details |
|---|---|
--path value, -p value | Gibt an, welche Pfade durchsucht werden sollen. Standardmäßig wird das aktuelle Verzeichnis durchsucht. WICHTIG Es wird empfohlen, dies auf / zu setzen, um Ihr gesamtes Dateisystem abzudecken. |
--no-banner, --nb | Unterdrückt das Banner. |
--no-messages, --nm | Unterdrückt Meldungen wie Fortschrittsmeldungen. |
--no-header, --nh | Unterdrückt den Header der CSV-Ausgabe. Dies wird empfohlen, wenn Sie es auf mehreren Servern ausführen. |
--imd5 value, --im value | Ignoriert MD5-Hashes. Mehr dazu im Abschnitt Ignorierlisten. |
--ipath value, --ip value | Ignoriert Übereinstimmungen mit Dateipfaden. Mehr dazu im Abschnitt Ignorierlisten. |
--icimage value, --ic value | Ignoriert Übereinstimmungen mit Container-Images. Mehr dazu im Abschnitt Ignorierlisten. |
--print-headers, --ph | Gibt nur CSV-Header aus. Wenn Sie Log4Shell Sentinel auf mehreren Servern ausführen und die Ergebnisse zusammenführen, würden Sie normalerweise die Header-Ausgabe deaktivieren. Dieser Befehl gibt nur den Header aus, damit Sie ihn zu Ihrem Excel-Blatt hinzufügen können. |
Eine der einzigartigen Funktionen von Log4Shell Sentinel, die in keinem anderen Tool zu finden ist, ist die Fähigkeit, Jars, die in Dateisystem-Scans gefunden wurden, wie z. B.:
/var/lib/docker/overlay2/192768f471818601094bf4edd96d14bfc0e2b178a04a2efd00b2231ad4e46b33/merged/app/spring-boot-application.jar
dem entsprechenden Container-Image zuzuordnen (das obige übersetzt sich z. B. in ghcr.io/christophetd/log4shell-vulnerable-app:latest). Da die verschiedenen Container-Laufzeiten diese Zuordnung auf unterschiedliche Weise speichern, kann dies einem Analysten stundenlange Frustration ersparen. Dies ermöglicht es einem Analysten auch, eine Reihe von Containern, die eine einzelne Anwendung ausführen, als einen einzigen Fund zu behandeln. Die Lösung unterstützt derzeit die folgenden Lookups:
Die Anzahl der identifizierten Anwendungen kann zunächst überwältigend sein, oder Sie möchten sich auf eine bestimmte Teilmenge der identifizierten Anwendungen konzentrieren, z. B. auf solche, die zuerst externen Benutzern ausgesetzt sind. Oder Sie möchten sich auf einen bestimmten Compliance-Bereich konzentrieren. Um dies zu unterstützen, ermöglicht die Anwendung die Angabe einer Liste. Log4Shell unterstützt derzeit 3 Ignorierlisten:
Anstelle einfacher Listen erwartet es eine CSV-Datei als Eingabe. Dies ermutigt den Analysten, zu dokumentieren, warum ein bestimmter Fund ignoriert wird. Während der Analyst die Funde verarbeitet und nicht anfällige Anwendungen manuell oder durch automatisierte Quellcode-Analyse oder DAST-Tools identifiziert.
Die Liste ist eine einfache CSV-Datei im folgenden Format:
MD5Sum,AppName,Reason
Die Spalten AppName und Reason können leer sein, dienen aber dazu, den Überblick zu behalten, warum Sie bestimmte Anwendungen einschließen oder ausschließen.
HINWEIS Da diese Funktion den für die Anwendung berechneten MD5-Hash verwendet, funktioniert dies nur für Anwendungen, die Fat / Uber Jars, EARs oder WARs sind.
Wenn wir beispielsweise den folgenden Fund hätten:
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
und festgestellt haben, dass die Anwendung nicht anfällig ist, können wir einfach Folgendes in hashes.csv speichern:
4e615cd580758b70c49ade1f79103328,Demo App,Not vulnerable
und dann erneut ausführen:
# ./log4shell_sentinel --im hashes.csv --path /
Der obige Fund würde unterdrückt werden.
Die Liste ist eine einfache CSV-Datei im folgenden Format:
ContainerImage,AppName,Reason
Aufbauend auf dem vorherigen Beispiel können wir ihm mitteilen, dass er jeden Fund ignorieren soll, bei dem das Container-Image ghcr.io/christophetd/log4shell-vulnerable-app:latest ist, indem wir eine images.csv-Datei wie diese erstellen:
ghcr.io/christophetd/log4shell-vulnerable-app:latest,,
und dann ausführen mit:
# ./log4shell_sentinel --ic images.csv -p /
Auch hier würde unser vorheriger Fund unterdrückt werden.
Auch dies ist eine einfache CSV-Datei im folgenden Format:
Path,AppName,Reason
Wenn wir das obige Beispiel verwenden und die folgende paths.csv-Datei erstellen:
/run/containerd/io.containerd.runtime.v2.task/k8s.io/dc2c9c214809f506283c917244cd126a9b056ac7274322d12b59c9196d95dd9b/rootfs/app/spring-boot-application.jar,Demo App,Not vulnerable
würde der vorherige Fund unterdrückt werden.
WARNUNG Wenn möglich, ist es besser, einen MD5-Hash oder Container-Image-Namen zur Unterdrückung zu verwenden, da der Pfad möglicherweise nicht eindeutig ist.
Obwohl es völlig in Ordnung ist, Log4Shell Sentinel auf einem einzelnen Server auszuführen, glänzt es wirklich, wenn es mit Ihrem bevorzugten Konfigurationsmanagement-Tool (Ansible, Chef, Puppet, Salt, AWS SSM usw.) oder sogar einfachen parallelen SSH-Tools wie parellel-ssh kombiniert wird.
Dies bietet zahlreiche Vorteile, darunter:
Ein vollständiges Beispiel hierfür finden Sie in meinem Blog-Beitrag.
Siehe Abschnitt Massen-Scan Ihrer Umgebung.
root-Benutzer ausführen (es benötigt Zugriff auf die Verzeichnisse, in denen Ihre Anwendungen installiert sein könnten) oder Sie nicht den richtigen path angegeben haben. Es wird empfohlen, es als root-Benutzer auszuführen und --path / zu setzen.Ab v1.0.0 unterstützt das Tool derzeit die Zuordnung für Folgendes:
Wenn Sie etwas anderes verwenden, funktioniert die Zuordnung nicht. Wenn Sie eines der oben genannten verwenden, kann es sein, dass Sie das Tool nicht als root-Benutzer ausführen oder dass der verwendete Socket / die verwendeten Dateien sich an einem nicht standardmäßigen Speicherort befinden.
Entwickelt von: Osama Elnaggar