Im April 2022 entdeckten ESET-Forscher eine bisher unbekannte macOS-Backdoor. Diese spioniert die Nutzer des kompromittierten Macs aus und nutzt ausschließlich öffentliche Cloud-Speicherdienste, um mit ihren Betreibern zu kommunizieren. Im Zuge unserer Analyse haben wir sie CloudMensis genannt. Ihre Fähigkeiten zeigen deutlich, dass die Absicht der Betreiber darin besteht, Informationen von den Macs der Opfer zu sammeln. Zielgerichtet werden Dokumente, Tastatureingaben und Bildschirmaufnahmen exfiltriert.

Apple hat vor kurzem die Existenz von Spyware für seine Plattformen eingeräumt und bietet eine Vorschau auf den Lockdown-Modus für iOS, iPadOS und macOS an. Dieser deaktiviert Funktionen, die häufig ausgenutzt werden, um Code auszuführen und Malware einzusetzen. Obwohl es sich nicht um die fortschrittlichste Malware handelt, könnte CloudMensis einer der Gründe sein, warum einige Nutzer diesen zusätzlichen Schutz aktivieren möchten. Die Deaktivierung von möglichen Angriffspunkten auf Kosten eines vielleicht weniger flüssigen Benutzererlebnisses klingt nach einem vernünftigen Weg, um die potentielle Angriffsfläche zu minimieren.

Dieser Blogpost beschreibt die verschiedenen Komponenten von CloudMensis und ihre Funktionsweise.

CloudMensis Übersicht

CloudMensis wurde in der Objective-C Progammiersprache entwickelt. Die von uns analysierten Beispiele wurden sowohl für Intel- als auch für Apple-Silizium-Architekturen kompiliert. Wir wissen immer noch nicht, wie die Opfer anfangs durch diese Bedrohung kompromittiert werden. Wir wissen jedoch, dass nach der Codeausführung und der Erlangung von Administrator- bzw. Root-Rechten ein zweistufiger Prozess folgt (siehe Abbildung 1), bei dem in der ersten Stufe die mit mehr Funktionen ausgestattete zweite Stufe heruntergeladen und ausgeführt wird. Interessanterweise ruft die Malware der ersten Stufe ihre nächste Stufe von einem Cloud-Speicheranbieter ab. Sie verwendet keinen öffentlich zugänglichen Link, sondern enthält ein Zugriffstoken, um die MyExecute-Datei vom Speicher herunterzuladen. In dem von uns analysierten Sample wurde pCloud für die Speicherung und Bereitstellung der zweiten Stufe verwendet.

Abbildung 1. Überblick, wie CloudMensis Cloud-Speicherdienste nutzt

Die in beiden Komponenten hinterlassenen Artefakte deuten darauf hin, dass sie von ihren Autoren execute und Client genannt werden, wobei ersterer der Downloader und letzterer der Spionageagent ist. Diese Namen finden sich sowohl in den absoluten Pfaden der Objekte als auch in den Ad-hoc-Signaturen.

Abbildung 2. Teilstrings und Codesignatur der Downloader-Komponente, execute

Abbildung 3. Teilstrings und Codesignatur der Spionageagenten-Komponente, Client

Die Abbildungen 2 und 3 zeigen auch, was aussieht wie die internen Namen der Komponenten dieser Malware: Das Projekt scheint BaD zu heißen und befindet sich interessanterweise in einem Unterverzeichnis namens LeonWork. Außerdem deutet v29 darauf hin, dass es sich bei diesem Beispiel um Version 29 oder vielleicht 2.9 handelt. Diese Versionsnummer findet sich auch im Namen der Konfigurationsdatei.

Der Downloader

Die Malware der ersten Stufe lädt die Malware der zweiten Stufe herunter und installiert sie als systemweiten Daemon. Wie in Abbildung 4 zu sehen ist, werden zwei Dateien auf die Festplatte geschrieben:

  1. /Library/WebServer/share/httpd/manual/WindowServer: die ausführbare Mach-O Datei der zweiten Stufe pCloud Speicher
  2. /Library/LaunchDaemons/.com.apple.WindowServer.plist: eine Eigenschaftslistendatei, damit die Malware als systemweiter Daemon bestehen bleibt

