L’attaquant de KyberSwap a utilisé un « problème d’argent infini » pour drainer des fonds : expert DeFi

L’attaquant qui a détourné 46 millions de dollars de KyberSwap s’est appuyé sur un « exploit de contrat intelligent complexe et soigneusement conçu » pour mener l’attaque, selon un fil de discussion sur les réseaux sociaux du fondateur d’Ambient Exchange, Doug Colkitt.

Colkitt étiqueté l’exploit est un « problème d’argent infini ». Selon lui, l’attaquant a profité d’une implémentation unique de la fonction de liquidité concentrée de KyberSwap pour « tromper » le contrat en lui faisant croire qu’il avait plus de liquidité qu’il n’en avait en réalité.

La plupart des bourses décentralisées (DEX) offrent une fonction de « liquidité concentrée », qui permet aux fournisseurs de liquidité de fixer un prix minimum et maximum auquel ils proposeraient d’acheter ou de vendre des crypto-monnaies. Selon Colkitt, cette fonctionnalité a été utilisée par l’attaquant KyberSwap pour drainer des fonds. Cependant, l’exploit « est spécifique à la mise en œuvre par Kyber d’une liquidité concentrée et ne fonctionnera probablement pas sur d’autres DEX », a-t-il déclaré.

L’attaque KyberSwap consistait en plusieurs exploits contre des pools individuels, chaque attaque étant presque identique les unes aux autres, a déclaré Colkitt. Pour illustrer son fonctionnement, Colkitt a considéré l’exploit du pool ETH/wstETH sur Ethereum. Ce pool contenait de l’Ether (ETH) et du Lido Wrapped Staked Ether (wstETH).

L’agresseur a commencé par emprunt 10 000 wstETH (d’une valeur de 23 millions de dollars à l’époque) de la plateforme de prêt flash Aave, comme le montrent les données de la blockchain. Selon Colkitt, l’attaquant a ensuite déversé 6,7 millions de dollars de ces jetons dans le pool, provoquant l’effondrement de son prix à 0,0000152 ETH pour 1 wstETH. À ce niveau de prix, aucun fournisseur de liquidité n’était disposé à acheter ou à vendre, la liquidité aurait donc dû être nulle.

L’attaquant a ensuite déposé 3,4 wstETH et a proposé d’acheter ou de vendre entre 0,0000146 et 0,0000153, retirant 0,56 wstETH immédiatement après le dépôt. Colkitt a émis l’hypothèse que l’attaquant aurait pu retirer le wstETH de 0,56 pour « aligner parfaitement les calculs numériques ultérieurs ».

Après avoir effectué ce dépôt et ce retrait, l’attaquant a effectué un deuxième et un troisième échange. Le deuxième swap a poussé le prix à 0,0157 ETH, ce qui aurait dû désactiver la liquidité de l’attaquant. Le troisième swap a fait remonter le prix jusqu’à 0,00001637. Celui-ci se situait également en dehors de la fourchette de prix fixée par le propre seuil de liquidité de l’attaquant, car il était désormais supérieur à son prix maximum.

Théoriquement, les deux derniers échanges n’auraient dû rien produire, car l’attaquant achetait et vendait sur sa propre liquidité, puisque tous les autres utilisateurs avaient un prix minimum fixé bien en dessous de ces valeurs. « En l’absence d’un bug numérique, quelqu’un qui ferait cela ferait simplement des échanges avec sa propre liquidité », a déclaré Colkitt, ajoutant, « et tous les flux seraient nuls (moins les frais). »

Cependant, en raison d’une particularité de l’arithmétique utilisée pour calculer la limite supérieure et inférieure des fourchettes de prix, le protocole n’a pas réussi à supprimer la liquidité dans l’un des deux premiers swaps, mais l’a également rajoutée lors du swap final. En conséquence, le pool a fini par « compter deux fois la liquidité de la position LP initiale », ce qui a permis à l’attaquant de recevoir 3 911 wstETH pour une quantité minimale d’ETH. Bien que l’attaquant ait dû déverser 1 052 wstETH lors du premier échange pour mener l’attaque, cela lui a quand même permis de gagner 2 859 wstETH (6,7 millions de dollars au prix actuel) après avoir remboursé son prêt flash.

L’attaquant a apparemment répété cet exploit contre d’autres pools KyberSwap sur plusieurs réseaux, pour finalement s’en tirer avec un total de 46 millions de dollars de butin cryptographique.

En rapport: L’échange HTX perd 13,6 millions de dollars dans le piratage du portefeuille chaud : rapport

Selon Colkitt, KyberSwap contenait un mécanisme de sécurité dans la fonction calculateSwapStep qui était destiné à empêcher cet exploit d’être possible. Cependant, l’attaquant a réussi à maintenir les valeurs numériques utilisées dans l’échange juste en dehors de la plage qui provoquerait le déclenchement de la sécurité, comme l’a déclaré Colkitt :

« [T]La «quantité atteinte» était la limite supérieure pour atteindre la limite de tick et a été calculée comme étant … 2 208 000, alors que l’exploitant a défini une quantité d’échange de … 2 207 999 99.[.] Cela montre à quel point cet exploit a été soigneusement conçu. La vérification a échoué de <0,00000000001 %. »

Colkitt a qualifié l’attaque de « facilement l’exploit de contrat intelligent le plus complexe et le plus soigneusement conçu que j’ai jamais vu ».

Comme l’a rapporté Cointelegraph, KyberSwap a été exploité pour 46 millions de dollars le 22 novembre. L’équipe a découvert une vulnérabilité le 17 avril, mais aucun fonds n’a été perdu dans cet incident. L’interface utilisateur de la bourse a également été piratée en septembre de l’année dernière, bien que tous les utilisateurs aient été indemnisés pour cet incident. L’attaquant du 22 novembre a informé l’équipe qu’il était prêt à négocier pour restituer une partie des fonds.