Sécurité et wallets · 6 min · démo interactive
Les approbations de tokens : l'arnaque qui vide ton wallet
Une approbation donne à un contrat le droit de prendre tes tokens plus tard, sans te redemander ton avis. Teste ce que ce droit permet quand le contrat tourne mal.
L’idée en une phrase
Approuver un token, c'est signer une procuration qui permet à une autre adresse de prendre tes tokens, jusqu'à un plafond, aussi longtemps que tu ne la retires pas.
Un contrat ne peut pas aspirer un token ERC-20 de sa propre initiative. Il faut d'abord que le propriétaire appelle approve. Ensuite, le contrat appelle transferFrom quand il veut, sans nouvelle signature. Ce décalage dans le temps fait tout le danger : le vol peut arriver des mois après le clic.
La démo
Sans JavaScript, retiens ce calcul. Tu as 1 000 TEST et tu paies 100. Avec une approbation exacte, l'autorisation tombe à 0 après le paiement : si le contrat est compromis ensuite, la perte est de 0. Avec une approbation illimitée, il reste 900 TEST exposés, et aussi tout ce que tu recevras plus tard. Le token TEST est fictif et aucune transaction réelle n'est envoyée.
Pourquoi ça compte
Tu échanges 100 tokens sur une application. Ton wallet te demande deux signatures : la première autorise le contrat, la seconde lance l'échange. Par confort, l'interface propose souvent une autorisation illimitée, pour t'éviter de repayer du gas au prochain échange. Tu acceptes, l'échange se passe bien, tu oublies.
Un an plus tard, ce contrat se fait pirater, ou il n'a jamais été honnête. Ton wallet contient 8 000 tokens. Tu ne signes rien, tu ne fais aucune erreur ce jour-là, et tout part. Le fait générateur remonte à l'année précédente, pas à ce matin. C'est pourquoi les victimes jurent souvent, de bonne foi, n'avoir « rien signé ».
Ce mécanisme n'est pas un défaut caché. C'est la conception même d'ERC-20, indispensable au swap dans un AMM, au prêt et à presque toute la DeFi. Le comprendre te permet de le doser. Une seed phrase bien protégée ne te sauve pas ici, car c'est toi qui as donné le droit.
Le code
Voici le cœur d'un token ERC-20 réduit à l'essentiel, puis les deux scénarios. Remplace MAX par 100n dans le second appel à scenario, ou change le solde, et relance.
Clique sur Lancer pour exécuter ce code dans ton navigateur.
Ce qui se passe vraiment
Commence en mode exact avec 100 TEST. Clique sur Approuver : le solde ne bouge pas. Une approbation ne déplace aucun token, elle écrit seulement un nombre dans le contrat du token, dans une table du type allowance[toi][contrat]. Le chiffre « perte maximale possible » passe de 0 à 100.
Clique sur Payer. Le contrat appelle transferFrom, le token vérifie que l'autorisation couvre le montant, déplace les fonds et décrémente l'autorisation. Elle retombe à 0. Clique alors sur Le contrat est compromis : il n'y a plus rien à prendre.
Réinitialise, passe en mode illimité et refais la même séquence. Cette fois l'autorisation vaut 2^256 − 1, le plus grand entier qu'un uint256 peut contenir. Le nombre est si grand qu'aucun solde réel ne peut l'atteindre, et beaucoup de tokens le traitent comme un cas spécial : ils ne le décrémentent jamais. Après le paiement, l'exposition reste égale à tout ton solde.
Essaie aussi cette variante : vide le wallet avec le bouton de compromission, puis clique sur Recevoir 5 000 TEST. L'exposition remonte aussitôt. L'autorisation est attachée au couple (toi, contrat), pas aux tokens présents ce jour-là. Un wallet vide n'est donc pas un wallet sain.
Enfin, Révoquer signe approve(contrat, 0). Ce n'est pas une option de ton wallet, c'est une transaction normale qui réécrit le même nombre à zéro. La démo simplifie deux points : elle ne suit qu'un seul contrat et un seul token, et elle ne compte pas le gas.
Dans la vraie vie
Approbation exacte ou illimitée
L'approbation exacte coûte une transaction d'approbation à chaque usage, donc du gas en plus. L'approbation illimitée économise ce coût et transfère le risque vers toi, pour une durée indéterminée. La plupart des wallets laissent modifier le montant avant de signer. Pour un usage ponctuel, saisir le montant exact ne coûte rien de plus sur le moment.
Révoquer, concrètement
Il n'existe pas de bouton magique dans la blockchain. Tu dois envoyer, pour chaque couple token et contrat, une transaction approve(contrat, 0), qui coûte du gas. Pour retrouver tes autorisations actives, rien n'est secret : elles sont publiques, et chaque approbation émet un événement Approval lisible par n'importe qui. Certains wallets et explorateurs de blocs les listent. Vérifie toujours l'adresse du contrat que tu appelles, et méfie-toi d'un site trouvé par une recherche ou reçu dans un message : un faux outil de révocation est lui-même un piège classique.
La révocation agit pour l'avenir seulement. Elle ne récupère rien de ce qui a déjà été pris. Et sur un réseau donné, elle ne concerne que ce réseau : une approbation sur un autre réseau reste active.
Signer sans transaction
Le standard EIP-2612 ajoute permit : tu signes un message hors chaîne, sans gas, et quelqu'un d'autre soumet cette signature pour créer l'autorisation. C'est pratique et discret, car rien n'apparaît sur la chaîne tant que la signature n'est pas utilisée. Une telle signature comporte une date limite et un nonce. Tant qu'elle n'a pas servi, l'annuler passe par la consommation de ce nonce, ce qui demande là aussi une transaction.
Les NFT ont leur équivalent, setApprovalForAll, qui couvre toute une collection d'un coup, sans plafond. La page repère la transaction de phishing te fait reconnaître ces signatures en situation, et le décodeur de calldata traduit celles que tu as sous les yeux.
Ce qui peut mal tourner
- Le faux site qui demande un « approve ». Une page imite une application connue et réclame une autorisation illimitée vers le contrat de l'attaquant. Le vol suit souvent en quelques secondes, de façon automatisée.
- Le contrat légitime piraté. Tu as approuvé un vrai service, mais son contrat ou sa clé d'administration est compromis. Toutes les autorisations illimitées actives deviennent exploitables. Un contrat modifiable peut aussi changer de logique après ton approbation.
- Le nom trompeur. L'écran de signature montre parfois « Autoriser l'accès à ton token ». Ce qui compte est l'adresse du dépensier et le montant, pas le texte de la page.
- Le token bizarre. Certains tokens s'écartent du standard. L'USDT sur Ethereum refuse de passer directement d'une autorisation non nulle à une autre : il faut d'abord repasser par zéro. Un contrat de token peut aussi comporter une fonction d'administration qui contourne tes autorisations.
- La course à l'approbation. Si tu remplaces une autorisation de 100 par 50, le dépensier peut, s'il surveille le mempool, tirer 100 avant ta transaction, puis 50 après. Repasser par zéro et n'accorder que le nécessaire limite cet effet.
- Le coffre et le wallet courant confondus. Un wallet qui signe tous les jours accumule des autorisations. Séparer l'épargne des usages quotidiens, avec un wallet dédié, réduit ce que ces autorisations peuvent toucher.
Teste-toi
Contenu éducatif. Pas un conseil en investissement. Les crypto-actifs comportent un risque de perte en capital. Pour la démarche éditoriale, voir à propos. Mise à jour : 31 octobre 2026.