Wie kann ich herausfinden, welche Version von Log4J ich verwende?

Lesezeit: 6 Minuten

Benutzeravatar von markthegrea
markthegrea

Wie wir alle wissen, befinden sich am Ende mindestens vier oder fünf Log4j-JAR-Dateien im Klassenpfad. Wie kann ich feststellen, welche Version ich verwende?

Benutzeravatar von Thomas Tempelmann
Thomas Tempelmann

Ich kam hierher, nachdem ich erfahren hatte, dass meine Server für den neuen Log4j-Exploit anfällig sein könnten (CVE-2021-44228). Also musste ich wissen, ob ich einen veralteten/anfälligen Build von Log4j Version 2 installiert hatte.

Frühere Antworten hier helfen nicht beim Erkennen alter Versionen, da sie dazu dienen, bereits ausgeführten Java-Code herauszufinden, welche Version von Log4j dieser Code verwendet, während ich wissen muss, ob beliebig Die Java-App verwendet möglicherweise eine anfällige Version.

Folgendes habe ich stattdessen getan:

sudo find / -name 'log4j*'

Dies listet alle Log4j-bezogenen Dateien auf meinem (Linux-)Server auf. Das zeigte mir ein paar 1.x-Versionen, die für dieses spezielle CVE nicht anfällig sind, und eine 2.15.0-Datei, die bereits den Fix für das CVE enthält.

Wenn Sie dies ausführen und Datei- oder Ordnernamen finden, die 2.x haben, wobei x < 15, dann sind Sie wahrscheinlich anfällig und müssen herausfinden, wie Sie Ihre Dateien so schnell wie möglich aktualisieren können.

Vorsicht

Ich wurde gewarnt, dass dies für meinen Zweck als Test nicht ausreicht, da die Log4j-Dateien möglicherweise in einer .jar-Datei versteckt sind, die die find Befehl würde nicht entdecken.

Aktualisieren

Hier ist ein öffentliches Projekt, das versucht, alle .jar-Dateien zu scannen, um Log4j-Code auch in Archiven zu finden: Log4-Detektor

  • Um alle JAR-Dateien auf Ihrem System aufzulisten, die die anfällige Klassendatei enthalten (auch in Fat-JARs), können Sie Folgendes verwenden: for f in $(find / -name '*.jar' 2>/dev/null); do echo "Checking $f..."; unzip -l "$f" | grep -F org/apache/logging/log4j/core/lookup/JndiLookup.class; done

    – Deltas

    13. Dezember 2021 um 10:55 Uhr


  • Bitte beachten Sie, dass auch Log4j v1 betroffen sein kann: nvd.nist.gov/vuln/detail/CVE-2019-17571

    – Ma Kobi

    13. Dezember 2021 um 13:13 Uhr

  • Log4j 1.x hat andere Schwachstellen. stackoverflow.com/a/70405229/1329426 .

    – Joool

    18. Dezember 2021 um 16:44 Uhr

  • @Delthas Sind Sie sicher, dass die Suche nach dem Vorhandensein von JndiLookup.class eine korrekte Prüfung ist? Neuere (korrigierte) Versionen von log4j2 enthalten diese Datei immer noch, wenn auch mit entferntem Fehler

    – golimar

    22. März 2022 um 13:34 Uhr

  • @golimar Tatsächlich werden auch Dateien aufgelistet, die repariert wurden. Der von mir gepostete Befehl hilft Ihnen, JARs zu finden, die möglicherweise anfällig sind, sagt Ihnen jedoch nicht, ob sie die gepatchte Version von Log4j oder eine anfällige Version verwenden.

    – Deltas

    22. März 2022 um 22:03 Uhr

Benutzeravatar von Loic Mouchard
Loïc Mouchard

Es hängt vom ClassLoader ab, aber schau mal das Beispiel:

import org.apache.log4j.Layout;

public class X {
    public static void main(String[] a) {
        Package p = Layout.class.getPackage();
        System.out.println(p);
        System.out.println("Implementation title:   " + p.getImplementationTitle());
        System.out.println("Implementation vendor:  " + p.getImplementationVendor());
        System.out.println("Implementation version: " + p.getImplementationVersion());
    }
}

Sie können die Methode aufrufen getImplementationVersion auf der Layout Klasse von log4j:

org.apache.log4j.Layout.class.getPackage().getImplementationVersion()

  • Tolle Antwort und vielleicht richtig, aber ich bekomme alle Nullen für diese Klasse. Die von Ihnen bereitgestellte Dokumentation besagt, dass es mit 1.2 und 1.3 funktioniert. Das könnte bedeuten, dass ich Version 2 verwende.

    – markthegrea

    25. Mai 2016 um 13:54 Uhr


  • Ich habe eine neuere Version von Log4j heruntergeladen (2.13.1) & festgestellt, dass die getImplementationVersion & getSpecificationVersion Methoden funktionieren damit. Für ältere Versionen siehe meine Antwort unten.

    – AntumDeluge

    19. April 2020 um 0:04 Uhr


  • Der in der Antwort angegebene Link ist defekt. Kann jemand den Beispielcode teilen, um die log4j-Version programmgesteuert zu drucken?.

    – Venkatesan Muniappan

    13. Dezember 2021 um 16:43 Uhr

