Flashback-Trojaner: So funktioniert der Mac-Schädling

Seite 2: Täuschen und Tarnen

Inhaltsverzeichnis

Die einfache Infektion über die Java-Lücke ist ein großes Problem. Sie ermöglicht es Applets, die initialen Infektionsdateien eigenständig herunterzuladen, ohne dabei die Download-Funktion von Safari zu verwenden. Das von Internet-Apps typischerweise auf ihre Downloads zu setzende Quarantäne-Flag setzt der Selbst-Download der Malware natürlich nicht. Dadurch greift aber auch Apples Anti-Malware-Mechanismus XProtect zur Prüfung von Downloads nicht und der Anwender bekommt so keinerlei Warnmeldungen zu Gesicht. Das erklärt auch, weshalb Apple keine neuen Flashback-Einträge in der Downloads-Blacklist vorgenommen hat: Es hätte schlicht nichts genutzt.

Die zugrundeliegende Sicherheitslücke in Java ermöglicht es Applets, aus der Sandbox auszubrechen.

Unauffällig war Flashback trotzdem nicht. Die Infektionen flogen nicht nur durch Warn-Meldungen von Netzwerkmonitoren wie Little Snitch auf. Viel auffälliger war, dass beim Injizieren der Payload-Libraries reihenweise Anwendungen abschmierten und in ihren Log-Dateien Meldungen wie "dyld: could not load inserted library: /User/Shared/.libgmalloc.dylib" hinterließen. Eine echte libgmalloc.dylib gibt es zwar tatsächlich, aber ohne den führenden Punkt, im SDK von Xcode. Die Abstürze betrafen einerseits PPC-Programme, die die injizierten Intel-Libraries nicht vertrugen, andererseits aber auch Intel-Applikationen wie Skype.

Eine verbesserte Flashback-Variante vermeidet Kompatibilitätsprobleme, indem sie zunächst prüft, ob die Problem-Programme installiert sind. Ist das der Fall, bricht Flashback seinen Angriff ab und löscht sich laut Berichten von AV-Herstellern selbst. Interessanterweise sucht Flashback dabei jedoch die Entwicklungsumgebung Xcode unter der veralteten Stelle /Developer/Applications anstatt unter /Applications.

Die Payload-Bibliothek von Flashback bedient sich des sogenannten Interposings, bei dem Standard-Funktionen aus Standard-Libraries durch eine weitere nachgeladene Library umdefiniert werden. Die umdefinierte Version kann beliebigen Schadcode enthalten und optional die originalen Funktionen zu Tarnzwecken und zur Gewährleistung der Stabilität aufrufen. Flashback kapert die Funktionen CFReadStreamRead und CFWriteStreamWrite, die unter anderem für HTTP und FTP benutzt werden. Damit kann er sich in den Netzverkehr von Browsern, FTP-Programmen und dergleichen einklinken.

Der Trojaner verwendet jedoch eine sehr offensichtliche Variante des Interposings, die ihr Handeln plakativ in einer __interpose Section im __DATA-Segment des Binaries deklariert. Dieses offizielle Interposing wurde erst mit Mac OS X 10.4 Tiger eingeführt. Man kann seine Verwendung in einer verdächtigen Library anhand des Shell-Befehls

otool [verdächtige.dylib] -vl | grep __interpose -C4

an diesen Zeilen erkennen:

attributes (none)
reserved1 5 (index into indirect symbol table)
reserved2 0
Section
sectname __interpose
segname __DATA

addr 0x0000000000001040
size 0x0000000000000020
offset 4160

Mac-OS-X-Programme benötigen keine zusätzlich heruntergeladene Bibliothek und erst recht keine mit einer __interpose-Sektion. Taucht dennoch eine im Code auf, handelt es sich entweder um einen Hack oder um Malware.

Besser getarnte Malware verwendet eine Interposing-Variante, die im Gegensatz zu der von Flashback verwendeten auch mit Systemen vor OS X 10.4 möglich ist. Damit ist das Überschreiben nicht so leicht schon an der Library zu erkennen, weil das Interposing nicht offiziell deklariert werden müsste. Diese bessere Tarnung erkauft man sich allerdings mit mehr Programmieraufwand, denn dafür muss man die angegriffene Anwendung in einen "flat namespace" zwingen. Mac OS X findet Library-Funktionen nämlich normalerweise nicht per Suche über alle dynamischen Libraries in ihrer Ladereihenfolge wie viele andere Betriebssysteme. Statt dessen löst das Apple-OS auch aus Performance-Gründen Bibliotheken via "two level namespace" direkt auf, indem es unmittelbar in die gemerkte Library springt.

Ein Namespace ist ein Gültigkeitsbereich für Namen, der sicherstellt, dass diese nicht mit anderen Namen in anderen Namespaces kollidieren. Zwingt man so eine normale Anwendung jedoch in den flachen Namespace, bei dem nur der Funktionsname ohne seinen Librarynamen gesucht wird, können unerwünschte Namenskonflikte auftreten, die zum Absturz führen. Zumindest für die in letzter Zeit erfolgreichen Flashback-Varianten haben sich die Entwickler deshalb wohl für die schlechter getarnte, aber einfachere Variante des Interposings entschieden.