In diesem Stadium müssen die Angreifer bereits über administrative Rechte verfügen, da beide Verzeichnisse nur vom Benutzer root geändert werden können.

Abbildung 4. CloudMensis-Downloader bei der Installation der zweiten Stufe

Aufräumen nach Verwendung eines Safari-Exploits

Die Komponente der ersten Stufe enthält eine interessante Methode namens removeRegistration, die anscheinend dazu dient, nach einem erfolgreichen Ausbruch aus der Safari-Sandbox aufzuräumen. Ein erster Blick auf diese Methode ist etwas verwirrend, da die Aktionen, die sie ausführt, in keinem Zusammenhang zu stehen scheinen: Sie löscht eine Datei namens root aus der EFI-Systempartition (Abbildung 5), sendet eine XPC-Nachricht an speechsynthesisd (Abbildung 6) und löscht Dateien aus dem Safari-Cache-Verzeichnis. Ursprünglich dachten wir, der Zweck von removeRegistration sei die Deinstallation früherer Versionen von CloudMensis. Weitere Nachforschungen ergaben jedoch, dass diese Dateien verwendet werden, um Sandbox- und Rechteausweitungs-Exploits von Safari aus zu starten und dabei vier Sicherheitslücken auszunutzen. Diese Schwachstellen wurden von Niklas Baumstark und Samuel Groß im Jahr 2017 entdeckt und gut dokumentiert. Alle vier wurden von Apple im selben Jahr gepatcht, sodass diese Verbreitungstechnik wahrscheinlich nicht mehr zur Installation von CloudMensis verwendet wird. Dies könnte erklären, warum dieser Code nicht mehr aufgerufen wird. Es deutet allerdings auch darauf hin, dass CloudMensis möglicherweise schon seit vielen Jahren existiert.

Abbildung 5. Dekompilierter Code, der zeigt, wie CloudMensis die EFI-Partition mountet

Abbildung 6. Senden einer XPC-Nachricht an speechsynthesisd

Der Spionageagent

Die zweite Stufe von CloudMensis ist eine viel größere Komponente, die mit einer Reihe von Funktionen ausgestattet ist, um Informationen von dem kompromittierten Mac zu sammeln. Die Absicht der Angreifer besteht hier eindeutig darin, Dokumente, Screenshots, E-Mail-Anhänge und andere sensible Daten zu stehlen.

CloudMensis nutzt Cloud-Speicher sowohl für den Empfang von Befehlen von seinen Betreibern als auch für das Exfiltrieren von Dateien. Er unterstützt drei verschiedene Anbieter: pCloud, Yandex Disk und Dropbox. Die im analysierten Sample enthaltene Konfiguration enthält Authentifizierungstoken für pCloud und Yandex Disk.

Konfiguration

Eines der ersten Dinge, die der CloudMensis-Spionageagent tut, ist das Laden seiner Konfiguration. Dabei handelt es sich um eine binäre Struktur, die 14.972 Byte lang ist. Sie wird auf der Festplatte unter ~/Library/Preferences/com.apple.iTunesInfo29.plist gespeichert und durch ein einfaches XOR mit einem generierten Schlüssel verschlüsselt (siehe Abschnitt "Benutzerdefinierte Verschlüsselung").

Wenn diese Datei noch nicht vorhanden ist, wird die Konfiguration mit im Malware-Sample hartkodierten Standardwerten gefüllt. Darüber hinaus wird auch versucht, Werte aus früheren Versionen der CloudMensis-Konfiguration zu importieren:

  • ~/Library/Preferences/com.apple.iTunesInfo28.plist
  • ~/Library/Preferences/com.apple.iTunesInfo.plist

Die Konfiguration enthält Folgendes:

  • Welche Cloud-Speicheranbieter verwendet werden sollen und entsprechende Authentifizierungs-Token
  • Eine zufällig generierte Bot-Kennung
  • Informationen über den Mac
  • Pfade zu verschiedenen von CloudMensis verwendeten Verzeichnissen
  • Dateierweiterungen, die für die Angreifer von Interesse sind

