Skip to main content

SourMint: Schadcode, Anzeigenbetrug und Datenleck unter iOS

Artikel von
blog tumbnail

24. August 2020

0 Min. Lesezeit

UPDATE: Zusätzlich zu den ursprünglich offengelegten Erkenntnissen haben wir weitere Bedenken hinsichtlich der iOS- und Android-Versionen des SDK festgestellt. Lesen Sie hier mehr über die aktualisierten Erkenntnisse und die Reaktionen von Apple, Google und der Community.

Das Snyk-Forschungsteam hat bösartiges Verhalten in einem beliebten Advertising-SDK entdeckt, das von über 1.200 Apps im AppStore verwendet wird. Branchenschätzungen zufolge kommen diese Apps auf mehr als 300 Millionen Downloads pro Monat.

Der Schadcode wurde in iOS-Versionen des SDK des chinesischen mobilen Werbeplattform-Anbieters Mintegral gefunden. Er ist dort seit Juli 2019 enthalten. Der Schadcode kann die Aktivitäten von Nutzern ausspionieren, indem er URL-basierte Anfragen protokolliert, die über die App gestellt werden. Diese Aktivitäten werden auf einem Drittanbieter-Server protokolliert und könnten personenbezogene Daten (PII) sowie andere vertrauliche Informationen enthalten. Darüber hinaus meldet das SDK Nutzerklicks auf Anzeigen betrügerisch und entwendet so potenzielle Einnahmen konkurrierender Werbenetzwerke und in einigen Fällen auch der Entwickler bzw. Herausgeber der App.


https://www.youtube.com/watch?v=MMuL5MaQeLM


Allgemeine Beschreibung des SourMint-Schadcodes

Das Mintegral-SDK präsentiert sich als Tool, mit dem App-Entwickler und Werbetreibende monetarisierte, werbefinanzierte Marketingangebote erstellen können. Unsere Untersuchungen und die Zusammenarbeit mit Experten aus der mobilen Werbebranche haben jedoch gezeigt, dass bestimmter Schadcode im SDK potenzielle Einnahmen anderer Werbenetzwerke entwendet, die von der App verwendet werden könnten, und URL-basierte Anfragen ausspioniert, die innerhalb der App gestellt werden.

Entwickler können sich auf der Mintegral-Website als Publisher registrieren und das SDK herunterladen. Nach dem Laden fügt das SDK Code in Standard-iOS-Funktionen der App ein, die ausgeführt werden, wenn die App eine URL öffnet – einschließlich App-Store-Links. Dadurch erhält das SDK Zugriff auf eine erhebliche Menge an Daten und potenziell sogar auf private Nutzerinformationen. Außerdem untersucht das SDK gezielt diese Ereignisse zum Öffnen von URLs, um festzustellen, ob das SDK eines konkurrierenden Werbenetzwerks die Aktivität ausgelöst hat.

Interessanterweise enthält das Mintegral-SDK auch eine Reihe von Anti-Debugging-Schutzmaßnahmen, die offenbar verhindern sollen, dass Forschende das tatsächliche Verhalten der App aufdecken. Im Code gibt es eine spezielle Routine, die festzustellen versucht, ob das Smartphone gerootet ist und ob Debugger- oder Proxy-Tools verwendet werden. Findet das SDK Hinweise darauf, dass es überwacht wird, verändert es sein Verhalten offenbar, um seine schädlichen Aktivitäten zu verschleiern. Dadurch kann das SDK möglicherweise auch Apples App-Prüfung bestehen, ohne entdeckt zu werden.

Flussdiagramm, das zeigt, wie das Mintegral-SDK einen Anzeigenklick abfängt, falsche Klickinformationen sendet und eine Attribution erhält.
Abbildung 1: Funktionsablauf der Entführung eines Anzeigenklicks durch das Mintegral SDK

Anzeigenbetrug

Das Hauptziel des von Snyk in diesem SDK entdeckten Schadcodes scheint darin zu bestehen, Klicks auf Anzeigen innerhalb der App abzufangen. In mobilen Apps werden Anzeigen oft von Werbenetzwerken bereitgestellt, die Entwickler in ihren Code integrieren.

Werbetreibende zahlen den Werbenetzwerken dafür, ihre Anzeigen zu schalten. Die Kosten richten sich nach der Anzeigenleistung, also etwa danach, ob Nutzer auf eine Anzeige klicken, um die Website des Werbetreibenden zu besuchen oder dessen App zu installieren. Die App-Entwickler erhalten einen Anteil der Einnahmen, die das Werbenetzwerk von den Werbetreibenden erzielt.

App-Herausgeber binden häufig über Werbevermittler SDKs mehrerer Werbenetzwerke in ihre Apps ein. Diese Vermittler optimieren die Einnahmen des App-Herausgebers, indem sie mehrere Werbenetzwerke einbeziehen und anhand von Leistungskennzahlen auswählen, welches Netzwerk die jeweilige Anzeigenanfrage bedient.

