
Plus de 1900 ETH volés : comment un pirate a vidé Radiant Capital de 4,5 millions de dollars
TechFlow SélectionTechFlow Sélection

Plus de 1900 ETH volés : comment un pirate a vidé Radiant Capital de 4,5 millions de dollars
Le 3 janvier 2024, le projet Radiant Capital a été victime d'une attaque par prêt flash menée par un attaquant, qui a dérobé plus de 1900 ETH (d'une valeur supérieure à 4,5 millions de dollars) via trois transactions. Les fonds volés sont actuellement toujours conservés sur l'adresse de l'attaquant.
Rédaction : Beosin
Le 3 janvier 2024, selon les données du système de surveillance, d'alerte et d'interdiction des risques de sécurité EagleEye appartenant à Beosin, le projet Radiant Capital a été victime d'une attaque par prêt flash. L'attaquant a dérobé plus de 1900 ETH (valeur supérieure à 4,5 millions de dollars) via trois transactions. Les fonds volés sont toujours conservés à l'adresse de l'attaquant. L'équipe de sécurité Beosin a analysé immédiatement cet incident.
Analyse de la vulnérabilité
La cause fondamentale de cet événement réside dans le fait que lors du calcul du nombre de jetons, le projet Radiant Capital a utilisé une extension de précision combinée à un arrondi arithmétique, permettant ainsi à l'attaquant de manipuler la taille de la précision et de tirer profit de l'arrondi pour maximiser ses gains.

En observant le code ci-dessus, la fonction rayDiv prend deux valeurs uint256, « a » et « b ». Le processus peut être simplifié comme suit : (a*RAY + b/2)/b, où RAY est la constante d'extension de précision égale à 10^27. Le résultat équivaut donc à a*RAY/b + 0,5, réalisant ainsi une fonction d'arrondi. L'erreur principale de ce calcul provient de « b ». Si « b » est très faible comparé à « a », l'erreur devient négligeable. Toutefois, si « b » est du même ordre de grandeur que « a », l'erreur peut atteindre jusqu'à la valeur même de « a ».
Par exemple : si a*RAY = 10 000 et b = 3, le résultat calculé est 3333, soit une erreur de -1/10 000 par rapport à la valeur réelle. En revanche, si a*RAY = 10 000 et b = 3000, le résultat est 3, soit une erreur de -1/10.
Dans cet incident, l'attaquant a manipulé la valeur de « b » afin qu'elle soit du même ordre de grandeur que « a », rendant le calcul équivalent à 3/2,0001 = 1, avec une sous-estimation de 1/3 par rapport à la valeur réelle.
Procédure de l'attaque
Examinons maintenant les étapes suivies par l'attaquant :
1. L’attaquant emprunte initialement 3 millions de USDC via un prêt flash Aave, servant de capital initial pour l'attaque.

2. L’attaquant engage 2 millions de USDC dans le contrat Radiant et reçoit en échange 2 millions de jetons de preuve rUSDCn.

3. L’attaquant utilise un prêt flash via le contrat Radiant pour emprunter 2 millions de USDC, puis dans la fonction de rappel (callback), il rembourse les 2 millions de USDC, retire simultanément les USDC engagés à l'étape 2, et finalement la fonction de prêt flash invoque transferFrom pour transférer les USDC de l’attaquant vers le contrat, intérêts compris. À ce stade, des frais de 9/10 000 sont prélevés, qui s'ajoutent alors à la liquidité du pool.

4. En répétant plusieurs fois l'étape 3, l’attaquant augmente considérablement la valeur de liquidityIndex, qui atteint finalement : 271800000000999999999999998631966035920.

5. Ensuite, l’attaquant crée un nouveau contrat et y transfère 543 600 USDC. Cette valeur (5436) correspond exactement au double de 2718 (premières décimales de liquidityIndex), facilitant ainsi le contrôle de l'arrondi.

6. L’attaquant engage entièrement les 543 600 USDC dans le contrat Radiant et obtient une quantité équivalente de rUSDCn.

7. L’attaquant retire 407 700 USDC. Normalement, cela aurait dû entraîner la destruction de 407 700 rUSDCn. Cependant, comme mentionné précédemment, la fonction burn applique une extension de précision et un arrondi arithmétique.
407700000000000000000000000000000000000 / 271800000000999999999999998631966035920 = 1,49999999, arrondi à 1, ce qui conduit à une sous-estimation de 1/3.
Comme illustré ci-dessous, au lieu de détruire 407 700 rUSDCn, il en reste 271 800, indiquant que seulement 271 800 ont été brûlés, bien que 407 700 USDC aient été retirés.

8. Profitant de cette vulnérabilité à l’étape 7, l’attaquant répète les opérations de mise en gage et de retrait, chaque retrait excédant le montant mis en gage de 1/3, vidant finalement complètement le pool de tous ses USDC.

Suivi des fonds
Au moment de la publication, les 1902 ETH volés restent sur l'adresse de l'attaquant sans avoir été déplacés. Beosin Trace continuera de surveiller ces fonds en temps réel.

Alors que 2024 commence, nous avons déjà assisté à deux vols importants. (Résumé de l'incident d'hier : Premier cas de l'année : que s'est-il passé avec Orbit Chain, dont 80 millions de dollars ont été volés ?) Ces incidents rappellent une fois encore que dans l'écosystème Web3, la sécurité reste primordiale !
Bienvenue dans la communauté officielle TechFlow
Groupe Telegram :https://t.me/TechFlowDaily
Compte Twitter officiel :https://x.com/TechFlowPost
Compte Twitter anglais :https://x.com/BlockFlow_News