Die Standardliste der Dateierweiterungen, die im untersuchten Sample gefunden wurde (siehe Abbildung 7), zeigt, dass die Betreiber an Dokumenten, Tabellenkalkulationen, Audioaufnahmen, Bildern und E-Mail-Nachrichten auf den Macs der Opfer interessiert sind. Das wohl ungewöhnlichste Format sind Audioaufnahmen mit dem Adaptive Multi-Rate Codec (mit den Erweiterungen .amr und .3ga), der speziell für die Sprachkompression entwickelt wurde. Weitere interessante Dateierweiterungen in dieser Liste sind .hwp- und .hwpx-Dateien, bei denen es sich um Dokumente für Hangul Office (jetzt Hancom Office) handelt, ein im Koreanischen Sprachraum beliebtes Textverarbeitungsprogramm.

Abbildung 7. In der Standardkonfiguration von CloudMensis gefundene Dateierweiterungen

Benutzerdefinierte Verschlüsselung

CloudMensis implementiert seine eigene Verschlüsselungsfunktion, die von den Autoren FlowEncrypt genannt wird. Abbildung 8 zeigt die disassemblierte Funktion. Sie nimmt ein einzelnes Byte als Seed und generiert den Rest des Schlüssels, indem sie eine Reihe von Operationen mit dem zuletzt generierten Byte durchführt.  Die Eingabe wird mit diesem Keystream XOR-verschlüsselt. Letztendlich ist der Wert des aktuellen Bytes derselbe wie einer der vorherigen Werte, so dass der Keystream eine Schleife bildet. Das bedeutet, dass die Chiffre, auch wenn sie komplex erscheint, auf eine XOR-Verknüpfung mit einem statischen Schlüssel vereinfacht werden kann (mit Ausnahme der ersten paar Bytes des Keystreams, bevor die Schleife beginnt).

Abbildung 8. Disassemblierte FlowEncrypt-Methode

Umgehung von TCC

Seit der Veröffentlichung von macOS Mojave (10.14) im Jahr 2018 wird der Zugriff auf einige sensible Eingaben wie Bildschirmaufnahmen, Kameras, Mikrofone und Tastaturereignisse durch ein System namens TCC geschützt, das für "Transparency, Consent and Control" steht. Wenn eine Anwendung versucht, auf bestimmte Funktionen zuzugreifen, fragt macOS den Benutzer, ob die Anfrage der Anwendung legitim ist. Er kann dann den Zugriff gewähren oder verweigern. Diese TCC-Regeln werden in einer Datenbank auf dem Mac gespeichert. Die Datenbank ist durch den Systemintegritätsschutz (SIP) geschützt, um sicherzustellen, dass nur der TCC-Daemon Änderungen vornehmen kann.

CloudMensis verwendet zwei Techniken, um TCC zu umgehen (und vermeidet so die Aufforderung an den Benutzer). Sie erhält so Zugriff auf den Bildschirm, kann Wechseldatenträger nach interessanten Dokumenten durchsuchen und Tastaturereignisse protokollieren. Wenn SIP deaktiviert ist, ist die TCC-Datenbank (TCC.db) nicht mehr vor Manipulationen geschützt. Daher fügt CloudMensis in diesem Fall Einträge hinzu, um sich selbst Berechtigungen zu erteilen, bevor sie sensible Eingaben verwendet. Wenn SIP aktiviert ist, aber auf dem Mac eine Version von macOS Catalina vor 10.15.6 läuft, nutzt CloudMensis eine Sicherheitslücke aus, um den TCC-Daemon (tccd) dazu zu bringen, eine Datenbank zu laden, in die CloudMensis schreiben kann. Diese Schwachstelle ist als CVE-2020-9934 bekannt und wurde von Matt Shockley im Jahr 2020 gemeldet und beschrieben.

