Chargement des prix…

Comment révoquer les approbations de smart contracts (et pourquoi le faire)

Les approbations de tokens dormantes sont un vecteur d'attaque majeur. Voici une routine mensuelle pour identifier, classer et révoquer les autorisations risquées sur Ethereum et les L2.

Comment révoquer les approbations de smart contracts (et pourquoi le faire)

Ce qu'est réellement une autorisation de jeton, et pourquoi elle survit à la transaction

Lorsque vous échangez un jeton sur un exchange décentralisé, prêtez des actifs sur un marché monétaire, ou stakez via un tableau de bord DeFi, vous ne remettez pas vos jetons à une personne. Vous signez un message qui demande au smart contract du jeton d'autoriser un autre smart contract à déplacer un nombre précis de vos jetons en votre nom. Ce message signé est l'autorisation, et elle vit on-chain indéfiniment jusqu'à ce que vous-même ou quelqu'un l'annule explicitement.

C'est ce que la plupart des débutants comprennent mal. L'autorisation n'est pas liée à une seule transaction. C'est une permission permanente. Le DEX ou le protocole de prêt avec lequel vous avez interagi en 2023 peut, en principe, encore déplacer des jetons hors de votre portefeuille aujourd'hui, car le contrat du jeton lui-même a enregistré qu'il y était autorisé.

