Comment se faire 24 millions de $ en trois clics sur Ethereum : après le hack dantesque, le temps des questions

Une première fois ratée – Le 26 octobre 2020, un utilisateur du protocole DeFi Harvest.finance a exploité une faille et récolté 24 millions de dollars. Après le temps de la stupeur, voici celui des explications !

Le déroulé de l’attaque sur Harvest.finance

Harvest.finance est un protocole DeFi permettant à ses utilisateurs d’investir automatiquement dans les stratégies de yield farming les plus rentables. L’idée est simple :

  • Comparer les rendements des différents protocoles DeFi (Uniswap, Aave, Compound, etc.) ;
  • Transférer les fonds de l’utilisateur en fonction des résultats de façon automatisée ;
  • Le tout en optimisant les frais de transfert.

Lancée le 29 août, l’idée est séduisante. Mais il y a un hic : les développeurs n’ont pas réussi à identifier une faille conceptuelle. Ainsi, le 26 octobre, un petit malin a réussi à l’exploiter pour siphonner une partie des fonds en stablecoins (USDT/USDC). Sa stratégie repose sur 2 éléments : les impermanent losses et l’arbitrage.

  • Impermanent losses : différence de valeur d’un actif entre l’instant où l’utilisateur le possède sur son portefeuille et celui où il est déposé sur le protocole DeFi.
  • Arbitrage : activité consistant à profiter des différences de prix d’un actif entre plusieurs plateformes.

Harvest.Finance calcule les parts de l’utilisateur en fonction de la valeur en temps réel des actifs déposés dans le protocole sous-jacent. Dans notre cas, il s’agit du Y pool de Curve. L’attaquant a alors manipulé le marché pour modifier leur valeur. Une fois la valeur de ces USDT/USDC manipulée, il a déposé ses fonds et obtenu ses parts pour un prix inférieur. Il a ensuite retiré ses fonds, au prix réel, pour en tirer un bénéfice.

Avec sa première transaction, il a déposé 10 ETH issus de Tornado.Cash sur Harvest.Finance :

Vient ensuite la transaction d’attaque.

  • Premièrement, le hacker a injecté une grosse quantité d’USDT et d’USDC depuis Uniswap dans son smart contract.
  • Il a ensuite converti 17 222 013 USDT en USDC via un swap dans l’Y pool de Curve. La valeur des USDC du Y pool a donc augmenté, à cause des impermanent losses. Il s’est retrouvé avec 17 216 703 USDC dans son smart contract.
  • Puis, il a déposé 49 977 469 USDC dans les réserves d’Harvest Finance. En échange, il a reçu 51 456 281 fUSDC (au prix de 0,97126080216 USDC par part). Le prix précédent l’attaque était de 0,980007 USDC. L’attaquant a ainsi fait diminuer la valeur d’une part d’environ 1 %.
  • L’attaquant a alors échangé 17 239 235 USDC pour des USDT via l’Y pool. Il a ainsi obtenu ses USDT pour la valeur initiale des USDC du Y pool (plus basse). Il s’est alors retrouvé avec 17 230 747 USDT en retour.
  • Ensuite, il a retiré toutes parts en fUSDC depuis le vault d’harvest.finance pour 50 596 877 USDC. La valeur d’un USDC dans l’Y pool diminuant, le prix d’une part était de 0,98329837664 USDC. Profit net de l’opération : 619 409 USDC.

L’attaquant a alors répété ce processus plusieurs fois au sein de la même transaction.

Après avoir exécuté 17 transactions d’attaque visant le pool d’USDC (en 4 minutes), le hacker a répété le même procédé pour les réserves d’USDT. Il donc effectué 13 transactions en 3 minutes.

Une fois ces 2 transactions d’attaque finalisées, notre petit malin a transféré 11 millions d’USDT et 13 millions d’USDC vers son adresse.

L’équipe d’Harvest Finance s’est vite rendue compte de l’attaque. Elle a déplacé les stablecoins présents dans les pools partagés vers ses coffres virtuels pour éviter que cela ne se reproduise.

Bilan de l’attaque :

  • Le prix d’une part dans le vault en USDC a diminué de 0,980007 à 0,834953 (-13,8 %) ;
  • Le prix d’une part en USDT a diminué de 0,978874 à 0,844812 (-13,7%).

Les pertes s’élèvent à 33,8 millions de dollars, soit environ 3,2 % de la valeur totale verrouillée au sein du protocole avant l’attaque.

La réaction de l’équipe de développement

L’équipe d’Harvest Finance prend l’entière responsabilité des pertes. Les fonds utilisant des pools partagés sont verrouillés, tant qu’une solution n’a pas été trouvée pour éviter l’attaque.

Les développeurs ont évoqué quelques pistes. Par exemple, ôter la possibilité de déposer et retirer les fonds en une seule transaction. Cela revient donc à supprimer les flash loans. Lors des retraits depuis un pool partagé, il est aussi possible de convertir les fonds en stablecoins dans des transactions séparées. Les manipulations de marché affecteraient alors les fonds de l’attaquant.

L’équipe d’Harvest Finance a l’espoir de récupérer les fonds dérobés. Elle propose un bounty de 100 000 dollars à quiconque permettra de remettre la main dessus. Toutefois, elle demande de ne pas « doxxer » l’attaquant.

Harvest Finance lui demande même gentiment de rendre les fonds, maintenant qu’il a exécuté son coup de maître.

En conclusion, rappelons que la finance décentralisée est très expérimentale et, de ce fait, très risquée. Quand il ne s’agit pas d’un bug dans un smart contract, ces protocoles peuvent avoir des défauts de conception qui ne sont pas visibles au premier coup d’œil. Harvest Finance en a fait l’amère expérience. Jesse Powell, CEO de Kraken, assure par exemple que sa plateforme ne couvrira jamais ce type de pertes financières, liées à ces « scams merdiques labellisés DeFi ».

Morgan Phuc

Cofounder @ 8Decimals - Partner @ Node Guardians - Journal du Coin / Trading du Coin / BitConseil