Eine Analyse der xz-HintertĂĽr, Teil 4
Im letzten Teil unserer Serie geht es um die Effekte der Malware auf infizierten Systemen: Wie sie OpenSSH unterwandert und was Angreifer anstellen könnten.

(Bild: Thorsten HĂĽbner)
Der Angreifer hat es geschafft, dass die xz-Bibliothek liblzma unter Debian und RedHat ein bösartiges Object-File einschließt: liblzma_la-crc64-fast.o. Nun lassen wir die Compilier- und Paketbauphase hinter uns und sehen uns an, was der eingeschleuste Code bei Opfern anrichtet. Mit knapp 90 KByte ist das Object-File ein ziemlicher Brocken und nicht nur deshalb sehr schwer zu analysieren.
Wir wenden uns zunächst der einfacheren Frage zu, unter welchen Umständen Code in liblzma_la-crc64-fast.o überhaupt zur Ausführung kommt. Wie im vergangenen Teil beschrieben, manipuliert die Hintertür beim Paketbau die Quellcodedateien crc64_fast.c und crc32_fast.c im Verzeichnis src/liblzma/check/. Konkret passt sie darin die Funktionen crc64_resolve()
und crc32_resolve()
an, sodass bei deren Aufruf letztlich die Funktion _get_cpuid()
aus der HintertĂĽr ausgefĂĽhrt wird.
Bei den …resolve()
-Funktionen handelt es sich um ifunc-Resolver, wie der Name nahelegt. Mit "GNU indirect functions" (ifunc) können Entwickler dynamisch entscheiden, welchen Code eine Funktion nutzen soll. Das erlaubt beispielsweise, hochoptimierten Code auszuliefern: Entwickler können besonders performancerelevante Funktionen in verschiedenen Versionen für verschiedene Prozessorarchitekturen programmieren. Per ifunc-Resolver gestattet der dynamische Linker dann dem Programm zur Laufzeit, die Implementierung zu wählen, die am besten zum aktuellen System passt.