Das Mintegral-SDK kann jedoch sämtliche Anzeigenklicks (und auch andere URL-Klicks) innerhalb der App abfangen. Diese Informationen nutzt es, um gefälschte Klickmeldungen an den Attribution-Anbieter zu senden. Dadurch wird der Eindruck erweckt, der Anzeigenklick sei über das Mintegral-Netzwerk erfolgt – selbst wenn die Anzeige von einem konkurrierenden Werbenetzwerk geschaltet wurde.

Mintegral kann konkurrierenden Werbenetzwerken auf zwei wesentliche Arten Werbeeinnahmen stehlen. Erstens entwendet Mintegral Werbeeinnahmen, die den anderen Netzwerken zugestanden hätten. Dazu beansprucht das Unternehmen die Attribution für Klicks, die nicht auf einer von Mintegral geschalteten Anzeige erfolgt sind. Dies scheint das Hauptziel dieser schädlichen Funktion zu sein.

Eine weitere Folge könnte sein, dass Entwickler oder das Vermittler-SDK feststellen, dass Mintegral besser abschneidet als andere Werbenetzwerke. Dadurch könnte Mintegral bei der Auswahl gegenüber konkurrierenden Netzwerken bevorzugt werden.

Auch wenn Mintegral nicht zum Schalten von Anzeigen verwendet wird, könnten App-Entwickler oder -Herausgeber Einnahmen verlieren. Unsere Untersuchung ergab, dass das Mintegral-SDK Klicks abfängt, sobald es in eine App integriert ist – selbst wenn Mintegral nicht zum Schalten von Anzeigen aktiviert wurde. In diesem Fall werden Werbeeinnahmen, die über ein konkurrierendes Netzwerk an den Entwickler oder Herausgeber hätten fließen sollen, diesem nie ausgezahlt.

Gefährdung der Privatsphäre durch Datenlecks

Anzeigenbetrug scheint zwar das Hauptziel des Schadcodes zu sein, ist aber möglicherweise nicht seine schwerwiegendste Folge. Im Zuge unserer Untersuchungen stellte Snyk außerdem fest, dass das Mintegral-SDK Details zu jeder URL-basierten Anfrage erfasst, die innerhalb der kompromittierten App gestellt wird.

Informationen zu diesen Anfragen sowie weitere Geräte- und App-Daten werden anschließend an einen Remote-Protokollierungsserver gesendet. Das SDK greift auf zahlreiche Informationen zu, darunter:

  • die angeforderte URL, die möglicherweise Kennungen oder andere vertrauliche Informationen enthält

  • die Header der Anfrage, die Authentifizierungstoken und andere vertrauliche Informationen enthalten könnten

  • die Stelle im App-Code, von der die Anfrage ausging und die Hinweise auf Nutzungsgewohnheiten geben könnte

  • die Identifier for Advertisers (IDFA) des Geräts – eine eindeutige Zufallszahl zur Identifizierung des Geräts – sowie dessen eindeutige Hardware-Kennung, die IMEI.

Zu den vom SDK erfassten Anfragen gehören Web-URLs, Anfragen über benutzerdefinierte URL-Schemata (Protokollhandler) und In-App-Aufrufe des App Store.

Abgesehen von der Attribution von Anzeigenklicks ist unklar, ob und wie diese Daten nach dem Hochladen auf den Protokollierungsserver verwendet werden. Zumindest ermöglichen die erfassten Daten eine detaillierte Analyse der Nutzeraktivitäten innerhalb der App. Noch bedenklicher ist, dass die gesammelten URLs und sonstigen Daten je nach Art der kompromittierten App möglicherweise private Informationen offenlegen. Letztlich könnte Mintegral solche Daten durch den Verkauf an Dritte für Analysezwecke monetarisieren.

Die Protokollierung großer Mengen sensibler Nutzerdaten ist besonders bemerkenswert angesichts der wachsenden Bedenken darüber, wie mobile Apps generell Daten erheben. Zuletzt stand die TikTok-App wegen ihrer Datenerfassungspraktiken verstärkt in der Kritik.

Die Versuche von Mintegral, die Art der erfassten Daten durch Manipulationsschutz und ein proprietäres Kodierungsverfahren zu verschleiern, erinnern an ähnliche Funktionen, über die Forschende bei der Analyse der TikTok-App berichtet haben.

Im Fall von SourMint werden mehr Daten erfasst, als für eine legitime Klick-Attribution erforderlich wären. Zudem nutzt die App fragwürdige Programmiermethoden, um diesen Zugriff auf Daten zu erreichen.

Technische Details zum Exploit und Abhilfemaßnahmen

Wie funktioniert dieser Angriff mit Schadcode genau? Sehen wir uns die Details an, die wir bei unseren Untersuchungen aufgedeckt haben.

Entwickler können das SDK von der Mintegral-Website herunterladen und in ihre App integrieren. Bei der Initialisierung sendet das SDK mehrere Anfragen an den Mintegral-Server. Eine davon erhält eine JSON-Antwort mit verschiedenen Parametern, die der Schadcode in der App direkt verwendet. Dazu gehören:

  • ein Schalter zum Aktivieren oder Deaktivieren der Manipulations- und Debugging-Erkennung

  • ein Schalter zum Aktivieren der Hooks, mit denen URL-Klicks erfasst und protokolliert werden

  • eine (kodierte) URL, an die Aktivitäten zu Nutzerklicks protokolliert werden