Der Exploit erstellt zunächst eine neue Datenbank unter ~/Library/Application Support/com.apple.spotlight/Library/Application Support/com.apple.TCC/, sofern diese nicht bereits erstellt wurde, wie in Abbildung 9 dargestellt.

Abbildung 9. Prüfung, ob die gefälschte TCC-Datenbankdatei bereits existiert

Dann wird die Umgebungsvariable HOME mit launchctl setenv auf ~/Library/Application Support/com.apple.spotlight gesetzt, so dass der TCC-Daemon die alternative Datenbank anstelle der legitimen lädt. Abbildung 10 zeigt, wie dies mit NSTask gemacht wird.

Abbildung 10. Ändern der HOME-Umgebungsvariable, die von launchd verwendet wird, mit launchctl und Neustart von tccd

Kommunication mit dem C&C Server

Um mit den Betreibern zu kommunizieren, enthält die CloudMensis-Konfiguration Authentifizierungstoken für mehrere Cloud-Dienstanbieter. Jeder Eintrag in der Konfiguration wird für einen anderen Zweck verwendet. Sie alle können jeden von CloudMensis unterstützten Anbieter verwenden. In dem analysierten Beispiel werden Dropbox, pCloud und Yandex Disk unterstützt.

Der erste Speicher, der von den Malware-Autoren entsprechend dem Namen der globalen Variable CloudCmd genannt wird, dient dazu, an Bots übertragene Befehle und deren Ergebnisse zu speichern. Ein anderer, den sie CloudData nennen, wird verwendet, um Informationen von dem kompromittierten Mac zu stehlen. Eine dritte, die CloudShell genannt wird, dient zum Speichern von Shell-Befehlsausgaben. Diese letzte Variante verwendet jedoch die gleichen Einstellungen wie CloudCmd.

Bevor CloudMensis versucht, Remote-Dateien abzurufen, lädt es zunächst einen RSA-verschlüsselten Bericht über den kompromittierten Mac nach /January/ auf CloudCmd hoch. Dieser Bericht enthält sogenannte "Shared Secrets" wie eine Bot-Kennung und ein Passwort zur Entschlüsselung der zu extrahierenden Daten.

Um Befehle zu erhalten, holt CloudMensis dann Dateien aus dem folgenden Verzeichnis im CloudCmd-Speicher ab: /Febrary/<bot_id>/May/. Jede Datei wird heruntergeladen, entschlüsselt und an die Methode AnalizeCMDFileName weitergeleitet. Beachten Sie, dass sowohl "February" als auch "Analyze" von den Malware-Autoren falsch geschrieben wurden.

Der CloudData-Speicher wird zum Hochladen größerer Dateien verwendet, die von den Angreifern angefordert werden. Vor dem Hochladen werden die meisten Dateien zu einem passwortgeschützten ZIP-Archiv hinzugefügt. Das Passwort wird beim ersten Start von CloudMensis erzeugt, in der Konfiguration gespeichert und mit dem ersten Bericht an die Betreiber übermittelt.

Kommandos

Im von uns analysierten CloudMensis-Sample sind 39 Befehle implementiert. Sie sind durch eine Nummer zwischen 49 und 93 gekennzeichnet, mit Ausnahme von 57, 78, 87 und 90 bis 92. Einige Befehle erfordern zusätzliche Argumente. Mit den Befehlen können die Operatoren Aktionen durchführen wie:

  • Ändern der Werte in der CloudMensis-Konfiguration: Cloud-Anbieter und Authentifizierungs-Token, als interessant erachtete Dateierweiterungen, Abfragefrequenz des Cloud-Speichers usw.
  • Auflistung laufender Prozesse
  • Start einer Bildschirmaufnahme
  • Auflistung von E-Mail-Nachrichten und Anhängen
  • Auflistung von Wechselmedien
  • Ausführen von Shell-Befehlen und Hochladen der Ausgabe in einen Cloud-Speicher
  • Herunterladen und Ausführen beliebiger Dateien

Abbildung 11 zeigt den Befehl mit der Kennung 84, der alle von launchd geladenen Aufträge auflistet und die Ergebnisse sofort oder später hochlädt, je nach dem Wert seines Arguments.

