
Empoisonnement d'adresse : l'attaque qui a juste besoin que vous copiiez la mauvaise
La plupart des attaques contre les utilisateurs de crypto exigent que vous commettiez une erreur : cliquer sur un lien, taper une phrase de récupération dans un formulaire, approuver quelque chose que vous n'avez pas lu. L'empoisonnement d'adresse demande moins que cela. Il demande que vous copiiez une adresse depuis votre propre historique de transactions.
Pas de logiciel malveillant, pas de site d'hameçonnage, aucune signature à vous soutirer. Toute la contribution de l'attaquant consiste à déposer une chaîne d'apparence plausible là où vous irez plus tard la chercher.
Comment ça marche
Commençons par ce qui rend la chose possible : personne ne lit les adresses. Une adresse Bitcoin ou Ethereum, c'est une trentaine de caractères en base58 ou en hexadécimal, sans signification, sans somme de contrôle jugeable à l'œil nu, et sans aucune raison de la retenir. Alors tous les portefeuilles, explorateurs de blocs et plateformes les raccourcissent à l'affichage — 0x8f3C…9A063 — et tous les utilisateurs apprennent à vérifier les extrémités visibles et à sauter le milieu.
Cette habitude constitue toute la surface d'attaque.
L'attaquant génère des adresses par force brute jusqu'à ce que l'une partage les premiers et derniers caractères avec une adresse que vous utilisez vraiment — souvent une à laquelle vous avez récemment envoyé de l'argent. C'est bon marché. Générer des paires de clés est rapide, et faire correspondre, disons, quatre caractères de tête et quatre de queue prend quelques secondes sur du matériel ordinaire. Personne ne casse quoi que ce soit ; on lance les dés jusqu'à ce qu'un nombre paraisse familier.
Ensuite, ils font entrer cette adresse dans votre historique. Les méthodes courantes :
La poussière. Ils vous envoient une somme minuscule — quelques satoshis, une fraction de centime d'un jeton — depuis l'adresse sosie. C'est une transaction entrante ordinaire, elle atterrit donc dans votre historique comme n'importe quelle autre. Sur les chaînes UTXO, cette poussière devient en plus une pièce dépensable dans votre portefeuille, ce qui compte plus tard.
Les transferts de valeur nulle. Sur les chaînes EVM, un transfer ERC-20 de zéro jeton est une transaction valide. L'attaquant envoie 0 jeton depuis votre adresse vers son sosie, ce que certaines interfaces affichent comme un paiement sortant effectué par vous. Votre historique montre désormais que vous auriez envoyé à une adresse que vous n'avez jamais choisie.
Les faux événements. Un contrat de jeton malveillant peut émettre un événement Transfer qui n'a jamais eu lieu. Les explorateurs et portefeuilles qui font confiance aux journaux d'événements l'afficheront. Rien n'a bougé ; l'enregistrement est simplement un mensonge.
Puis ils attendent. Des jours, parfois des mois. L'attaque rapporte la prochaine fois que vous voulez payer la même contrepartie, que vous faites défiler votre historique à la recherche de « l'adresse que j'ai utilisée la dernière fois » et que vous copiez la mauvaise ligne. Les deux ressemblent à 0x8f3C…9A063. Vous vérifiez les extrémités. Les extrémités correspondent.
Pourquoi le conseil habituel ne tient pas
« Vérifiez toujours deux fois l'adresse » est la recommandation classique, et seule, elle échoue, car vérifier est précisément ce que l'attaque anticipe. Vous avez vérifié. Vous avez comparé les six caractères affichés par votre portefeuille aux six caractères de votre mémoire, et ils étaient identiques — parce que l'attaquant les a rendus identiques.
La vérification ne fonctionne que si ce que vous comparez est coûteux à falsifier. Quatre ou six caractères identiques coûtent quelques secondes. Seize caractères identiques coûteraient plus cher que ne vaut le vol. Tout le jeu consiste à savoir de quel côté de cette courbe se trouvent vos habitudes.
Il existe un second piège sur les chaînes UTXO. Ce paiement de poussière est maintenant une pièce dans votre portefeuille et, si votre portefeuille consolide automatiquement les entrées, elle peut être balayée dans une transaction ultérieure — reliant l'adresse poussiéreuse au reste de vos pièces. C'est un problème de confidentialité plutôt que de vol, mais c'est la raison pour laquelle il vaut mieux ignorer la poussière que la ranger.
Ce qui protège vraiment
Ne tirez jamais une adresse d'un historique de transactions. C'est le seul changement qui compte. Votre historique est un registre de ce qui s'est passé, pas une liste de ceux à qui vous faites confiance — et n'importe qui au monde peut y écrire. Obtenez les adresses auprès de la contrepartie, par un canal où vous repéreriez un imposteur, ou depuis un carnet d'adresses que vous avez rempli vous-même.
Comparez des adresses entières, ou comparez quelque chose qui résume l'adresse entière. Lire les quarante-deux caractères n'est pas réaliste. Comparer un identicône — une petite image générée de façon déterministe à partir de toute la chaîne — l'est, car un sosie qui diffère n'importe où au milieu produit une image visiblement différente. Votre œil fait le travail que votre patience ne fera pas.
Utilisez un contact enregistré. Une adresse enregistrée une fois, depuis une source vérifiée une fois, ne peut plus être empoisonnée ensuite. C'est à cela que servent les carnets d'adresses, et c'est pourquoi SSP conserve les contacts sur votre appareil plutôt que sur un serveur : une liste de contacts n'est digne de confiance que si personne d'autre ne peut la modifier.
Envoyez un paiement test pour les virements importants ou les premiers envois. Petite somme, confirmation de réception par un autre canal, puis le reste. Les frais rendent cela pénible, et cela reste la bonne pratique pour un paiement que vous détesteriez perdre.
Ignorez la poussière. Ne la dépensez pas, ne « faites pas le ménage », et méfiez-vous de la consolidation automatique si la confidentialité vous importe.
Ce que SSP fait à ce sujet
L'empoisonnement d'adresse est autant un problème d'affichage qu'un problème de sécurité ; une partie de la réponse tient donc à la façon dont les adresses sont dessinées.
SSP raccourcit les adresses avec six caractères de tête et six de queue — 0x8f3C4b…9A0631 — plutôt que les trois ou quatre qu'utilisent beaucoup d'interfaces. Ce n'est pas un choix cosmétique. Chaque caractère supplémentaire multiplie le coût de force brute pour produire une correspondance, et douze caractères visibles placent un sosie convaincant nettement hors de portée d'une génération occasionnelle.
Le milieu est atténué, pas supprimé. Dans la forme dépliée, le portefeuille affiche la chaîne complète, extrémités en gras et milieu dans une couleur plus claire, si bien que la partie sur laquelle les attaquants comptent que vous passerez reste physiquement à l'écran, au lieu d'être remplacée par des points de suspension qui pourraient cacher n'importe quoi.
Le même code tourne dans les deux applications. splitAddressForDisplay dans SSP Wallet est un portage direct de celui de SSP Key, gardé délibérément identique pour qu'une adresse s'affiche pareil sur votre navigateur et sur votre téléphone. Cela compte parce que SSP vous montre la transaction deux fois, sur deux appareils — et un second regard n'est une vraie vérification que si les deux surfaces rendent la même chose de la même façon. Deux troncatures différentes laisseraient un écart se cacher dans la différence.
Sur l'écran d'approbation de SSP Key, le destinataire est présenté avec un identicône généré à partir de l'adresse complète, à côté du texte tronqué, et un appui déplie l'adresse entière en texte sélectionnable. L'identicône est ce qui met en échec une substitution au milieu : un attaquant peut faire correspondre vos caractères de tête et de queue, mais il ne peut pas faire correspondre une image dérivée de chaque caractère sans résoudre un problème bien plus difficile.
Rien de tout cela n'est une garantie. Si vous collez une adresse empoisonnée et l'approuvez sur les deux appareils, SSP la signera — c'est ce que signifie être un portefeuille que vous contrôlez plutôt qu'un dépositaire qui met vos décisions en doute. Le multisig deux-sur-deux empêche quelqu'un d'autre de dépenser vos pièces ; il ne peut pas vous empêcher de payer volontairement la mauvaise personne. Comme pour toute attaque qui fonctionne en vous faisant agir, la défense doit intervenir avant la signature, pas pendant.
La version courte
L'empoisonnement d'adresse fonctionne parce que vous comparez six caractères au lieu de quarante-deux, et l'attaquant sait lesquels. La défense n'est pas plus de vigilance : c'est de ne jamais prendre une adresse dans un endroit où un attaquant peut écrire, et d'utiliser des outils qui remettent devant vous les parties que vous auriez sautées.


