Le 21 juin, l'un des bots MEV les plus actifs sur le réseau Ethereum, Jaredfromsubway.eth, a été victime d'une attaque de « honeypot » soigneusement conçue, perdant plus de 7,5 millions de dollars en actifs cryptographiques. Voici l'analyse et le suivi des flux de fonds volés réalisés par l'équipe de sécurité Beosin.
Analyse du processus d'attaque
Attaque de la famille de contrats
- Contrat coordinateur (0xb84db016324e8f2bfdd8dd9c260338aee0a8df52) : responsable de l'enregistrement de l'état armed du bloc courant et d'appeler en boucle les contrats enfants à la phase finale pour extraire les fonds. - Contrat déclencheur (0x4de8c729a064ff6087cc84a4152969349e4feb98) : responsable de définir, dans le même bloc, un état falsifié pour les paires de trading, rendant les chemins d'arbitrage apparemment exécutables. - Contrats enfants / contrats de jetons falsifiés : se présentent comme des jetons ERC-20 normaux pour obtenir des autorisations réelles. - Contrat Hub : responsable du paiement de petits rendements réels afin de rendre l'opération attrayante pour les MEV Bots. - Paire Ring V2 : paire Uniswap v2 falsifiée. - Contrat de jeton intermédiaire falsifié : utilisé pour construire des chemins d'arbitrage à plusieurs étapes, tels que fCAP, fUSDC.
L'élément clé de l'attaque : tromper l'autorisation
En analysant les transactions sur la chaîne, l'attaquant a créé plusieurs jeux de transactions pièges :
- Grand volume USDC : le robot a généré un profit d'environ 36,997120 USDC, mais a laissé 20 USDC autorisés. - Grand volume USDT : le robot a généré un profit d'environ 37,053440 USDT, mais a laissé 20 USDT autorisés. - Grand volume WETH : le robot a généré un profit d'environ 0,0179 WETH, mais a laissé 16 WETH autorisés. - Les petites transactions se sont déroulées normalement, avec les autorisations consommées dans la même transaction afin de réduire les soupçons.
Lors de transactions de faible montant, après que le robot ait autorisé un montant réel de jetons, le sous-contrat transfère immédiatement les jetons réels ; l'autorisation est consommée et semble tout à fait normale.
Dans les transactions de grande taille, le sous-contrat n'appelle pas transferFrom pour transférer les jetons réels, mais crée directement des jetons falsifiés en falsifiant la transaction. Le robot pense avoir accompli les étapes préalables normales du swap, mais l'autorisation des jetons réels reste en vigueur.
C'est le cœur même de l'attaque : les petites transactions consomment normalement l'autorisation, tandis que les grandes transactions conservent l'autorisation.
Processus d'attaque
Par exemple, avec une transaction d'attaque ciblant USDC :
(1) L'attaquant appelle le coordinateur pour définir le bloc courant comme armed. (2) L'attaquant appelle le déclencheur pour mettre à jour l'état de plusieurs paires Ring V2 falsifiées. (3) Le MEV Bot détecte une opportunité d'arbitrage et exécute la transaction.
Le processus interne du bot MEV est le suivant :
(1) Le contrat MEV Bot a autorisé un montant important d’USDC à un sous-contrat. (2) Le contrat MEV Bot appelle la fonction wrapTo/wrap du sous-contrat. (3) Le sous-contrat, étant dans un état armed, ne consomme pas d’USDC réel, mais émet des jetons falsifiés vers le pair ; l’autorisation d’USDC est conservée. (4) Le contrat MEV Bot continue d’appeler le swap du pair falsifié. (5) Le second pair envoie les jetons au contrat MEV Bot. (6) Le contrat hub paie au contrat MEV Bot un petit profit en USDC réel.

exemple d'approbation
tx hash : 0x0121e07a916c06eea3e7daf11893f3f0b95b9e1684124545ae14c32aee6029bb
Résultat vu par le MEV Bot : une opération d'arbitrage réussie générant un profit réel en USDC. Toutefois, l'autorisation USDC a été conservée par le sous-contrat. Ce processus est répété séparément pour USDC, USDT et WETH, aboutissant à un grand nombre d'autorisations.
L'hash de la transaction attaquée est :
0x2be8704f5a59b69e0b71f64aefdb99eb0e8ae9fb3926147c581910d71bcf3e65
L'attaquant appelle la boucle drain du contrat coordinateur, avec dans les données d'appel 66 adresses de contrats enfants ainsi que l'adresse du contrat MEV Bot. Dès lors que le contrat MEV Bot a précédemment accordé un quota d'autorisation aux contrats enfants, ceux-ci peuvent transférer directement les jetons réels correspondants à l'attaquant.
Résultat final :
- 20 autorisations de gros montants USDC ont été entièrement utilisées - 16 autorisations de gros montants WETH ont été entièrement utilisées - Une autorisation partielle de USDT reste en vigueur, mais le solde USDT est insuffisant
Analyse des flux de fonds
Après l'attaque réussie, l'adresse de l'attaquant (0x3e37f4A10d771Ba9dE44b6d301410b1BEdeA65d0) a reçu 2,87 M $USDC, 2,04 M $USDT et 1 474 WETH. Ensuite, l'attaquant a échangé les stablecoins contre de l'ETH et les a transférés vers les 4 adresses suivantes :
- 0xe3Da36E4bd1a5738fa5D6Ef4F0e4dF40bDeB5f17 (environ 1 000 ETH) - 0x74Dc5b93586D248D5Aec64b3586736FF0A0D0e65 (1 001 ETH) - 0xd8C125efCBc99408eC8723E9BBd81d1E8D39D845 (1 001 ETH) - 0x71d4416A7A85e08a5Fe7227Ca3B44Fc639e94e97 (1 423 ETH)
Parmi ceux-ci, 0xe3Da3 a transféré 1 000 ETH vers Tornado Cash, tandis que les trois autres adresses n'ont effectué aucun autre transfert d'ETH. Le flux de fonds est illustré ci-dessous :

Conclusion
Cet attaque démontre une méthode d'attaque hautement sophistiquée : l'attaquant ne cible pas directement le code du contrat, mais exploite la logique métier du MEV Bot en créant des scénarios d'arbitrage spécifiques, ce qui induit en erreur le MEV Bot pour qu'il accorde une autorisation apparemment sans problème, permettant ainsi le transfert de ses actifs. Pour les robots d'arbitrage et les MEV Bots, il ne suffit pas de s'appuyer uniquement sur la simulation des gains pour évaluer la sécurité d'une route ; en particulier lorsque des contrats inconnus, des tokens falsifiés ou des wrappers personnalisés sont impliqués dans la route d'arbitrage, une prudence accrue est nécessaire, et il est recommandé d'effectuer une vérification obligatoire des changements d'autorisation après la transaction.

