Wie funktioniert die Lücke im Java-Zusammenhang?

Der eigentliche Sinn des Lookups ist es, Daten abzufragen, um im Logfile für eine bessere Lesbarkeit zu sorgen. Zum Beispiel kann so bei einem LDAP-Server angefragt werden, wie der Klarname zu dem Usernamen lautet, der gerade einen Login versucht hat.

Weil aber so eine Log-Message von Log4J 2 nicht nur aus Strings, sondern auch aus Objekten besteht und so ein über JNDI abgefragter Wert ein komplexes Objekt sein kann, gibt es die Möglichkeit, dass die Antwort des JNDI-Lookup-Aufrufs ein serialisiertes Java-Objekt enthält. Dazu gehört dann zum Beispiel der Klassenname und die serialisierten Daten.

Findet sich eine Klasse mit dem vorgegebenen Namen im Class-Path auf dem Server, wird ein Objekt dieser Klasse mit den serialisierten Daten instanziiert - der Server hat dann zum Beispiel ein komplett befülltes Objekt der Klasse UserData mit Name, Vorname, Adresse und allen weiteren Daten. Ist die geforderte Klasse aber nicht im eigenen Class-Path vorhanden, können die gegebenenfalls in der JNDI-Lookup-Antwort enthaltenen Informationen verwendet werden, die angeben, in welchen fremden Code-Repository die Klasse zu finden ist. Diese .class-Datei wird dann geladen und an den ClassLoader übergeben, sodass daraus Instanzen instanziiert und befüllt werden können.

Dass dies ein Problem sein kann, ist schon lange bekannt. Oracle hat deshalb in Java 8 vor Jahren eine Systemvariable eingeführt, mit der das Laden von Klassen aus einem Remote-Repository unterbunden werden kann. Allerdings war diese für die ersten Jahre standardmäßig ausgeschaltet, um zu verhindern, dass Programmcode, der sich auf so etwas verlässt, durch ein Update von Java 8 nicht mehr funktioniert.

Das Problem aber ist, dass es dieses Remote-Laden von .class-Dateien gar nicht wirklich braucht. Denn auch ohne dieses Laden von Klassen können Angreifer eine große Menge von bereits vorhandenen Klassen benutzen, indem sie entsprechende Informationen zur Deserialisierung bereithalten. So kann über Umwege zum Beispiel eine als String übergebene .class-Datei irgendwo in den lokalen Class-Path auf dem Server geschrieben werden.

Befindet sich so eine Datei erst mal im Class-Path, wird sie bei jedem Neustart der Applikation auch wieder vom Classloader geladen; das große Problem dabei ist, dass eine Java-Klasse statische Code-Blöcke erlaubt. Diese statischen Code-Blöcke werden bereits beim Laden der Klasse in den Classloader ausgeführt und nicht erst, wenn ein Objekt dieses Typs instanziiert wird oder ein Methodenaufruf darauf stattfindet.

Durch diesen Mechanismus muss sich im eigentlichen Programmcode des infizierten Systems auch keinerlei Referenz auf die Klasse befinden, damit sie ihre Arbeit verrichtet. Und diese Arbeit kann alles sein, was dem lokalem Java-Programm auf dem Server möglich ist, inklusive Syscalls, die irgendwelche Programme ausführen, bis hin zum Aufbauen einer versteckten Webseite, die über einen Browser eine Shell zur Verfügung stellt.

Bitte aktivieren Sie Javascript.
Oder nutzen Sie das Golem-pur-Angebot
und lesen Golem.de
  • ohne Werbung
  • mit ausgeschaltetem Javascript
  • mit RSS-Volltext-Feed
 Log4J-Lücke: Warum Log4Shell so gefährlich ist und was (nicht) hilftWas ist betroffen? Und was hilft gegen Log4Shell? 
  1.  
  2. 1
  3. 2
  4. 3
  5. 4
  6.  


Bolzkopf 02. Jan 2022

denn in diesen Containern befinden sich oftmals eigene Kopien der Java-Bibiliotheken. Es...

scrumdideldu 23. Dez 2021

Der letzte Teil stimmt. Es entbindet nicht von jeglicher Verantwortung. Allerdings ist...

gadthrawn 21. Dez 2021

Die Beispiele bei denen OS wiederholt unsicher ist benötigt es nur aus einem Grund: Zu...

gadthrawn 21. Dez 2021

Nicht? Weißt du was bei einem String mit% beim loggen passiert in Python? ...



Aktuell auf der Startseite von Golem.de
Ukrainekrieg
Palantir für die militärische Zielauswahl verantwortlich

Das US-Unternehmen Palantir ist mit Software am Kriegsgeschehen in der Ukraine beteiligt. Auch die hiesige Polizei setzt Software des Unternehmens ein.

Ukrainekrieg: Palantir für die militärische Zielauswahl verantwortlich
Artikel
  1. Streaming: Netflix streicht Funktion aus drei Abomodellen
    Streaming
    Netflix streicht Funktion aus drei Abomodellen

    Künftig gibt es 3D-Raumklang alias Spatial Audio nur noch im teuersten Netflix-Abo. Wirbel entfacht eine Filmveröffentlichung in Japan.

  2. Grüner Wasserstoff: Neues Verfahren erzeugt Wasserstoff aus Salzwasser
    Grüner Wasserstoff
    Neues Verfahren erzeugt Wasserstoff aus Salzwasser

    Wo es Sonne gibt, um Wasserstoff zu erzeugen, fehlt es oft an Süßwasser. Ein neu entwickelter Elektrolyseur kann das im Überfluss vorhandene Meerwasser verarbeiten.

  3. Software: Wie Entwickler Fehler aufspüren - oder gleich vermeiden
    Software
    Wie Entwickler Fehler aufspüren - oder gleich vermeiden

    Es gibt zahlreiche Arten von Softwarefehlern. Wir erklären, welche Testverfahren sie am zuverlässigsten finden und welche Methoden es gibt, um ihnen vorzubeugen.
    Von Michael Bröde

Du willst dich mit Golem.de beruflich verändern oder weiterbilden?
Zum Stellenmarkt
Zur Akademie
Zum Coaching
  • Schnäppchen, Rabatte und Top-Angebote
    Die besten Deals des Tages
    Daily Deals • Samsung G5 Curved 27" WQHD 260,53€ • Graka-Preisrutsch bei Mindfactory • Samsung Galaxy S23 jetzt vorbestellbar • Philips Hue 3x E27 + Hue Bridge -57% • PCGH Cyber Week • Dead Space PS5 -16% • PNY RTX 4080 1.269€ • Bis 77% Rabatt auf Fernseher • Roccat Kone Pro -56% [Werbung]
    •  /