Auteur : Victory & Lisa
Contexte
Le 22 mai, selon des nouvelles de la communauté, le fournisseur de liquidité Cetus sur l'écosystème SUI aurait été attaqué, la profondeur du pool de liquidité a considérablement diminué, et plusieurs paires de tokens sur Cetus ont montré une baisse, avec des pertes estimées à plus de 230 millions de dollars. Ensuite, Cetus a publié un communiqué disant : "Un incident a été détecté dans notre protocole, par mesure de sécurité, le contrat intelligent a été temporairement suspendu. L'équipe enquête actuellement sur cet incident. Nous publierons bientôt une déclaration d'enquête supplémentaire."
Après l'incident, l'équipe de sécurité SlowMist a immédiatement analysé et publié un avertissement de sécurité. Voici une analyse détaillée des méthodes d'attaque et des transferts de fonds.

(https://x.com/CetusProtocol/status/1925515662346404024)
Informations connexes
Une des transactions d'attaque :
https://suiscan.xyz/mainnet/tx/DVMG3B2kocLEnVMDuQzTYRgjwuuFSfciawPvXXheB3x
Adresse de l'attaquant :
0xe28b50cef1d633ea43d3296a3f6b67ff0312a5f1a99f0af753c85b8b5de8ff06
Adresse de la piscine attaquée :
0x871d8a227114f375170f149f7e9d45be822dd003eba225e83c05ac80828596bc
Tokens impliqués :
haSUI / SUI
Analyse de l'attaque
Le cœur de cet incident réside dans le fait que l'attaquant a soigneusement construit des paramètres pour provoquer un dépassement tout en contournant la détection, permettant finalement d'échanger une très petite quantité de tokens contre d'énormes actifs de liquidité. Voici l'analyse des étapes spécifiques :

1. L'attaquant a d'abord emprunté 10 024 321,28 haSUI par un prêt flash, entraînant une chute du prix du pool de 18 956 530 795 606 879 104 à 18 425 720 184762886, avec une baisse de près de 99,90 %.

2. L'attaquant a soigneusement choisi une plage de prix extrêmement étroite pour ouvrir une position de liquidité :
Limite inférieure des ticks : 300000 (prix : 60 257 519 765 924 248 467 716 150)
Limite supérieure des ticks : 300200 (prix : 60 863 087 478 126 617 965 993 239)
Largeur de la plage de prix : seulement 1,00496621%
3. Ensuite, vient le cœur de cette attaque, l'attaquant déclare qu'il souhaite ajouter une liquidité énorme de 10 365 647 984 364 446 732 462 244 378 333 008 unités, mais en raison d'une vulnérabilité, le système n'a pris qu'un seul token A.

Analysons pourquoi l'attaquant a pu échanger 1 token contre d'énormes liquidités. La raison principale est que la fonction get_delta_a présente une vulnérabilité de contournement de la détection de dépassement dans checked_shlw. L'attaquant a exploité cela, provoquant une déviation sévère dans le calcul du haSUI réellement nécessaire. Comme le dépassement n'a pas été détecté, le système a mal évalué la quantité de haSUI requise, permettant à l'attaquant d'échanger une quantité très faible de tokens contre une grande quantité d'actifs de liquidité, réalisant ainsi l'attaque.
Lorsque le système calcule combien de haSUI est nécessaire pour ajouter une telle liquidité énorme :

Le point clé ici est que l'implémentation de la fonction checked_shlw présente un défaut grave. En réalité, toute valeur d'entrée inférieure à 0xffffffffffffffff << 192 contourne la détection de dépassement. Cependant, lorsque ces valeurs sont décalées à gauche de 64 bits, le résultat dépasse la plage de représentation de u256, à ce moment-là, les données de poids fort sont tronquées, entraînant un résultat bien inférieur à la valeur théorique. Ainsi, le système sous-estime la quantité de haSUI nécessaire dans les calculs ultérieurs.

Masque erroné : 0xffffffffffffffff << 192 = une valeur très grande (environ 2^256-2^192)
Pratiquement toutes les entrées sont inférieures à ce masque, contournant la détection de dépassement
Le véritable problème : lorsque n >= 2^192, n << 64 dépasse la portée de u256 et est tronqué
La valeur intermédiaire construite par l'attaquant liquidity * sqrt_price_diff = 6277101735386680763835789423207666908085499738337898853712 :
Inférieur au masque erroné, contournant la détection de dépassement
Mais après un décalage à gauche de 64 bits, cela dépasse la valeur maximale de u256, entraînant ainsi un tronquage des parties dépassantes
Cela a conduit le résultat final à être environ inférieur à 1, mais comme c'est arrondi à l'entier supérieur, le quotient calculé est égal à 1

4. Enfin, l'attaquant a retiré la liquidité, obtenant d'énormes gains en tokens :
Première suppression : obtenu 10 024 321,28 haSUI
Deuxième suppression : obtenu 1 haSUI
Troisième suppression : obtenu 10 024 321,28 haSUI

5. L'attaquant a remboursé le prêt flash, réalisant un bénéfice net d'environ 10 024 321,28 haSUI et 5 765 124,79 SUI, l'attaque est terminée.
Situation de correction du projet
Après l'incident, Cetus a publié un correctif. Le code de correction spécifique peut être consulté ici : https://github.com/CetusProtocol/integer-mate/pull/7/files#diff-c04eb6ebebbabb80342cd953bc63925e1c1cdc7ae1fb572f4aad240288a69409.
La fonction checked_shlw corrigée est la suivante :

Instructions de correction :
Corrigez le masque erroné 0xffffffffffffffff << 192 à la valeur seuil correcte 1 << 192
Corrigez la condition de jugement de n > mask à n >= mask
Assurez-vous de pouvoir détecter correctement et de retourner un indicateur de dépassement lorsque le décalage à gauche de 64 bits peut entraîner un dépassement
Analyse de MistTrack
Selon l'analyse, l'attaquant 0xe28b50cef1d633ea43d3296a3f6b67ff0312a5f1a99f0af753c85b8b5de8ff06 a réalisé un profit d'environ 230 millions de dollars, y compris SUI, vSUI, USDC et d'autres actifs.

Nous avons découvert que l'attaquant avait préparé le Gas Fee deux jours auparavant, puis a effectué une tentative avant l'attaque, mais a échoué :

Après avoir réalisé des bénéfices, l'attaquant a transféré une partie des fonds comme
USDC, SOL, suiETH via des ponts inter-chaînes comme Sui Bridge, Circle, Wormhole, Mayan vers l'adresse EVM 0x89012a55cd6b88e407c9d4ae9b3425f55924919b :

Dont 5,2341 WBNB ont été transférés par la chaîne à l'adresse BSC 0x89012a55cd6b88e407c9d4ae9b3425f55924919b :

Ensuite, l'attaquant a transféré une valeur de
10 millions de dollars d'actifs déposés sur Suilend :

L'attaquant a également transféré 24 022 896 SUI à une nouvelle adresse 0xcd8962dad278d8b50fa0f9eb0186bfa4cbdecc6d59377214c88d0286a0ac9562, et n'a pas encore été transférée :

Heureusement, selon Cetus, avec la coopération de la fondation SUI et d'autres membres de l'écosystème, 162 millions de dollars de fonds volés sur SUI ont été gelés avec succès.

(https://x.com/CetusProtocol/status/1925567348586815622)
Ensuite, nous avons utilisé l'outil d'analyse de blanchiment d'argent et de traçage sur la chaîne MistTrack pour analyser l'adresse 0x89012a55cd6b88e407c9d4ae9b3425f55924919b qui a reçu des fonds inter-chaînes sur EVM.
Cette adresse a reçu 5,2319 BNB sur BSC, et n'a pas encore été transférée :

Cette adresse a reçu 3 000 USDT, 40 880 000 USDC, 1 771 SOL et 8 130,4 ETH sur Ethereum.
Dont USDT, USDC et SOL ont été échangés contre ETH via CoW Swap, ParaSwap :


Ensuite, cette adresse a transféré 20 000 ETH à l'adresse 0x0251536bfcf144b88e1afa8fe60184ffdb4caf16, et n'a pas encore été transférée :

Actuellement, le solde de cette adresse sur Ethereum est de 3 244 ETH :

MistTrack a ajouté les adresses connexes ci-dessus à sa base de données d'adresses malveillantes, et nous continuerons à surveiller le solde de ces adresses.
Résumé
Cette attaque a démontré la puissance des vulnérabilités de dépassement mathématique. L'attaquant a choisi des paramètres spécifiques par un calcul précis, exploitant le défaut de la fonction checked_shlw pour obtenir des liquidités d'une valeur de plusieurs milliards pour le coût d'un token. C'est une attaque mathématique extrêmement raffinée, l'équipe de sécurité SlowMist recommande aux développeurs de vérifier rigoureusement toutes les conditions limites des fonctions mathématiques lors du développement de contrats intelligents.
