Cet article est une soumission de la communauté. L’auteur est Minzhi He, auditeur chez CertiK.
Les opinions exprimées dans cet article sont celles du contributeur/auteur et ne reflètent pas nécessairement celles de Binance Academy.
Résumé
Les passerelles blockchain sont fondamentales pour atteindre l’interopérabilité dans l’espace blockchain. La sécurité des passerelles est donc d’une importance capitale. Parmi les vulnérabilités les plus courantes en matière de sécurité des passerelles, on peut citer la faiblesse de la validation sur et hors de la blockchain, la mauvaise gestion des tokens natifs et les mauvaises configurations. Il est recommandé de tester la passerelle contre tous les vecteurs d’attaque possibles afin de garantir une logique de vérification solide.
Introduction
Une passerelle blockchain est un protocole reliant deux blockchains pour permettre les interactions entre elles. Si vous possédez des bitcoins mais que vous souhaitez participer à une activité DeFi sur le réseau Ethereum, une passerelle blockchain vous permet de le faire sans vendre vos bitcoins.
Les passerelles blockchain sont fondamentales pour atteindre l’interopérabilité dans l’espace blockchain. Elles fonctionnent à l’aide de diverses validations sur et hors de la blockchain et présentent donc des vulnérabilités différentes en matière de sécurité.
Pourquoi la sécurité des passerelles est-elle essentielle ?
Une passerelle contient généralement le token qu’un(e) utilisateur/utilisatrice souhaite transférer d’une blockchain à une autre. Souvent déployées sous la forme de smart contracts, les passerelles détiennent une quantité importante de tokens à mesure que les transferts entre blockchains s’accumulent, ce qui en fait des cibles de choix pour les pirates informatiques.
En outre, les passerelles blockchain ont une grande surface d’attaque car elles impliquent de nombreux composants. C’est pourquoi les acteurs malveillants sont très motivés pour cibler les applications inter-blockchains afin de voler de grosses sommes d’argent.
Les attaques de passerelles ont entraîné des pertes de plus de 1,3 milliard de dollars américains en 2022, ce qui représente 36 % des pertes totales de l’année, selon les estimations de CertiK.
Vulnérabilités de sécurité communes pour les passerelles
Pour renforcer la sécurité des passerelles, il est utile de comprendre les vulnérabilités les plus courantes et de les tester avant leur mise en service. Ces vulnérabilités peuvent être classées dans les quatre catégories suivantes.
Faiblesse de la validation sur la blockchain
Pour les passerelles simples, en particulier celles qui sont conçues pour des DApps spécifiques, la validation sur la blockchain est réduite au minimum. Ces passerelles s’appuient sur un backend (application dorsale) centralisé pour exécuter les opérations de base telles que l’émission, le burn et les transferts de tokens, tandis que toutes les vérifications sont effectuées hors de la blockchain.
En revanche, d’autres types de passerelles utilisent des smart contracts pour valider les messages et effectuer des vérifications sur la blockchain. Dans ce scénario, lorsqu’un(e) utilisateur/utilisatrice dépose des fonds sur une blockchain, le smart contract génère un message signé et renvoie la signature dans la transaction. Cette signature sert de preuve de dépôt et est utilisée pour vérifier la demande de retrait de l’utilisateur/l’utilisatrice sur l’autre blockchain. Ce processus doit permettre de prévenir diverses attaques de sécurité, notamment les attaques par rejeu et les faux enregistrements de dépôts.
Cependant, s’il existe une vulnérabilité au cours du processus de validation sur la blockchain, l’attaquant peut causer de graves dommages. Par exemple, si une passerelle utilise un arbre de Merkle pour valider la transaction, un pirate peut générer de fausses preuves. Cela signifie qu’ils peuvent contourner la validation de la preuve et émettre de nouveaux tokens sur leur compte si le processus de validation est vulnérable.
Certaines passerelles mettent en œuvre le concept de « tokens wrappés ». Par exemple, lorsqu’un(e) utilisateur/utilisatrice transfère un DAI d’Ethereum à la BNB Chain, son DAI est prélevé du contrat Ethereum et un montant équivalent de DAI wrappé est émis sur la BNB Chain.
Cependant, si cette transaction n’est pas correctement validée, un pirate pourrait déployer un contrat malveillant pour acheminer les tokens wrappés de la passerelle vers une adresse incorrecte en manipulant cette fonctionnalité.
Les pirates ont également besoin que les victimes approuvent le contrat de la passerelle pour transférer des tokens à l’aide de la fonction « transferFrom » afin de drainer les actifs du contrat de la passerelle.
Malheureusement, cette situation est aggravée par le fait que de nombreuses passerelles demandent aux utilisateurs et utilisatrices de DApp d’approuver des tokens à l’infini. Il s’agit d’une pratique courante qui réduit les frais de gas, mais qui crée des risques supplémentaires en permettant à un smart contract d’accéder à un nombre illimité de tokens du portefeuille de l’utilisateur ou l’utilisatrice. Les pirates sont en mesure d’exploiter l’absence de validation et l’approbation excessive pour transférer des tokens d’autres utilisateurs et utilisatrices sur leurs propres comptes.
Faiblesse de la validation hors de la blockchain
Dans certains systèmes de passerelles, le serveur backend hors blockchain joue un rôle essentiel dans la vérification de la légitimité des messages envoyés par la blockchain. Dans le cas présent, nous nous concentrons sur la vérification des opérations de dépôt.
Une passerelle blockchain avec validation hors blockchain fonctionne comme suit :
Les utilisateurs et utilisatrices interagissent avec la DApp pour déposer des tokens dans le smart contract sur la blockchain source.
La DApp envoie ensuite le hachage de la transaction de dépôt au serveur backend via une API.
Le hachage de la transaction est soumis à plusieurs validations par le serveur. S’il est jugé légitime, un signataire signe un message et renvoie la signature à l’interface utilisateur via l’API.
Lorsqu’elle reçoit la signature, la DApp la vérifie et autorise l’utilisateur ou l’utilisatrice à retirer ses tokens de la blockchain source.
Le serveur backend doit s’assurer que la transaction de dépôt qu’il traite a bien eu lieu et qu’elle n’a pas été falsifiée. Ce serveur backend détermine si un(e) utilisateur/utilisatrice peut retirer des tokens sur la blockchain cible et constitue donc une cible de grande valeur pour les pirates.
Le serveur backend doit valider la structure de l’événement émis par la transaction, ainsi que l’adresse du contrat qui a émis l’événement. Si ce dernier point est négligé, un pirate pourrait déployer un contrat malveillant pour falsifier un événement de dépôt ayant la même structure qu’un événement de dépôt légitime.
Si le serveur backend ne vérifie pas quelle adresse a émis l’événement, il considérera qu’il s’agit d’une transaction valide et signera le message. Le pirate peut alors envoyer le hachage de la transaction au backend, contournant ainsi la vérification et lui permettant de retirer les tokens de la blockchain cible.
Mauvaise gestion des tokens natifs
Les passerelles adoptent des approches différentes pour gérer les tokens natifs et les tokens utilitaires. Par exemple, sur le réseau Ethereum, le token natif est l’ETH et la plupart des tokens utilitaires suivent la norme ERC-20.
Lorsqu’un(e) utilisateur/utilisatrice souhaite transférer ses ETH vers une autre blockchain, il ou elle doit d’abord le déposer dans le contrat de la passerelle. Pour ce faire, l’utilisateur ou l’utilisatrice attache simplement l’ETH à la transaction, et le montant de l’ETH peut être récupéré en lisant le champ « msg.value » de la transaction.
Le dépôt de tokens ERC-20 diffère considérablement du dépôt d’ETH. Pour déposer un token ERC-20, l’utilisateur ou l’utilisatrice doit d’abord autoriser le contrat de passerelle à dépenser ses tokens. Après approbation et dépôt des tokens dans le contrat de la passerelle, ce dernier va burn les tokens de l’utilisateur/de l’utilisatrice à l’aide de la fonction « burnFrom() » ou transférera les tokens de l’utilisateur/de l’utilisatrice vers le contrat à l’aide de la fonction « transferFrom() ».
Une approche pour différencier cela est d’utiliser une instruction si alors (if-else) au sein de la même fonction. Une autre approche consiste à créer deux fonctions distinctes pour gérer chaque scénario. Tenter de déposer de l’ETH en utilisant la fonction de dépôt de l’ERC-20 peut entraîner la perte des fonds.
Lors du traitement des demandes de dépôt ERC-20, les utilisateurs et utilisatrices fournissent généralement l’adresse du token en entrée de la fonctionnalité de dépôt. Cela présente un risque important, car des appels externes non fiables peuvent avoir lieu pendant la transaction. La mise en œuvre d’une liste blanche qui n’inclut que les tokens pris en charge par la passerelle est une pratique courante pour minimiser les risques. Seules les adresses figurant sur la liste blanche peuvent être transmises en tant qu’arguments. Cela permet d’éviter les appels externes car l’équipe projet a déjà appliqué un filtre sur l’adresse du token.
Toutefois, des problèmes peuvent également survenir lorsque les passerelles gèrent le transfert de tokens natifs d’une blockchain à une autre, car le token natif n’a pas d’adresse. Une adresse zéro (0x000...0) est représentative du token natif. Cela peut poser problème, car le fait de transmettre l’adresse zéro à la fonctionn peut permettre de contourner la vérification de la liste blanche, même si elle est mise en œuvre de manière correcte.
Lorsque le contrat de la passerelle appelle la fonction « transferFrom » pour transférer les actifs de l’utilisateur/l’utilisatrice vers le contrat, l’appel externe à l’adresse zéro renvoie un message faux car il n’y a pas de fonction « transferFrom » implémentée dans l’adresse zéro. Toutefois, la transaction peut toujours avoir lieu si le contrat ne gère pas la valeur de retour de manière appropriée. Les pirates ont ainsi la possibilité d’exécuter la transaction sans transférer de tokens au contrat.
Mauvaise configuration
Dans la plupart des passerelles blockchain, un rôle privilégié est responsable de la mise sur liste blanche ou noire des tokens et des adresses, de l’attribution ou de la modification des signataires et d’autres paramétrages critiques. Il est essentiel de s’assurer que tous les paramétrages sont corrects, car même des oublis apparemment insignifiants peuvent entraîner des pertes importantes.
Par exemple, il y a eu un incident où le pirate a réussi à contourner la vérification de l’enregistrement du transfert en raison d’une mauvaise configuration. L’équipe du projet a mis en œuvre une mise à jour du protocole quelques jours avant le piratage, qui impliquait la modification d’une variable. La variable a été utilisée pour représenter la valeur par défaut du message de confiance. Cette modification a eu pour effet que tous les messages étaient automatiquement considérés comme prouvés, ce qui permet à un pirate de soumettre un message arbitraire et de passer le processus de vérification.
Comment améliorer la sécurité des passerelles ?
Les quatre vulnérabilités communes expliquées ci-dessus démontrent les défis à relever pour assurer la sécurité dans un écosystème blockchain interconnecté. La gestion de chacune de ces vulnérabilités fait l’objet de considérations importantes, et il n’existe pas de mode d’emploi unique applicable à toutes ces vulnérabilités.
Par exemple, il est difficile de fournir des lignes directrices générales pour garantir un processus de vérification sans erreur, car chaque passerelle a des exigences de vérification qui lui sont propres. L’approche la plus efficace pour empêcher le contournement de la vérification consiste à tester minutieusement la passerelle contre tous les vecteurs d’attaque possibles et à s’assurer que la logique de vérification est solide.
En résumé, il est essentiel d’effectuer des tests rigoureux contre les attaques potentielles et d’accorder une attention particulière aux failles de sécurité les plus courantes des passerelles.
Conclusion
En raison de leur valeur élevée, les passerelles inter-blockchains sont depuis longtemps une cible pour les pirates. Les développeurs et développeuses peuvent renforcer la sécurité de leurs passerelles en effectuant des tests approfondis avant le déploiement et en s’engageant dans des audits par des tiers, réduisant ainsi le risque de piratages dévastateurs qui ont touché les passerelles au cours des dernières années. Les passerelles sont essentielles dans un monde à blockchain multiples, mais la sécurité doit être une préoccupation majeure lors de la conception et de la mise en place d’une infrastructure Web3 efficace.
Plus d’informations
Qu’est-ce qu’une passerelle blockchain ?
Qu’est-ce que l’interopérabilité inter-blockchains ?
Trois passerelles crypto populaires et leur fonctionnement
Avis de non-responsabilité et avertissement concernant les risques : ce contenu vous est présenté « tel quel » à des fins d’information générale et éducative uniquement, sans représentation ni garantie d’aucune sorte. Il ne doit pas être interprété comme un conseil financier, légal ou venant d’un professionnel, ni comme un moyen de recommander l’achat d’un produit ou d’un service spécifique. Vous devriez vous renseigner auprès des professionnels appropriés avant toute décision. Lorsque l’article à été rédigé par un contributeur tiers, veuillez remarquer que les opinions de l’article ne reflètent pas nécessairement celles de Binance Academy. Veuillez lire l’intégralité de notre avis de non-responsabilité ici pour en savoir plus. Les prix des actifs numériques peuvent être volatils. La valeur de votre investissement peut varier à la baisse ou à la hausse, et vous ne récupérerez peut-être pas le montant que vous avez investi. Vous êtes seul(e) responsable de vos décisions d’investissement et Binance Academy n’est pas responsable des pertes que vous pourriez subir. Ce contenu ne doit pas être interprété comme un conseil financier, légal, ou venant d’un professionnel. Pour en savoir plus, veuillez vous reporter à nos Conditions d’utilisation et à l’avertissement concernant les risques.