Das abgerufene Einstellungs-JSON enthält außerdem einen Zahlenwert, der die Verzögerung bis zur nächsten Einstellungsaktualisierung angibt. Das weist darauf hin, dass sich SDK-Einstellungen aus der Ferne aktualisieren lassen.

Wie bereits erwähnt, führt das SDK einige grundlegende Schritte zur Erkennung von Manipulationen aus. Es prüft, ob folgende Bedingungen zutreffen:

  • die App läuft in einem Simulator

  • an den App-Prozess ist ein Debugger angehängt

  • das Smartphone ist gerootet (durch Prüfung auf verschiedene Dateien, darunter die Cydia-App)

  • ein Proxy ist aktiviert

Stellt das SDK fest, dass eine der oben genannten Bedingungen erfüllt ist, setzt es ein Flag, das in anderen SDK-Funktionen verwendet wird, und ändert sein Verhalten. Dadurch scheint die schädliche Aktivität – das Umschreiben von URLs und Protokollieren von Nutzerdaten – deaktiviert zu werden. Offenbar soll so verhindert werden, dass die schädlichen Aktivitäten des SDK entdeckt werden.

Zur Laufzeit verwendet das SDK Method Swizzling, um Schadcode in die Implementierungen zahlreicher Methoden und Handler einzuschleusen. Diese Hooks ermöglichen es, jede URL-basierte Anfrage abzufangen, die innerhalb der App gestellt wird – auch solche, die außerhalb des Mintegral-SDK auftreten. Dieser entscheidende Schritt ermöglicht dem SDK, die nötigen Informationen zu Nutzerklicks zu sammeln und erfolgreich eine Klickmeldung an den Attribution-Anbieter zu erstellen. Zu den Methoden, die das SDK mit eigenem Code überschreibt, gehört:

  • UIAplication OpenURL

  • UIAplication OpenURL:options: completionHandler (nach einer Prüfung, ob die App unter iOS 10.x oder höher läuft)

  • NSURLProtocol

  • SKStoreProductViewController loadProductwithParameters:completionBlock

Wird eine der oben genannten Methoden aufgerufen, führt der vom SDK eingeschleuste Code mehrere Schritte aus. Zunächst prüft das SDK, ob das Manipulationsschutz-Flag gesetzt ist. Ist dies der Fall, wird der gesamte nachfolgende Mintegral-Code übersprungen. Anschließend prüft das SDK, ob die Anfrage von einer über Mintegral geschalteten Marketinganzeige oder von einem Konkurrenten stammt. Stammt sie von einer Mintegral-Anzeige, wird der normale Methoden-Handler ohne weitere Aktion aufgerufen.

Stammt die Anfrage aus einer Nicht-Mintegral-Methode, sammelt der Code Informationen über das Ereignis: die URL, die Anfrage-Header, die Klasse, in der der Klick erfolgte, die Methode, in der er ausgelöst wurde, sowie zusätzliche Backtrace-Daten. Diese Informationen zur Anfrage und weitere Gerätedaten werden in kodierter Form an den in der Einstellungsdatei angegebenen Mintegral-Protokollierungsserver gesendet. Zu den protokollierten Daten gehören:

  • Betriebssystemversion

  • IP-Adresse

  • Ladestatus

  • Mintegral-SDK-Version

  • Netzwerktyp

  • Modell

  • Paketname

  • IDFA

  • URL

  • Anfrage-Header

  • Methodenname

  • Klassenname

  • Backtrace-Daten

Nachdem die Daten bei Mintegral protokolliert wurden, wird die Ausführung der restlichen Methode wie gewohnt fortgesetzt. Anhand von Berichten eines Attribution-Anbieters können wir bestätigen, dass Mintegral im Backend Klickmeldungen für Kontaktpunkte erstellt, die über andere Werbenetzwerke zustande gekommen sind.

Um diese Informationen aufzudecken, integrierte das Snyk Security Research Team das SDK in eine Test-App. Um die Manipulationserkennung zu umgehen, wurden die App-Kommunikationen am WLAN-Zugangspunkt mithilfe eines Man-in-the-Middle-Proxys abgefangen (mitm.it). Snyk untersuchte den SDK-Code mit dem Hopper-Disassembler und analysierte dessen Funktionen. Wir konnten diese schädliche Funktionalität in SDK-Versionen bis zurück zu 5.5.1 nachweisen (zum Zeitpunkt der Veröffentlichung ist Version 6.4.0 aktuell).

Durch unsere internen Untersuchungen und die Zusammenarbeit mit wichtigen Organisationen und Branchenexperten konnten wir letztlich das vollständige Abfangen von Anzeigenklicks der Nutzer bestätigen.


Eine noch ausführlichere technische Beschreibung des entdeckten Codes und der verwendeten Methoden finden Sie in unserem Forschungsbericht.