Abbildung 11. Befehl 84 führt launchctl list aus, um launchd Aufträge anzuzeigen

Abbildung 12 zeigt ein komplexeres Beispiel. Der Befehl mit der Kennung 60 wird verwendet, um eine Bildschirmaufnahme zu starten. Wenn das erste Argument 1 ist, ist das zweite Argument eine URL zu einer Datei, die von startScreenCapture heruntergeladen, gespeichert und ausgeführt wird. Diese externe ausführbare Datei wird als windowserver im Library-Ordner des Sandbox-Containers von FaceTime gespeichert. Ist das erste Argument gleich Null, wird die bereits vorhandene Datei gestartet, die zuvor abgelegt wurde. Wir konnten leider keine Samples für diesen Screen-Capture-Agenten finden.

Abbildung 12. Befehl 60: Starten einer Bildschirmaufnahme

Interessanterweise sind Eigenschaftslistendateien, die launchd zum Starten neuer Prozesse veranlassen, wie z. B. com.apple.windowServer.plist, nicht beständig: Sie werden von der Festplatte gelöscht, nachdem sie von launchd geladen wurden.

Metadaten aus Cloud-Speichern

Die Metadaten der von CloudMensis verwendeten Cloud-Speicher enthüllen interessante Details über den Betrieb. Abbildung 13 zeigt die Baumansicht des Speichers, der von CloudMensis verwendet wird, um den anfänglichen Bericht zu senden und Befehle an die Bots zu übermitteln (Stand: 22. April 2022).

Abbildung 13. Baumansicht der Verzeichnisliste aus dem CloudCmd-Speicher

Diese Metadaten ermöglichten einen teilweisen Einblick in den Vorgang und halfen, einen Zeitplan zu erstellen. Zunächst wurden die pCloud-Konten am 19. Januar 2022 erstellt. Die Verzeichnisliste vom 22. April zeigt, dass 51 eindeutige Bot-Identifikatoren Unterverzeichnisse im Cloud-Speicher erstellt haben, um Befehle zu empfangen. Da diese Verzeichnisse erstellt werden, wenn die Malware zum ersten Mal gestartet wird, können wir ihr Erstellungsdatum verwenden, um das Datum der ersten Kompromittierung zu bestimmen, wie in Abbildung 14 zu sehen ist.

Abbildung 14. Erstellungsdaten der Unterverzeichnisse unter /Febrary (sic)

Dieses Diagramm zeigt eine Spitze von Kompromittierungen Anfang März 2022, wobei die erste am 4. Februar auftrat. Die letzte Spitze kann durch Analysen in unabhängigen Sandboxen erklärt werden, in denen CloudMensis ausgeführt wurde, nachdem es auf VirusTotal hochgeladen wurde.

Fazit

CloudMensis ist eine Bedrohung für Mac-Benutzer, aber seine sehr begrenzte Verbreitung lässt vermuten, dass sie als Teil einer gezielten Operation eingesetzt wird. Nach dem was wir gesehen haben setzen die Betreiber dieser Malware-Familie CloudMensis für bestimmte Ziele ein, die für sie von Interesse sind. Die Nutzung von Schwachstellen zur Umgehung von macOS-Abwehrmechanismen zeigt, dass die Malware-Betreiber aktiv versuchen, den Erfolg ihrer Spionageoperationen zu maximieren. Gleichzeitig wurden bei unseren Untersuchungen keine nicht offengelegten Schwachstellen (Zero-Days) gefunden, die von dieser Gruppe genutzt werden. Es wird daher empfohlen, einen aktuellen Mac zu verwenden, um zumindest die Umgehung der Sicherheitsmaßnahmen zu vermeiden.

Wir wissen immer noch nicht, wie CloudMensis ursprünglich verbreitet wird und wer die Ziele sind. Die allgemeine Qualität des Codes und die fehlende Verschleierung lassen darauf schließen, dass die Autoren mit der Mac-Entwicklung nicht sehr vertraut sind. Nichtsdestotrotz wurden viele Ressourcen darauf verwendet, CloudMensis zu einem leistungsfähigen Spionagetool und zu einer Bedrohung für potenzielle Ziele zu machen.