Benutzeravatar von AntumDeluge
AntumSintflut

Ich würde nicht erwarten, dass dies die bevorzugte Methode ist, aber so habe ich die Version von Log4j ermittelt, die meine Software verwendet:

Öffnen oder extrahieren Sie den Inhalt der Log4j-JAR-Datei mit einem ZIP-Archivierungsprogramm (Windows Explorer unterstützt dies). Navigieren Sie in das “META-INF” Unterverzeichnis und öffnen Sie die Datei “MANIFEST.MF” in einem Texteditor. Suchen Sie die Zeile, die mit “Implementierungs-Version“, das ist die Log4j-Version.

Offensichtlich ist dies keine programmatische Lösung. Aber wenn Sie einfach wissen wollen, welche Version Sie verwenden und Sie das .jar-Archiv haben, funktioniert es.

Ich bemerkte, dass Package.getSpecificationVersion() Und Package.getImplementationVersion(), wie in der Antwort von Loic M. erwähnt, funktionieren für andere .jar-Bibliotheken, aber nicht für mein Log4j. Es ist möglich, dass die von mir verwendete Version dies einfach nicht unterstützt.

Ich habe die Version heruntergeladen 2.13.1 die oben genannten Methoden auszuprobieren und festgestellt, dass sie damit funktionieren. Also war es meine Version (1.2.16), die sie nicht unterstützte und zurückkehrte null.

Benutzeravatar von Shivam Anand
Shivam Anand

Um die Log4j-Version während zu kennen Laufzeit in Java:

LOGGER.info("Log4j version: " + org.apache.logging.log4j.util.PropertiesUtil.class.getPackage().getImplementationVersion());

Oder

System.out.println("Log4j version: " + org.apache.logging.log4j.util.PropertiesUtil.class.getPackage().getImplementationVersion());

Benutzeravatar von Bünyamin Şentürk
Bünyamin Sentürk

Ich habe ein kleines Bash-Skript geschrieben, um die Versionen jeder Log4j-JAR-Datei zu überprüfen, die sich auf diesem Server befindet. Es liest die Versionsinformationen aus der Manifestdatei, da das Vertrauen in Dateinamen ein wenig riskant ist.

locs=( $(sudo find / -name 'log4j*'|grep jar) )
fcount=${#locs[@]}

echo "Found $fcount jar files"
echo " "

for (( j=0; j<${fcount}; j++ ));
do
    unzip ${locs[$j]} META-INF/MANIFEST.MF
    mv META-INF/MANIFEST.MF META-INF/MANIFEST$j.MF
done

echo " "
for (( j=0; j<${fcount}; j++ ));
do
    echo ${locs[$j]}
    tail -2 META-INF/MANIFEST$j.MF
done

  • Vermutlich gelaufen ShellCheck.net und beheben Sie die verschiedenen Probleme, die es meldet. Einfach über die Schleife find Ausgabe so, wie sie ankommt, würde die zahlreichen Probleme vermeiden, die Sie mit Arrays haben. Knapp, sudo find / -name 'log4j*.jar' -exec sh -c '... your loop code here ...' _ {} +

    – Dreier

    23. Dezember 2021 um 10:20 Uhr


Benutzeravatar von Peter Mortensen
Peter Mortensen

  1. Da es mehrere Versionen derselben Klassen aus verschiedenen Log4j-Abhängigkeiten gibt, könnte jede von ihnen während der Laufzeit geladen werden (vorausgesetzt, dass derselbe Klassenname in verschiedenen JAR-Dateien vorhanden ist).

  2. Ich verwende Plugins von bereitgestellt Finsternis Und IntelliJ-IDEE zu sehen Maven Abhängigkeitsbaum. Dann schließe ich die älteren aus, um nur die benötigte Log4j-Version zu haben.

  • Vermutlich gelaufen ShellCheck.net und beheben Sie die verschiedenen Probleme, die es meldet. Einfach über die Schleife find Ausgabe so, wie sie ankommt, würde die zahlreichen Probleme vermeiden, die Sie mit Arrays haben. Knapp, sudo find / -name 'log4j*.jar' -exec sh -c '... your loop code here ...' _ {} +

    – Dreier

    23. Dezember 2021 um 10:20 Uhr


Benutzeravatar von Peter Mortensen
Peter Mortensen

Löschen Sie alle JAR-Dateien der Versionen, die Sie nicht benötigen (eine sollte ausreichen), und um die Version der verbleibenden herauszufinden, sehen Sie sich den Dateinamen an.

Zum Beispiel:

log4j-1.2.17.jar

1449810cookie-checkWie kann ich herausfinden, welche Version von Log4J ich verwende?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy