SourMint : code malveillant, fraude publicitaire et fuite de données sur iOS
24 août 2020
0 minutes de lectureMISE À JOUR : En plus des éléments que nous avons initialement révélés, nous avons identifié d’autres problèmes dans les versions iOS et Android du SDK. Découvrez les nouveaux éléments et les réactions d’Apple, de Google et de la communauté ici.
L’équipe de recherche de Snyk a découvert un comportement malveillant dans un SDK publicitaire populaire utilisé par plus de 1 200 applications de l’App Store, qui représentent plus de 300 millions de téléchargements par mois, selon les estimations d’experts du secteur.
Le code malveillant a été découvert dans les versions iOS du SDK du fournisseur chinois de plateforme de publicité mobile Mintegral, et remonte à juillet 2019. Le code malveillant peut espionner l’activité des utilisateurs en enregistrant les requêtes basées sur des URL effectuées depuis l’application. Cette activité est consignée sur un serveur tiers et pourrait inclure des informations permettant d’identifier personnellement les utilisateurs (PII) ainsi que d’autres informations sensibles. En outre, le SDK signale frauduleusement les clics des utilisateurs sur des publicités, détournant ainsi des revenus potentiels aux réseaux publicitaires concurrents et, dans certains cas, au développeur ou à l’éditeur de l’application.
https://www.youtube.com/watch?v=MMuL5MaQeLM
Description générale du code malveillant SourMint
Le SDK Mintegral se présente comme un outil permettant aux développeurs d’applications et aux annonceurs de créer des campagnes marketing monétisées reposant sur la publicité. Cependant, grâce à nos recherches et à notre collaboration avec des experts du secteur de la publicité mobile, l’équipe de Snyk a découvert que certains codes malveillants du SDK détournent des revenus potentiels à d’autres réseaux publicitaires que l’application est susceptible d’utiliser et espionnent toutes les requêtes basées sur des URL effectuées depuis l’application.
Les développeurs peuvent s’inscrire en tant qu’éditeurs et télécharger le SDK depuis le site de Mintegral. Une fois chargé, le SDK injecte du code dans des fonctions iOS standard de l’application, exécutées lorsque celle-ci ouvre une URL, notamment des liens vers des boutiques d’applications. Le SDK peut ainsi accéder à une quantité importante de données, voire à des informations potentiellement privées sur les utilisateurs. Il examine également ces événements d’ouverture d’URL afin de déterminer si l’activité provient du SDK d’un réseau publicitaire concurrent.
Il est intéressant de noter que le SDK Mintegral contient également plusieurs protections anti-débogage qui semblent conçues pour empêcher les chercheurs de découvrir le véritable comportement de l’application. Le code comporte une routine particulière qui tente de déterminer si le téléphone est jailbreaké et si un débogueur ou des outils proxy sont utilisés. S’il détecte qu’il est surveillé, le SDK modifie son comportement, apparemment pour masquer ses activités malveillantes. Cela peut également l’aider à passer l’examen des applications d’Apple sans être détecté.