IoCs

Dateien

SHA-1 Filename Description ESET detection name
D7BF702F56CA53140F4F03B590E9AFCBC83809DB mdworker3 Downloader (execute) OSX/CloudMensis.A
0AA94D8DF1840D734F25426926E529588502BC08 WindowServer, myexe Spy agent (Client) OSX/CloudMensis.A
C3E48C2A2D43C752121E55B909FC705FE4FDAEF6 WindowServer, MyExecute Spy agent (Client) OSX/CloudMensis.A

Public key

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsGRYSEVvwmfBFNBjOz+Q
pax5rzWf/LT/yFUQA1zrA1njjyIHrzphgc9tgGHs/7tsWp8e5dLkAYsVGhWAPsjy
1gx0drbdMjlTbBYTyEg5Pgy/5MsENDdnsCRWr23ZaOELvHHVV8CMC8Fu4Wbaz80L
Ghg8isVPEHC8H/yGtjHPYFVe6lwVr/MXoKcpx13S1K8nmDQNAhMpT1aLaG/6Qijh
W4P/RFQq+Fdia3fFehPg5DtYD90rS3sdFKmj9N6MO0/WAVdZzGuEXD53LHz9eZwR
9Y8786nVDrlma5YCKpqUZ5c46wW3gYWi3sY+VS3b2FdAKCJhTfCy82AUGqPSVfLa
mQIDAQAB
-----END PUBLIC KEY-----

Verwendete Pfade

  • /Library/WebServer/share/httpd/manual/WindowServer
  • /Library/LaunchDaemons/.com.apple.WindowServer.plist
  • ~/Library/Containers/com.apple.FaceTime/Data/Library/windowserver
  • ~/Library/Containers/com.apple.Notes/Data/Library/.CFUserTextDecoding
  • ~/Library/Containers/com.apple.languageassetd/loginwindow
  • ~/Library/Application Support/com.apple.spotlight/Resources_V3/.CrashRep

MITRE ATT&CK Techniken

This table was built using version 11 of the MITRE ATT&CK framework.

Tactic ID Name Description
Persistence T1543.004 Create or Modify System Process: Launch Daemon The CloudMensis downloader installs the second stage as a system-wide daemon.
Defense Evasion T1553 Subvert Trust Controls CloudMensis tries to bypass TCC if possible.
Collection T1560.002 Archive Collected Data: Archive via Library Archive Collected Data: Archive via Library CloudMensis uses SSZipArchive to create a password-protected ZIP archive of data to exfiltrate.
T1056.001 Input Capture: Keylogging CloudMensis can capture and exfiltrate keystrokes.
T1113 Screen Capture CloudMensis can take screen captures and exfiltrate them.
T1005 Data from Local System CloudMensis looks for files with specific extensions.
T1025 Data from Removable Media CloudMensis can search removable media for interesting files upon their connection.
T1114.001 Email Collection: Local Email Collection CloudMensis searches for interesting email messages and attachments from Mail.
Command and Control T1573.002 Encrypted Channel: Asymmetric Cryptography The CloudMensis initial report is encrypted with a public RSA-2048 key.
T1573.001 Encrypted Channel: Symmetric Cryptography CloudMensis encrypts exfiltrated files using password-protected ZIP archives.
T1102.002 Web Service: Bidirectional Communication CloudMensis uses Dropbox, pCloud, or Yandex Drive for C&C communication.
Exfiltration T1567.002 Exfiltration Over Web Service: Exfiltration to Cloud Storage CloudMensis exfiltrates files to Dropbox, pCloud, or Yandex Drive.

 

Haben Sie Fragen und Anregungen zu diesem, anderen oder zukünftigen Themen, die Sie gern betrachtet sehen wollen? Dann nutzen Sie gern die Kommentarfunktion unter diesem Artikel oder nutzen unser Kontaktformular!