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.
É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.
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 :
tokyoSkytreeakihabaraLightsasakusaTempleginzaLuxuryshibuyaCrossing
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.
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** :
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
akihabaraLights - Déterminer le navigateur
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.
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** :
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 :
- Ouvrir le terminal macOS
- Coller et exécuter une commande encodée en Base64 récupérée dynamiquement depuis la fonction
**jadeCode()**on-chain
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.









