Bug mathématique de migration Uranium Finance
57,2 M$ extraits d'Uranium Finance via une constante mal placée dans la migration v2.1 (1 000 000 vs 10 000), permettant à 1 wei d'échanger 98 % des pools.
- Date
- Victime
- Uranium Finance
- Chaîne(s)
- Statut
- Fonds dérobés
Le 28 avril 2021, l'AMM BSC Uranium Finance a été drainé d'environ 57,2 millions de dollars à travers 26 paires de marché différentes durant l'événement de migration de jetons v2.1 du protocole. L'exploit était une constante unique mal placée dans la fonction de swap — 1000**2 (= 1 000 000) là où le code aurait dû utiliser 10 000. L'écart d'un facteur 100 laissait l'attaquant drainer des pools entiers en déposant un wei d'entrée.
Ce qui s'est passé
Uranium Finance était un fork de Uniswap v2 sur BNB Chain. Dans le cadre d'une mise à niveau v2.1, l'équipe a modifié la vérification d'invariant produit-constant de la fonction de swap pour supporter un mécanisme de frais différent. Le code Uniswap original utilisait une constante de scaling spécifique dans sa « vérification de cohérence » pour le nouveau solde du pool après un swap — une vérification qui assure que le swap respecte la règle de produit constant x*y = k.
Dans le code réel d'Uniswap, la constante correspond au facteur de scaling utilisé dans le calcul d'ajustement de solde. Dans la version modifiée d'Uranium, l'équipe a mis à l'échelle l'ajustement de solde par 10 000 (une structure de frais différente) mais a laissé la constante de vérification de cohérence à 1 000 000 (la valeur non modifiée d'Uniswap).
Parce que la vérification de cohérence attendait une valeur 100× plus grande que ce que le calcul de solde réel produisait, la vérification passait pour des swaps qui violaient l'invariant jusqu'à 100×. En pratique : un attaquant pouvait envoyer 1 wei d'un jeton d'entrée et le pool le laisserait retirer jusqu'à 98 % du solde du jeton de sortie.
L'attaquant a parcouru les 26 paires de marché d'Uranium, drainant ETH, WBNB, BUSD, USDT, BTCB et une longue traîne d'autres actifs. La perte totale s'est arrêtée à ~57,2 M$.
Conséquences
- Uranium Finance a fermé définitivement dans les jours suivant l'incident.
- Les fonds ont été bridgés de BSC vers Ethereum, échangés en ETH, et envoyés vers Tornado Cash.
- En février 2025, les autorités américaines ont saisi environ 31 M$ des fonds volés originaux dans une action de confiscation coordonnée, après des années de traçage forensique.
- Une inculpation d'un individu non nommé a suivi peu après la saisie.
Pourquoi c'est important
Uranium Finance est l'un des cas les plus nets pour pourquoi forker une base de code sensible à la sécurité nécessite de réauditer chaque ligne modifiée. La fonction de swap d'Uniswap v2 a été auditée des douzaines de fois par les meilleurs relecteurs Solidity au monde ; son calcul est correct. La version modifiée d'Uranium avait été touchée par une petite équipe ajustant les frais — et la modification a cassé l'invariant.
Le pattern récidive chaque fois qu'un projet forke un AMM éprouvé au combat et change « juste un petit truc » :
- Uranium (2021) — la modification du mécanisme de frais a cassé l'invariant de swap.
- Sonne Finance (2024) — l'ordre de déploiement du fork Compound v2 a cassé l'initialisation de marché.
- Hundred Finance (2023) — le calcul de rédemption du fork Compound v2 a cassé sous donation attack.
- Velocore (2024) — CPMM style Balancer avec logique de frais modifiée a cassé les gardes d'overflow.
Chaque fork hérite de la sécurité bien comprise de l'amont ; chaque modification crée une nouvelle surface d'attaque non auditée. Le coût de la leçon — les 57 M$ d'Uranium — est payé chaque fois qu'une équipe sous-estime cette asymétrie.
Sources & preuves on-chain
- [01]halborn.comhttps://www.halborn.com/blog/post/explained-the-uranium-finance-hack-april-2021
- [02]coindesk.comhttps://www.coindesk.com/markets/2021/04/28/binance-chain-defi-exchange-uranium-finance-loses-50m-in-exploit
- [03]rekt.newshttps://rekt.news/uranium-rekt