Il existe deux variantes que vous verrez dans un outil comme Etherscan. Une autorisation « limitée » fixe un plafond, par exemple 100 USDC, au-delà duquel le contrat doit vous redemander de signer. Une autorisation « infinie » (techniquement la valeur maximale représentable dans un uint256, c'est-à-dire un entier non signé de 256 bits, ou un nombre tellement grand qu'il équivaut à l'illimité) ne fixe aucun plafond. La plupart des front-ends DeFi choisissent l'infinie par défaut, car cela évite à l'utilisateur une signature supplémentaire à chaque transaction future, et parce que payer le gas deux fois pour la même dapp semble du gaspillage.

Le compromis est réel : une autorisation infinie est pratique pour vous, et elle l'est aussi pour quiconque prend ensuite le contrôle de ce contrat.

Le risque : comment une autorisation oubliée devient un drain

Le mode de défaillance est rarement un nouveau piratage astucieux. C'est presque toujours l'un de trois schémas plus anciens, et ils sont tous aggravés par des autorisations qui traînent on-chain depuis des mois.

1. Le contrat lui-même est compromis. Une clé de développeur est victime de phishing, un portefeuille multisig est détourné, ou le protocole subit une attaque de gouvernance où les attaquants font passer une proposition qui met à niveau les contrats vers une version malveillante. Une fois le contrat hostile, chaque autorisation encore active qu'il détient est une arme chargée pointée sur le portefeuille de l'utilisateur. L'utilisateur n'a besoin d'interagir avec quoi que ce soit de nouveau. Le contrat appelle simplement transferFrom de lui-même.

2. Le protocole est abandonné mais le contrat n'est pas mis en pause. De nombreux projets DeFi sont lancés, lèvent des fonds, perdent en intérêt et ferment discrètement. Les contrats continuent de tourner. Si une vulnérabilité est découverte plus tard et qu'il n'y a aucune équipe pour la corriger, les attaquants peuvent drainer chaque portefeuille ayant jamais autorisé cette adresse. Cela s'est produit à plusieurs reprises avec d'anciens contrats de staking et d'agrégateur de rendement du cycle 2020-2021.

3. Vous avez autorisé un site de phishing qui ressemblait à une vraie dapp. Une fausse interface Uniswap ou Aave fait signer une autorisation à un contrat contrôlé par l'attaquant. L'utilisateur pense qu'il trade, mais il a en réalité donné à un inconnu la permission de drainer un jeton précis. Dans ce cas, la révocation est urgente, et c'est aussi la seule solution, car l'autorisation signée est déjà on-chain.

Remarquez ce qui manque dans cette liste : il n'est pas nécessaire d'être « re-piraté » pour que le drain se produise. La vulnérabilité, c'est l'autorisation elle-même, qui dort tranquillement sur la blockchain, en attendant qu'un événement futur vienne l'activer.

Comment voir ce que vous avez déjà approuvé

La première étape est de faire l'inventaire. Connectez votre portefeuille à l'un des trois outils suivants, qui lisent tous les mêmes données de blockchain sous-jacentes et les présentent de manières légèrement différentes.

Revoke.cash est le plus accessible aux débutants. Vous arrivez sur le site, vous connectez votre portefeuille, et il liste toutes les approbations que vous avez signées sur les chaînes qu'il prend en charge, ce qui inclut aujourd'hui Ethereum, Arbitrum, Optimism, Base, Polygon, BNB Chain, et la plupart des autres grands réseaux EVM (Ethereum Virtual Machine). Chaque ligne affiche le token, le dépenseur (le contrat qui peut déplacer le token), l'autorisation (combien il peut déplacer), et un bouton « Revoke ». Il signale également les contrats qui n'ont pas été utilisés depuis longtemps comme potentiellement inactifs.

L'outil d'approbation de tokens d'Etherscan se trouve à l'adresse etherscan.io/tokenapprovalchecker. Il est moins soigné que Revoke.cash, mais il est géré par une équipe avec une longue expérience publique, et il détecte parfois des cas limites que Revoke.cash manque. Le processus est le même : se connecter, examiner, révoquer.

Le gestionnaire d'approbations intégré de Rabby est la seule option on-chain qui ne nécessite pas de visiter un site tiers. Rabby est un portefeuille (une extension de navigateur et une application mobile) qui lit lui-même vos approbations et affiche une liste « d'approbations dangereuses » dans l'interface du portefeuille. Si vous utilisez déjà Rabby, c'est le chemin le plus simple. Les données sont les mêmes ; l'interface se trouve simplement dans un endroit auquel vous faites déjà confiance.

Quel que soit l'outil que vous choisissez, n'en utilisez qu'un seul par session. Le risque de jongler avec plusieurs onglets de vérificateurs d'approbations est de perdre le fil du site connecté à votre portefeuille, ce qui constitue en soi un léger risque de phishing.

Comment déterminer quelles approbations sont réellement dangereuses

Une fois que vous avez la liste, vous n'avez pas besoin de tout révoquer. Une bonne première passe consiste à prioriser les entrées les plus risquées.

Les approbations infinies passent en premier. Triez ou filtrez la liste pour trouver toute ligne qui affiche un nombre énorme, souvent présenté en notation scientifique comme 1.15792e+59, qui est la forme encodée du maximum uint256. Ce sont les nettoyages les plus importants. Chacune représente un contrat capable de déplacer 100 pour cent de ce token depuis votre portefeuille sans redemander.

Les approbations limitées à des contrats que vous n'utilisez plus viennent ensuite. Si vous avez approuvé un contrat de staking pour exactement 500 tokens il y a deux ans et que vous ne l'utilisez plus, cette approbation est toujours active. Son rayon d'action est plus petit qu'une approbation infinie, mais c'est quand même une arme chargée pointée vers un contrat que vous ne surveillez pas.

Les contrats inactifs méritent un examen attentif. La plupart des outils d'approbation affichent un horodatage « dernière utilisation » ou marquent les contrats qui n'ont pas effectué de transaction depuis plus d'un an. Ce sont les approbations les plus susceptibles d'appartenir à des projets abandonnés, et les projets abandonnés sont les approbations les plus susceptibles d'être exploitées plus tard. Révoquez-les.

Les contrats actifs que vous utilisez encore peuvent attendre. Si vous tradez activement sur Uniswap et prêtez sur Aave, vous pouvez garder ces approbations ouvertes. Révoquer et réapprouver à chaque transaction gaspille du gaz et ajoute de la fatigue de signature, ce qui est en soi un risque de sécurité. L'objectif d'un nettoyage mensuel n'est pas zéro approbation ; c'est zéro approbation obsolète.

Le fonctionnement de la révocation et ce qu'elle coûte réellement

La révocation est elle-même une transaction on-chain. Vous appelez la fonction approve sur le contrat du token et vous fixez à zéro l'autorisation pour ce dépenseur. Le contrat du token enregistre la nouvelle autorisation, et à partir de ce bloc, le dépenseur ne peut plus déplacer vos tokens.

Sur le mainnet Ethereum, une seule révocation coûte généralement entre un et cinq dollars en gaz selon la congestion. Si vous avez vingt approbations obsolètes, cela représente une facture non négligeable. Sur les réseaux de couche 2 (L2) comme Base, Arbitrum ou Optimism, le même appel coûte quelques centimes, parfois des fractions de centime, car les L2 regroupent les transactions par lots et héritent de la sécurité d'Ethereum tout en facturant des frais bien plus bas. Si vous choisissez où effectuer votre nettoyage mensuel, le faire sur le L2 que vous utilisez réellement est presque toujours le bon choix.

Il existe un piège petit mais bien réel. Lorsque vous soumettez une transaction de révocation, le portefeuille doit toujours payer du gaz, et ce gaz doit provenir de l'actif natif de cette chaîne, c'est-à-dire ETH sur Ethereum et Arbitrum, MATIC sur Polygon, BNB sur BNB Chain. Si votre portefeuille ne contient que des stablecoins et que le solde de l'actif natif est nul, la révocation échouera. Gardez une petite quantité du token natif dans tout portefeuille que vous prévoyez de nettoyer, de l'ordre de quelques dollars.

Un autre piège : la révocation est irréversible en ce sens que vous ne pouvez pas récupérer le gaz dépensé, mais elle est aussi trivialement réversible en ce sens que vous pouvez réapprouver le même contrat dès le lendemain. Il n'y a aucune pénalité à révoquer un contrat que vous déciderez plus tard d'utiliser à nouveau ; il vous suffira de signer une nouvelle approbation, de payer le gaz correspondant, et de continuer.

Ce que la révocation ne fait pas

La révocation empêche les drains futurs provenant du contrat révoqué. Elle ne peut pas, et ne pourra jamais, annuler un drain qui a déjà eu lieu. Si votre portefeuille a été vidé en mars et que vous révoquez en mai, les tokens de mars sont perdus, et la transaction de révocation n'a aucun lien avec le vol, que ce soit d'un point de vue juridique, médico-légal ou récupérable.

La révocation ne vous protège pas non plus d'une nouvelle approbation que vous signerez demain. Si vous visitez un site de phishing, signez une approbation envers un contrat malveillant, puis essayez de nettoyer, c'est la nouvelle approbation qui pose problème, et révoquer votre ancienne autorisation Uniswap n'y change rien.

La révocation ne déplace pas vos tokens. Elle ne nécessite pas de swap, de signature d'un tiers, ni d'interaction avec le contrat du dépenseur. Il s'agit d'un simple appel de fonction au contrat du token lui-même, lui demandant de mettre à zéro une ligne de son registre d'autorisations.

Une routine mensuelle que vous pouvez vraiment suivre

La toute première raison pour laquelle les gens ne révoquent jamais, c'est que cela ressemble à une corvée ponctuelle, ce qui garantit qu'elle ne sera jamais faite. La solution la plus fiable consiste à l'associer à un événement de calendrier. Le premier dimanche du mois est un choix populaire, car les week-ends sont calmes et vous êtes moins susceptible d'être en plein trade ; certaines personnes choisissent le jour de clôture de leur relevé de carte de crédit pour la même raison. Le jour précis n'a pas d'importance. C'est la répétition qui compte.

Le jour du nettoyage, le processus est court. Ouvrez Revoke.cash, Etherscan ou votre gestionnaire d'approbations Rabby. Connectez le portefeuille que vous utilisez réellement. Triez d'abord les approbations infinies et révoquez-les. Parcourez ensuite les contrats dormants, que l'outil marque généralement, et révoquez-les. Laissez tranquilles les contrats actifs que vous utilisez encore. Confirmez chaque transaction, attendez qu'elle soit validée, puis fermez l'onglet.

Temps nécessaire sur un L2 : environ cinq à dix minutes. Temps nécessaire sur le mainnet : à peu près pareil, plus quelques dollars de gas. Une fois installée, l'habitude prend moins de temps que de consulter votre relevé bancaire et se rentabilise la première fois qu'elle bloque un drain.

Comment suivre l'actualité de la sécurité des portefeuilles de manière intelligente

Les incidents de sécurité liés aux portefeuilles évoluent vite, et la différence entre un « piratage gérable » et une « perte totale » repose presque toujours sur la rapidité avec laquelle un utilisateur entend parler d'un contrat vulnérable et révoque son approbation avant qu'un attaquant ne vide ses fonds. Suivre manuellement les forums de gouvernance, les rapports d'audit et les post-mortems de chaque protocole est une bataille perdue d'avance. Zippfeed met en avant les titres liés à la sécurité des portefeuilles et aux exploits DeFi avec une notation de sentiment (bullish, neutral ou bearish) et un indice d'importance, afin que vous puissiez révoquer les bonnes approbations avant le prochain drain, et non après.

Questions fréquemment posées

Est-il sûr d'utiliser Revoke.cash ?
Revoke.cash est l'un des outils de gestion des approbations les plus utilisés et il est en lecture seule par défaut : connecter votre portefeuille permet au site de lire vos approbations, mais il ne peut pas déplacer de fonds sans une transaction que vous signez. Cela dit, les risques standard de toute dapp s'appliquent, alors vérifiez toujours l'URL, ajoutez-la aux favoris plutôt que de la rechercher, et ne signez jamais une transaction que vous ne comprenez pas. Éducation, pas un conseil financier : utiliser un outil réputé est une bonne habitude, mais aucun outil n'élimine le besoin de lire ce que vous signez.
Comment fonctionne réellement une approbation ERC-20 ?
Lorsque vous signez une approbation, vous appelez la fonction approve sur le smart contract d'un token, lui indiquant d'autoriser une adresse de dépensier spécifique à déplacer un montant donné de vos tokens. Le contrat du token enregistre cette autorisation, et le dépensier peut appeler transferFrom en votre nom jusqu'à cette limite. L'approbation vit on-chain jusqu'à ce que vous la remettiez à zéro. C'est pourquoi une approbation à un contrat disparu depuis longtemps reste un risque actif des années plus tard.
Dois-je révoquer toutes mes approbations ?
Vous n'avez pas besoin de tout révoquer, et essayer de le faire gaspille généralement du gaz et ajoute une fatigue de signature. Priorisez les approbations infinies aux contrats que vous n'utilisez plus, puis les contrats dormants, puis les approbations limitées aux anciens protocoles. Gardez ouvertes les approbations pour les protocoles que vous utilisez activement, car révoquer et réapprouver à chaque transaction coûte de l'argent et n'offre aucun avantage réel en matière de sécurité. L'objectif d'un nettoyage est zéro approbation obsolète, pas zéro approbation.
La révocation d'une approbation me remboursera-t-elle si j'ai déjà été vidé ?
Non. Révoquer une approbation est une action tournée vers l'avenir : elle empêche le contrat révoqué de déplacer vos tokens à l'avenir, mais elle ne peut pas annuler, rembourser ou récupérer des tokens déjà volés. Si vous avez été vidé, votre voie est la réponse à incident, pas le nettoyage des approbations : déplacez les fonds restants vers un nouveau portefeuille, documentez les transactions, et signalez au projet concerné ainsi qu'aux sociétés d'analyse blockchain. L'hygiène des approbations est de la prévention, pas un mécanisme de remboursement.