Rilide, également connu sous les noms de LumaC2 et CookieGenesis, est un logiciel malveillant sophistiqué qui cible les navigateurs basés sur Chromium pour détourner l’activité des utilisateurs et voler des données sensibles. Découvert en 2023, Rilide exploite les extensions de navigateur pour mener à bien ses attaques. Rilide abuse son composant d’extension de navigateur pour injecter des scripts malveillants dans les pages Web. Outre ses capacités d’exfiltration des données, il propose également une fonctionnalité avancée de vol de crypto-monnaies, avec manipulation de l’authentification à deux facteurs (2FA) pour les portefeuilles et les clients de messagerie les plus répandus.
Depuis début 2025, le laboratoire de recherche Trusteer a recensé plus de 50 000 sessions d’utilisateurs infectées, ce qui témoigne de l’ampleur de cette menace. Rilide mène actuellement une campagne mondiale, détectée par le laboratoire Trusteer, qui attaque l’Amérique du Nord, l’Amérique du Sud, l’Europe et le Japon.
Dans cet article, nous allons découvrir comment Rilide fonctionne au sein du navigateur via son extension et examiner les techniques qu’il utilise pour mener ses attaques, en particulier son impact sur les plateformes financières.
Les capacités de Rilide mettent en évidence le changement de l’environnement (informatique) des menaces, passant des injections Web traditionnelles utilisant un seul code JavaScript intégré à la page aux extensions de navigateur. Les extensions de navigateur facilitent de nombreuses fonctions qu’il serait difficile de réaliser sans elles. L’analyse suivante montre à quel point une extension est puissante et pourquoi les logiciels malveillants modernes ont tendance à les utiliser.
Par le passé, la plupart des attaques de type « man-in-the-browser » étaient exécutées par des logiciels malveillants analysant la mémoire du navigateur pour identifier des modèles HTML spécifiques et en injectant une balise <script> directement dans le contenu en mémoire de la page. Malgré l’intention malveillante, ces scripts étaient toujours soumis aux mécanismes de sécurité du navigateur, tels que le fonctionnement dans un environnement en bac à sable, le respect de la politique de la même origine et le lien avec le cycle de vie de la page dans laquelle ils avaient été injectés.
Par exemple, les scripts injectés ne pouvaient pas accéder à des cookies ou à des ressources d’autres origines, ni persister ou s’exécuter une fois la page fermée.
En revanche, les attaques modernes utilisant des extensions de navigateur malveillantes surmontent la plupart de ces limitations. Les extensions fonctionnent indépendamment de toute page Web spécifique, ce qui leur permet de s’exécuter en permanence en arrière-plan. Ils disposent également de privilèges élevés, ce qui leur permet de contourner les restrictions liées à la même origine, d’accéder aux ressources du navigateur, telles que les cookies ou le stockage, et de rester actifs même lorsqu’aucune page n’est ouverte. Cette évolution a fait des extensions de navigateur un outil puissant pour les attaquants, offrant un niveau de persistance et de contrôle bien supérieur aux méthodes traditionnelles d’injection sur le Web.
Les extensions ont également introduit une modification du contexte d’exécution de JavaScript, qui présente ses propres avantages malveillants. Les injections Web traditionnelles s’exécutent dans le même contexte que le code de l’application Web, y compris les outils de sécurité. Toute preuve laissée de côté (comme des éléments de script, des requêtes de réseau, des variables js, etc.) pourrait rendre le logiciel malveillant détectable.
Outre le contexte de la page, il existe deux environnements JavaScript différents :
Toutes les communications entre ces contextes se font via des interfaces du navigateur définies qui ne sont pas visibles pour la page ou ses développeurs. La plupart des comportements et des preuves d’extension sont isolés par conception, et la détection est particulièrement difficile si le document principal n’est pas modifié.
En plus d’offrir une meilleure évasion, le développement d’extensions de navigateur est également simple, grâce aux nombreuses fonctionnalités et autorisations intégrées fournies par les API des navigateurs modernes. L’analyse suivante montre comment les extensions facilitent le développement d’attaques complexes.
Compte tenu du contrôle, de la persistance et des capacités d’évasion accrus et de la facilité de développement qu’offrent les extensions, le passage des techniques man-in-the-browser traditionnelles aux attaques basées sur les extensions est non seulement compréhensible, mais inévitable, compte tenu de l’évolution des menaces basées sur les navigateurs.
Nous commencerons notre analyse de Rilide par le fichier manifeste, un composant essentiel qui décrit les fonctionnalités et les niveaux d’accès de l’extension, fournissant ainsi les premiers indices permettant de comprendre les capacités malveillantes de Rilide.
L’une des variantes analysées se présente comme une extension de Google Drive :
Plus loin, vous trouverez une liste des autorisations requises. La liste contient plusieurs fonctionnalités critiques des navigateurs, notamment :
Sous l’autorisation "host_permission", l’extension est autorisée à accéder et à interagir avec <all_ urls>, c’est-à-dire tout schéma, domaine, chemin et port pris en charge par le navigateur.
Les "Content scripts" sont également configurés pour s’exécuter sur toutes les URL à document_start, ce qui signifie qu’ils s’exécutent dès que le navigateur commence à charger la page, avant que tout contenu ne soit entièrement affiché.
Le script main.js comprend des fonctionnalités générales de vol d’informations, tandis que gmail.js cible la page du client de messagerie Gmail. Néanmoins, tous les scripts sont injectés dans chaque page.
Sous "declarative_net_request", l’extension configure des règles pour supprimer plusieurs en-têtes de politique de sécurité de contenu (CSP). Cela permet à Rilide de contourner les restrictions de sécurité et d’injecter du contenu en ligne.
Sous "Background", le service worker de l’extension est configuré. C’est là que le logiciel malveillant surveille les événements du navigateur et établit la communication avec le serveur C2. Ensuite, nous nous pencherons sur l’analyse des scripts d’arrière-plan afin de mieux comprendre comment le logiciel malveillant suit les événements du navigateur et exécute sa stratégie d’attaque.
Background.js contient un code d’initialisation configuré pour être exécuté lors de l’installation de l’extension. Il récupère les informations relatives à l’appareil, telles que les détails relatifs au processeur et au stockage, à l’aide des appels chrome.system et les données relatives aux extensions installées à l’aide de chrome.management. L’identifiant unique est généré à l’aide du module npm uuid (importé via jspm) et enregistré au niveau local. Enfin, tous les cookies sont récupérés via chrome.cookies.getAll avec un paramètre de filtre vide.
Ces données sont envoyées au serveur C2, et la réponse peut activer les capacités de proxy de l’extension. Les injections, les commandes et les paramètres des logiciels malveillants sont également récupérés lors de l’initialisation de l’extension.
La dernière partie de l’initialisation consiste à activer les règles de suppression du CSP, après quoi le logiciel malveillant est prêt à s’installer et à surveiller les événements du navigateur. Une fois de plus, nous voyons clairement les avantages de l’utilisation d’une extension de navigateur par rapport aux techniques traditionnelles d’injection sur le Web, qui permettent de collecter facilement toutes ces informations.
Les versions précédentes de Rilide intégraient directement les domaines C2 dans les fichiers JavaScript. D’autres variantes ont extrait des domaines en récupérant les détails des transactions d’un portefeuille Bitcoin donné.
La nouvelle variante analysée ici inclut du code conçu pour récupérer des domaines depuis un bot Telegram. Des appels périodiques pour récupérer les domaines sont configurés pour s’exécuter toutes les minutes à l’aide des alarmes Google Chrome.
Cette approche permet aux logiciels malveillants de changer facilement de domaine si l’un d’entre eux est détecté et bloqué.
Bien que cette variante ne contienne pas les tokens Telegram, cette méthode apparaîtra probablement dans les futures versions.
Le script de contenu envoie toutes les valeurs des éléments d’entrée de la page via chrome.exécution.sendMessage avec le type de message "new-grabber-info".
L’écouteur suivant est défini dans background.js pour transmettre les données au serveur C2.
En outre, l’arrière-plan attend les messages "set-capture d’écran-Résultats".
Ces messages déclenchent la capture d’écran avec chrome.tabs.captureVisibleTab et en renvoyant les données au serveur C2.
En utilisant ces méthodes, si l’utilisateur se connecte à un site bancaire, diverses données sensibles peuvent être volées. Ces informations incluent les noms d’utilisateur et les mots de passe, les numéros de compte, les codes PIN, les informations de carte de crédit, les réponses aux questions de sécurité et les informations sur les destinataires de transfert.
Dans la dernière partie des scripts d’arrière-plan, les appels périodiques pour récupérer les commandes et vérifier le proxy sont définis à l’aide de "chrome.alarms". Les alarmes de commande récupèrent une liste de commandes du C2 et les exécutent une par une.
L’alarme de vérification du proxy vérifie l’état de la connexion du proxy et en déclenche une nouvelle si nécessaire. Une fois les écouteurs configurés, l'exécution synchrone du script d'arrière-plan se termine.
cmds.js contient du code qui facilite la réception d’une commande (à partir d’une liste prédéfinie) ainsi que les paramètres du C2 et le renvoi des résultats, le cas échéant.
Voici quelques commandes intéressantes :
D’autres commandes permettent de modifier la configuration de l’extension, de récupérer les informations sur les appareils, l’URL actuelle, etc. Cet ensemble de commandes permet de modifier de manière dynamique le workflow et l’exécution du logiciel malveillant, ce qui le rend plus apte à attirer l’interaction de l’utilisateur. La plupart de ces commandes utilisent des fonctions d’extension Chrome intégrées, ce qui facilite le développement pour les auteurs de logiciels malveillants.
Le script de contenu main.js commence avec la bibliothèque jQuery initialisée dans une fonction anonyme, entièrement intégrée en ligne sans importation externe. Cela est suivi par un code obscurci exécutant des fonctions malveillantes.
L’architecture d’extension de Chromium permet aux extensions de séparer les responsabilités d’injection et de les rendre plus difficiles à détecter. Le service worker télécharge et stocke les injections pendant l’étape d’initialisation, tandis que le script de contenu les lit et les exécute. Aucune requête Web n’a été envoyée dans le contexte de la page, ce qui aide à garder le logiciel malveillant indétectable. main.js itère toutes les injections récupérées, et si l’URL actuelle correspond à l’URL d’injection, il l’injecte.
Rilide utilise une méthode ingénieuse pour injecter des scripts dans le DOM.
Il crée un attribut document "onreset" avec l’injection comme gestionnaire d’événements. Il envoie ensuite immédiatement un événement "reset" personnalisé, qui exécute l’injection, et supprime enfin l’attribut.
Cet attribut est défini à un moment précis entre l’appel "setAttributes" et l’appel "removeAttributes", ce qui rend difficile la détection par les outils de sécurité.
Le dernier appel de fonction met en place l’écouteur générique du voleur de données.
À l’aide d’un sélecteur jQuery, tous les éléments d’entrée sont sélectionnés et l’écouteur d’événements "change" est configuré.
L’événement "change"se produit chaque fois que la valeur d’un champ d’entrée est modifiée et perd la mise au point (l’utilisateur clique sur un autre élément). Par exemple, lorsqu’une victime se connecte à son compte bancaire, son nom d’utilisateur est collecté lorsqu’elle clique sur le champ de mot de passe, et le mot de passe saisi est volé lorsque l’utilisateur envoie le formulaire. Les données sont envoyées au service worker via l’exécution chrome.runtime.sendMessage, qui le transmettent ensuite aux serveurs C2.
L’objectif de ce script est de remplacer la demande d’autorisation de retrait 2FA par une nouvelle demande d’autorisation de dispositif. Nous supposons que cette approche permet aux clients de ne pas se rendre compte des retraits non autorisés, car ils sont plus susceptibles de percevoir la nouvelle autorisation du dispositif comme moins suspecte que les retraits eux-mêmes.
Le script commence par une initialisation en ligne de la bibliothèque jQuery et une vérification que l’emplacement actuel contient "mail.google" avant de commencer l’exécution. L’injection vérifie périodiquement la présence d’e-mails provenant de portefeuilles de cryptomonnaies populaires et, si elle est détectée, invoque la fonction correspondante du portefeuille.
Les sélecteurs jQuery sont assez simples, utilisant des "divs" qui contiennent les noms des portefeuilles dans le texte.
Nous démontrerons l’injection personnalisée d’un fournisseur spécifique, bien qu’ils agissent tous de la même manière.
Le code recherche tout élément contenant le texte « Demande de retrait » et le remplace par « Autoriser un nouvel appareil ».
Il recherche également des éléments span contenant le texte « retrait » pour remplacer le contenu de l’aperçu de l’e-mail.
Avant l’injection :
Après l’injection :
Le corps de l’e-mail lui-même se trouve de la manière suivante :
En termes simples, le script trouve tous les éléments de la classe CSS "ii" qui ont un élément "div" descendant avec le texte « Vérifiez attentivement l’adresse ». Il extrait également le code d’autorisation en fonction de l’élément et du style du texte du code d’autorisation. Cette méthode d’identification des éléments n’est pas très stable, car de petites modifications du style, du texte ou de la structure peuvent l’interrompre.
Enfin, le contenu HTML de l’e-mail est remplacé par un contenu codé en dur.
Contenu original :
Nouveau contenu :
Ce mécanisme permet à l’acteur de la menace de retirer des cryptomonnaies sans avertir l’utilisateur des retraits.
Une autre fonctionnalité remarquable, mise en œuvre sans effort grâce aux extensions, est la fonctionnalité de proxy. Rilide permet de convertir le navigateur de la victime en un proxy HTTP, transmettant toutes les requêtes tout en utilisant les identifiants et les données de la victime.
Cette capacité est particulièrement dangereuse en cas de fraude financière, car les attaquants peuvent accéder aux portails bancaires, aux comptes commerciaux et aux plateformes de paiement sans déclencher de contrôles d’authentification supplémentaires. Ils peuvent initier des transactions, modifier les paramètres du compte ou siphonner des fonds sous couvert d’activité utilisateur légitime, contournant ainsi les mesures de sécurité traditionnelles comme le suivi des adresses IP. En se faisant passer pour la victime, les attaquants peuvent exploiter des mécanismes basés sur la confiance pour commettre des fraudes de manière inaperçue.
Cette fonctionnalité était remarquablement simple à mettre en œuvre puisqu’elle a été copiée directement à partir de CursedChrome, un projet éducatif démontrant une preuve de concept pour ce type d’attaque.
Le proxy fonctionne en utilisant l’assistant de service des extensions pour établir une connexion WebSocket avec le serveur C2 de l’attaquant. Cette connexion permet au service worker de recevoir les commandes envoyées par l’attaquant. Ces commandes dictent les actions du proxy, telles que l’envoi de requêtes ou la navigation sur des sites Web. Les demandes sont faites en utilisant les cookies collectés par la victime, et les réponses sont renvoyées au C2.
Exemple de code CursedChrome :
Exemple de code Rilide :
À part quelques différences de nom et la localisation de la définition de la fonction, le code reste le même. Ce projet est même livré avec un code backend et une interface utilisateur de gestion (UI), ce qui facilite la vie des pirates.
Rilide illustre la façon dont les extensions de navigateur ont transformé l’environnement des menaces pour les attaques de type « man-in-the-browser ». En exploitant les capacités inhérentes aux extensions, les pirates acquièrent un contrôle sans précédent sur le navigateur, ce qui permet une exploitation sophistiquée et persistante qui dépasse de loin les limites des injections Web traditionnelles. Ce changement met en évidence le besoin croissant de vigilance et de défenses robustes, car la simplicité et la puissance des attaques basées sur les extensions en font un vecteur de choix pour les cybercriminels.
Pour se protéger, les utilisateurs doivent régulièrement vérifier les extensions de navigateur qu’ils ont installées et supprimer rapidement celles qui ne leur sont pas familières ou qui sont suspectes.
De plus, il est essentiel de surveiller les comptes e-mail pour détecter toute activité inhabituelle, comme des tentatives de connexion inattendues, et de garder un œil sur les portefeuilles de cryptomonnaies pour repérer les transactions non autorisées ou les actions inconnues. En restant proactif et prudent, vous pouvez contribuer à atténuer les risques posés par ce paradigme d’attaque en constante évolution.
IBM Trusteer vous aide à détecter les fraudes et les logiciels malveillants, à authentifier les utilisateurs et à établir une identité fiable tout au long du parcours client omnicanal. Plus de 500 organisations de premier plan utilisent Trusteer pour sécuriser les parcours numériques de leurs clients et soutenir la croissance de leur entreprise.
historytab.js | 2b72cc2c0c53321a472471c5189fdb56 |
notif.js | 8679a34885a02e94189c8fec5132245a |
config.js | 408d8fa7eade661e9a02b6065b792fca |
ico.png | 40de419c81de274c26c63e0f23d91a3f |
scrrule.js | 9db73e9a3a24070de075da13fdea01ab |
exts.js | 868eb23af363b5790d16103d2dd94178 |
rules.json | 6c1f6ab3492a615404a70161303de746 |
manifest.json | fd7d90a5e31cd19bbc65095d722c1525 |
utils.js | bd14616118af50f6e0b886bd90144845 |
content-scripts-register-polyfill.4.0.0.js | 5bf61a91e003afb1e169e3e3be336cac |
app.html | 08785f3794a7ae9aab6b3fa669646794 |
background.js | 1de94fff2cb80f44d82d69f816139974 |
main.js | 6c19e1bf9a7eac2c9b44f5e5c0b76d39 |
gmail.js | 49c851c025506d0a570d75bc00c7605a |
csp.js | 15606d8d8d6ca797c2c98c20114619b4 |
exchangeSettings.js | 2dcf7f099c08f9d074994a0a4f996720 |
screen.js | 7d0defc1a08d5a58d95f5ca38509c8ef |
domain.js | bb0bc698eb64447a3ab581517273487b |
inj.js | 3d67fa8a26390e8819d6bd36a2c5959f |
set.js | 8049e7bd36a88f7a393b7ff0746a04db |
proxing.js | b4b2510d7ec41711ef29ddddd4cab09a |
cmds.js | 0ebb9b78c38ae45884b85632fe087e49 |
machine.js | c43644bed7d94e3ec880af3195e4c906 |
extFiles.zip | 3113c21eee9704b14437edb5c6f29634 |
Domaine:
statbrwsr.digital