Fraude publicitaire
Le principal objectif du code malveillant découvert par Snyk dans ce SDK semble être le détournement des clics des utilisateurs sur les publicités dans l’application. Dans les applications mobiles, les publicités sont souvent diffusées par des réseaux publicitaires que le développeur intègre à son code.
Les annonceurs rémunèrent les réseaux publicitaires pour diffuser leurs publicités et paient en fonction de leurs performances (c’est-à-dire de leur capacité à inciter les utilisateurs à cliquer sur une publicité pour visiter le site de l’annonceur ou installer son application). Les développeurs d’applications reçoivent une part des revenus générés par le réseau publicitaire grâce aux annonceurs.
Il est courant que les éditeurs d’applications intègrent des SDK de plusieurs réseaux publicitaires à leurs applications par l’intermédiaire de médiateurs publicitaires. Ces médiateurs optimisent les revenus de l’éditeur en intégrant plusieurs réseaux, puis en sélectionnant celui qui sera utilisé pour chaque demande publicitaire, en fonction de leurs indicateurs de performance.
Le SDK Mintegral peut toutefois intercepter tous les clics sur les publicités (ainsi que les autres clics sur des URL) dans l’application. Il se sert de ces informations pour envoyer de fausses notifications de clic au fournisseur d’attribution. Ces notifications donnent l’impression que le clic publicitaire provient de son réseau, même si la publicité a pu être diffusée par un réseau concurrent.
Mintegral peut détourner les revenus publicitaires des réseaux concurrents de deux manières principales. Tout d’abord, Mintegral détourne les revenus des annonceurs qui auraient dû revenir aux autres réseaux publicitaires, en revendiquant simplement l’attribution de clics qui n’ont pas eu lieu sur une publicité diffusée par Mintegral. Cela semble être l’objectif principal de cette fonctionnalité malveillante.
Une conséquence indirecte pourrait être que le développeur ou le SDK du médiateur constate que Mintegral est plus performant que les autres réseaux publicitaires, ce qui l’inciterait à privilégier Mintegral par rapport à ses concurrents.
Le développeur ou l’éditeur de l’application peut également perdre des revenus, même si Mintegral n’est pas utilisé pour diffuser des publicités. Au cours de notre enquête, nous avons découvert qu’une fois intégré à une application, le SDK Mintegral intercepte les clics même si Mintegral n’est pas activé pour diffuser des publicités. Dans ce cas, les revenus publicitaires qui auraient dû revenir au développeur ou à l’éditeur par l’intermédiaire d’un réseau concurrent ne lui seront jamais versés.
Atteintes à la confidentialité liées à la fuite de données
La fraude publicitaire semble être l’objectif principal du code malveillant, mais ce n’est peut-être pas sa conséquence la plus grave. Nos recherches ont également révélé que le SDK Mintegral recueille des informations sur chaque requête basée sur une URL effectuée depuis l’application compromise.
Les informations relatives à ces requêtes, ainsi que d’autres données sur l’appareil et l’application, sont ensuite envoyées à un serveur de journalisation distant. Le SDK accède à un grand nombre d’informations, notamment :
l’URL demandée, qui pourrait contenir des identifiants ou d’autres informations sensibles
les en-têtes de la requête, qui pourraient contenir des jetons d’authentification et d’autres informations sensibles
l’emplacement dans le code de l’application où la requête a été générée, ce qui pourrait aider à identifier les habitudes des utilisateurs
l’identifiant publicitaire de l’appareil (IDFA), un numéro aléatoire unique utilisé pour identifier l’appareil, ainsi que son identifiant matériel unique, l’IMEI.
Les requêtes capturées par le SDK comprennent les URL Web, les requêtes utilisant des schémas d’URL personnalisés (gestionnaires de protocoles) et les appels à l’App Store depuis l’application.
Au-delà de l’attribution des clics publicitaires, on ne sait pas si ces données sont utilisées après leur envoi au serveur de journalisation, ni comment. À tout le moins, les données recueillies permettraient d’analyser en détail le parcours des utilisateurs dans l’application. Plus inquiétant encore, selon la nature de l’application compromise, les URL et autres données collectées pourraient révéler des informations privées. Enfin, Mintegral pourrait monétiser ces données en les vendant à des tiers à des fins d’analyse.
Cette collecte de grandes quantités de données sensibles sur les utilisateurs est particulièrement préoccupante, compte tenu des inquiétudes croissantes concernant la manière dont les applications mobiles recueillent des données en général. Tout récemment, l’application TikTok a fait l’objet d’une attention accrue en raison de ses pratiques de collecte de données.
Les tentatives de Mintegral de dissimuler la nature des données collectées, à l’aide de contrôles anti-altération et d’une technique d’encodage propriétaire, rappellent des fonctionnalités similaires signalées par des chercheurs ayant analysé l’application TikTok.
Dans le cas de SourMint, la quantité de données collectées dépasse ce qui serait nécessaire pour une attribution légitime des clics. L’application utilise également des méthodes de codage douteuses pour accéder à autant de données.
Détails techniques de l’exploitation et mesures correctives
Comment cette attaque par code malveillant fonctionne-t-elle exactement ? Examinons les détails que nous avons découverts au cours de nos recherches.
Les développeurs peuvent télécharger le SDK depuis le site de Mintegral et l’intégrer à leur application. Lors de son initialisation, le SDK envoie plusieurs requêtes au serveur de Mintegral. L’une d’elles reçoit une réponse JSON contenant plusieurs paramètres directement utilisés par le code malveillant dans l’application, notamment :
un indicateur permettant d’activer ou de désactiver la détection anti-altération et anti-débogage
un indicateur permettant d’activer les hooks utilisés pour capturer et enregistrer les clics sur les URL
une URL (encodée) où l’activité de clic des utilisateurs sera enregistrée
Le fichier JSON des paramètres récupéré contient également une valeur numérique indiquant le délai avant la prochaine mise à jour des paramètres. Cela signifie que les paramètres du SDK peuvent être mis à jour à distance.
Comme indiqué précédemment, le SDK effectue quelques vérifications de base pour détecter toute altération. Il recherche les conditions suivantes :
l’application s’exécute dans un simulateur
un débogueur est associé au processus de l’application
le téléphone est jailbreaké (en recherchant divers fichiers, notamment l’application Cydia)
l’utilisation d’un proxy est activée
Si le SDK détecte la présence de l’une des conditions ci-dessus, il active un indicateur utilisé dans d’autres fonctions du SDK et modifie son comportement. Cette modification semble désactiver l’activité malveillante qui consiste à réécrire les URL et à enregistrer les données des utilisateurs. Il s’agirait donc d’une tentative visant à empêcher la détection de l’activité malveillante du SDK.
À l’exécution, le SDK utilise le swizzling de méthodes pour injecter du code malveillant dans les implémentations de nombreuses méthodes et gestionnaires. Ces hooks lui permettent d’intercepter toutes les requêtes basées sur une URL effectuées depuis l’application, y compris celles qui ne proviennent pas du SDK Mintegral. Cette étape cruciale permet au SDK de recueillir les informations nécessaires sur les clics des utilisateurs et de créer une notification de clic destinée au fournisseur d’attribution. Parmi les méthodes auxquelles le SDK substitue son propre code figurent :
UIAplication OpenURLUIAplication OpenURL:options: completionHandler(après vérification que l’application s’exécute sous iOS 10.x ou une version ultérieure)NSURLProtocolSKStoreProductViewController loadProductwithParameters:completionBlock
Lorsqu’une des méthodes ci-dessus est appelée, le code injecté par le SDK effectue plusieurs opérations. Tout d’abord, il vérifie si l’indicateur anti-altération est activé ; si c’est le cas, tout le code Mintegral qui suit est ignoré. Il vérifie ensuite si la requête provient d’une publicité marketing diffusée par Mintegral ou d’un concurrent. Si elle provient d’une publicité Mintegral, le gestionnaire de méthode habituel est appelé sans autre action.
Si la requête provient d’une méthode non liée à Mintegral, le code recueille des informations sur l’événement, notamment l’URL, les en-têtes de la requête, la classe dans laquelle le clic a eu lieu, la méthode concernée et des données de trace d’exécution supplémentaires. Ces informations sur la requête, ainsi que d’autres données du téléphone, sont envoyées dans un format encodé au serveur de journalisation Mintegral indiqué dans le fichier de paramètres. Les données consignées comprennent :
Version du système d’exploitation
Adresse IP
état de charge
Version du SDK Mintegral
type de réseau
modèle
nom du package
IDFA
URL
en-têtes de la requête
nom de la méthode
nom de la classe
données de trace d’exécution
Une fois les données enregistrées par Mintegral, le reste de la méthode s’exécute normalement. D’après les rapports d’un fournisseur d’attribution, nous pouvons confirmer que Mintegral crée en arrière-plan des notifications de clic pour les points de contact générés par d’autres réseaux publicitaires.
Pour découvrir ces éléments, l’équipe de recherche en sécurité de Snyk a intégré le SDK à une application de test. Afin d’éviter la détection anti-altération, les communications de l’application ont été interceptées au niveau du point d’accès sans fil à l’aide d’un proxy de type « homme du milieu » (mitm.it). Snyk a utilisé le désassembleur Hopper pour examiner le code du SDK et en cartographier les fonctionnalités. Nous avons identifié cette fonctionnalité malveillante dans des versions du SDK remontant à la version 5.5.1 (la version actuelle au moment de la rédaction est la 6.4.0).
Grâce à nos propres recherches internes et à notre collaboration avec des organisations clés et des experts du secteur, nous avons pu confirmer le détournement complet, de bout en bout, des clics des utilisateurs sur les publicités.
Pour une description technique encore plus détaillée du code découvert et des méthodes utilisées, consultez notre rapport de recherche.
