Réentrance AMP de Cream Finance
18,8 M$ drainés des marchés de prêt Cream v1 via un bug de réentrance dans le hook de transfert ERC-777 du token AMP — second des trois exploits 2021 de Cream.
- Date
- Victime
- Cream Finance
- Chaîne(s)
- Statut
- Partiellement récupéré
Le 30 août 2021, le protocole de prêt Cream Finance a subi le second de ses trois exploits majeurs de 2021, perdant environ 18,8 millions de dollars — 2 804,96 ETH et 462 079 976 tokens AMP — dans une attaque de réentrance rendue possible par le standard de token ERC-777 utilisé par AMP. L'attaquant a retourné environ 17,6 M$ des fonds volés, classant l'événement comme un white-hat opportuniste.
Ce qui s'est passé
Quand Cream a listé AMP comme actif de collatéral supporté, l'intégration a hérité d'une propriété subtile de l'implémentation ERC-777 d'AMP : chaque transfert d'AMP déclenche un hook tokensReceived() dans le contrat récepteur, permettant au destinataire d'exécuter du code arbitraire avant que la comptabilité du transfert ne soit finalisée.
La fonction borrow() de Cream suivait le schéma standard Compound v2 : envoyer les tokens empruntés à l'appelant, puis mettre à jour le solde de dette de l'appelant. Le flux prévu était sûr — jusqu'à ce que le hook AMP laisse l'emprunteur exécuter du code arbitraire dans l'écart entre « tokens envoyés » et « dette enregistrée ».
L'attaque :
- L'attaquant a emprunté un petit montant initial d'AMP depuis Cream — déclenchant le hook
tokensReceived()AMP dans le contrat de l'attaquant. - Depuis l'intérieur du hook — avant que le premier emprunt n'ait été enregistré dans la comptabilité de Cream — l'attaquant a appelé
borrow()à nouveau. - Le second emprunt voyait le collatéral de l'attaquant comme toujours non grevé (aucune dette enregistrée pour l'instant), et a émis un second emprunt contre le même collatéral.
- Répétition de la récursion jusqu'à ce que l'attaquant ait drainé l'offre AMP et ETH du protocole.
Conséquences
- Cream a mis en pause les marchés affectés et a immédiatement travaillé avec les ingénieurs de Yearn Finance pour identifier la cause racine du hook AMP.
- L'attaquant — possiblement nerveux à l'idée d'être identifié — a retourné ~17,6 M$ des 18,8 M$ en quelques jours, gardant une « prime » d'environ 6 %.
- Deux mois plus tard, en octobre 2021, Cream a subi un troisième exploit bien plus grand pour 130 M$ — un chemin de vulnérabilité séparé, mais sur le même protocole qui avait maintenant été compromis trois fois en huit mois.
Pourquoi c'est important
L'incident d'août 2021 de Cream est l'un des cas canoniques de pourquoi les hooks de token ERC-777 sont un danger de réentrance pour tout protocole gérant les soldes de tokens empruntés. La réponse défensive est double :
- Traiter chaque appel de token externe comme un point de réentrée potentiel — appliquer le schéma checks-effects-interactions rigoureusement, pas sélectivement.
- Auditer chaque intégration de token comme s'il s'agissait d'un nouveau codebase — le comportement spécifique au token (hooks ERC-777, tokens rebasants, tokens fee-on-transfer, tokens à callback) peut briser les hypothèses de sécurité qui tiennent pour les ERC-20 standards.
Les trois exploits de Cream en 2021, pris ensemble, sont aussi une étude de cas pour ce qui se passe quand la culture de sécurité d'un protocole ne peut pas suivre la vitesse de listing. Ajouter rapidement de nouveaux actifs de collatéral est une pression concurrentielle ; le faire sans analyse de réentrance par actif est payé en pertes réelles.
Sources & preuves on-chain
- [01]halborn.comhttps://www.halborn.com/blog/post/explained-the-cream-finance-hack-august-2021
- [02]coindesk.comhttps://www.coindesk.com/business/2021/08/30/defi-protocol-cream-finance-hacked
- [03]cryptonews.nethttps://cryptonews.net/news/defi/1616179/