Aller au contenu
Fondé MMXXVIVol. VI · № 273RSS
Blockchain Breaches

Archive des incidents de sécurité dans les cryptomonnaies — piratages, exploits, défaillances de ponts et rug pulls, documentés avec des preuves on-chain.

Dossier № 246Bug de smart contract

Drainage par arrondi du DEX Bunni

Une erreur d'arrondi dans la fonction withdraw de Bunni DEX a drainé 8,4 M$ sur Ethereum et Unichain. Le protocole a fermé.

Date
Victime
Bunni
Statut
Fonds dérobés

Le 2 septembre 2025, le DEX basé sur Uniswap v4 Bunni a été exploité pour environ 8,4 millions de dollars sur Ethereum et Unichain. Le bug était une erreur de direction d'arrondi dans la fonction withdraw : les développeurs avaient arrondi vers le bas en croyant que cela ferait augmenter les soldes inactifs, mais les mathématiques fonctionnaient à l'opposé, permettant à un attaquant de retirer des tokens disproportionnés tout en brûlant moins de liquidité qu'il n'aurait dû. Bunni a définitivement fermé deux mois plus tard, citant des coûts de remédiation à 6-7 chiffres pour la relance.

Ce qui s'est passé

Bunni était un DEX natif Uniswap v4 avec une couche personnalisée de gestion de liquidité conçue pour optimiser l'efficacité du capital via un rééquilibrage automatisé. La fonction withdraw du protocole calculait combien de liquidité sous-jacente brûler par unité de sortie retirée — un calcul qui impliquait une division entière avec une direction d'arrondi sur laquelle les développeurs avaient raisonné pendant la conception.

La faille fatale : le raisonnement sur la direction d'arrondi était inversé. Les développeurs avaient conclu qu'arrondir une valeur intermédiaire clé vers le bas ferait augmenter le « solde inactif » du protocole (une propriété conservatrice désirable). En pratique, les mathématiques fonctionnaient à l'opposé — arrondir vers le bas faisait en réalité diminuer le calcul du solde inactif, laissant plus de valeur disponible pour le retraiteur à extraire.

L'attaque :

  1. Emprunt flash de tokens pour financer le capital opérationnel.
  2. Exécution de swaps soigneusement forgés via le pool weETH/ETH de Bunni sur Unichain et le pool USDC/USDT sur Ethereum — pré-positionnant l'état du pool.
  3. Déclenchement de la fonction withdraw avec des paramètres maximisant l'impact de l'erreur d'arrondi.
  4. Retrait significativement plus de tokens que la liquidité brûlée n'aurait dû le permettre.
  5. Répétition sur les deux chaînes, extrayant environ 8,4 M$ au total.

Conséquences

  • Bunni a mis en pause les smart contracts en quelques heures après la détection.
  • L'équipe a initialement annoncé des plans de récupération et de remédiation du protocole.
  • Après deux mois d'évaluation, Bunni a publiquement annoncé une fermeture définitive, citant :
    • Des coûts de remédiation à « 6-7 chiffres » pour les audits et le monitoring requis pour relancer en toute sécurité.
    • Des ressources insuffisantes pour absorber la perte tout en finançant l'effort de reconstruction.
  • L'équipe a open-sourcé les contrats v2 sous licence MIT comme contribution d'adieu.
  • Les fonds volés ont été blanchis ; aucune récupération publique.

Pourquoi c'est important

L'incident Bunni est l'une des démonstrations les plus claires de comment une seule inversion de direction d'arrondi peut être une primitive d'exploit pleinement chargée. Les développeurs avaient explicitement raisonné sur le comportement d'arrondi — ils avaient juste raisonné incorrectement. L'audit (Bunni avait été audité) n'a pas capturé l'inversion, vraisemblablement parce que les cas de test n'exerçaient pas les conditions d'entrée spécifiques où la direction de l'arrondi importait.

Leçons structurelles :

  1. Le raisonnement sur la direction d'arrondi est exceptionnellement facile à se tromper dans les mathématiques de protocole. La combinaison de « l'intuition sur ce qui devrait se passer » + « la division entière Solidity » + « les calculs multi-étapes complexes » produit des bugs qui passent la revue par des personnes qui pensent comprendre le code.

  2. Les tests basés sur les propriétés (Echidna, invariants Foundry, Halmos) capturent les bugs de direction d'arrondi bien plus fiablement que les tests unitaires basés sur des exemples, parce que les tests de propriété explorent l'espace d'entrée à la recherche de violations d'invariants plutôt que de tester des sorties attendues spécifiques.

  3. La relance post-exploit est économiquement infaisable pour de nombreux petits protocoles. Le calcul de l'équipe Bunni — coût de remédiation à 6-7 chiffres vs. récupération incertaine de la confiance des utilisateurs — est le même calcul qui a détruit Polter Finance, plusieurs forks Compound v2, et de nombreux autres projets de taille moyenne. L'asymétrie entre le coût de prévention d'un exploit (audits + infrastructure de test : peut-être 200 K$) et le coût de récupération d'un exploit (remédiation + audits + monitoring + reconstruction de confiance utilisateur : 1 M$+ si le projet survit du tout) continue de déplacer la frontière rationnelle vers un investissement pré-lancement plus conservateur.

L'open-sourcing par Bunni des contrats v2 comme geste d'adieu est inhabituel et vaut d'être noté — la plupart des protocoles qui cessent leur activité arrêtent simplement de maintenir leur code. La release sous licence MIT donne aux autres builders Uniswap v4 la chance d'apprendre de la conception de Bunni (et d'éviter ses bugs spécifiques) sans avoir à construire les mêmes primitives à partir de zéro.

Sources & preuves on-chain

  1. [01]halborn.comhttps://www.halborn.com/blog/post/explained-the-bunni-hack-september-2025
  2. [02]coindesk.comhttps://www.coindesk.com/web3/2025/09/02/bunni-dex-halts-smart-contracts-after-exploit-drains-usd8-4m-across-chains
  3. [03]coindesk.comhttps://www.coindesk.com/business/2025/10/23/bunni-dex-shuts-down-cites-recovery-costs-after-usd8-4m-exploit

Dépôts liés