Mint infini Yearn yETH
Le pool StableSwap yETH de Yearn a minté 235 septillions de yETH depuis 16 wei : un retrait avait remis l'offre à zéro mais laissé les soldes virtuels en cache.
- Date
- Victime
- Yearn Finance
- Chaîne(s)
- Statut
- Partiellement récupéré
Le 30 novembre 2025, le pool StableSwap yETH custom de Yearn Finance a été exploité pour environ 9 millions de dollars via ce que Check Point Research a appelé l'« exploit 16 Wei » — l'attaquant a minté 235 septillions de yETH (2,35 × 10^23 jetons) depuis un dépôt de 16 wei (valant environ 0,00000000000000005 $). Le bug : des soldes virtuels stockés persistaient en stockage après une suppression de liquidité qui remettait l'offre du pool à zéro. Yearn a récupéré 2,39 M$ via un clawback coordonné avec les équipes Plume et Dinero.
Ce qui s'est passé
Le produit yETH de Yearn était un pool style StableSwap agrégeant divers jetons de liquid staking pegged à ETH. Pour réduire les coûts de gaz durant les opérations, l'implémentation du pool utilisait un tableau packed_vbs[] — soldes virtuels stockés mis en cache en stockage pour que le protocole puisse éviter des lectures cross-contract coûteuses à chaque opération.
La vulnérabilité résidait dans l'écart entre deux chemins de mutation d'état :
- Le compteur
totalSupplydu pool se remettait à zéro lorsque toute la liquidité était supprimée — l'état standard « le coffre est vide ». - Les soldes virtuels en cache
packed_vbs[]ne se réinitialisaient PAS lorsque l'offre passait à zéro — ils conservaient leurs dernières valeurs enregistrées avant la suppression de liquidité.
Cela laissait le pool dans un état fantôme : du point de vue comptable du protocole, l'offre était zéro, mais les soldes virtuels en cache enregistraient toujours une valeur substantielle. Tout dépôt ultérieur calculerait le prix par part comme (valeur_en_cache + nouveau_dépôt) / nouvelle_offre — et avec nouvelle_offre étant la seule chose réellement mise à l'échelle par le dépôt, même un dépôt microscopique produirait des calculs de prix par part astronomiques.
L'attaque :
- A détecté le pool dans son état fantôme — offre vide, soldes virtuels en cache non nuls.
- A déposé 16 wei — une quantité si petite qu'elle serait normalement ignorée ou rejetée.
- Le pool a calculé l'allocation de parts comme fonction des soldes en cache, mintant ~235 septillions de jetons yETH à l'attaquant contre le dépôt de 16 wei.
- A échangé le yETH minté via le pool Curve yETH-WETH, extrayant environ 900 000 $ en ETH réel de Curve.
- A continué le drainage : le pool stableswap yETH lui-même a été vidé pour 8 millions de dollars supplémentaires alors que l'attaquant exerçait sa détention de parts absurde contre les réserves sous-jacentes du pool.
Extraction totale : environ 9 millions de dollars en ETH et équivalents ETH-LST. 1 000 ETH (~3 M$) ont été acheminés vers Tornado Cash en quelques heures.
Conséquences
- Yearn a mis en pause les opérations yETH et travaillé avec les protocoles aval détenant du yETH pour coordonner la réponse.
- Une opération de clawback avec les équipes Plume et Dinero a récupéré 857,49 pxETH (~2,39 M$) — des fonds qui avaient été bridgés vers la chaîne de Plume et pouvaient être inversés via une intervention coordonnée sur l'état.
- Yearn a souligné — et vérifié on-chain — que les coffres v2 et v3 et autres produits n'étaient pas affectés ; le bug était spécifique à l'implémentation stableswap yETH custom.
- Les produits restants de l'attaquant ont été blanchis via Tornado Cash et des ponts cross-chain.
Pourquoi c'est important
L'exploit yETH est l'un des cas 2025 les plus nets pour comment les optimisations de performance créent une nouvelle surface d'attaque. Le caching de stockage packed_vbs[] était un choix de conception légitime d'économie de gaz — des lectures cross-contract pour récupérer le solde de chaque jeton LP auraient rendu chaque opération yETH prohibitivement coûteuse. Mais le cache a créé un état qui divergeait de la réalité sous-jacente réelle du pool, et le bug était dans comment cette divergence était gérée aux cas limites.
Les leçons structurelles :
- L'état en cache a des exigences d'invariant séparées de la source de vérité sous-jacente. Chaque chemin de code qui mute l'offre, les soldes ou les calculs de parts doit aussi raisonner sur si le cache est encore valide — et soit l'invalider explicitement, soit affirmer les invariants qui en dépendent.
- Les cas limites impliquant des états d'offre zéro sont particulièrement dangereux pour les calculs de prix par part. La mitigation standard — minting de dead-shares au déploiement du pool pour empêcher l'offre d'atteindre jamais zéro — a été documentée depuis au moins 2021. Le pool yETH custom de Yearn a été déployé sans ce pattern.
- Le cadrage « 16 wei » est un artefact de communication frappant — le dépôt de 16 wei de l'attaquant (0,00000000000000005 $) produisant 9 M$ d'extraction est l'un des plus hauts effets de levier économiques jamais enregistrés. L'asymétrie est la leçon récurrente à la frontière entre implémentation efficace en gaz et sécurité adverse.
C'était le troisième incident majeur de Yearn dans l'histoire du protocole (après l'exploit du contrat legacy iEarn en avril 2023 et un incident plus petit de 2021). La réponse de l'équipe — pause rapide, clawback cross-protocoles coordonné, post-mortem transparent — a été l'une des performances de réponse à incident les plus nettes de 2025.
Sources & preuves on-chain
- [01]dlnews.comhttps://www.dlnews.com/articles/defi/yearn-finance-looted-for-9m-after-attacker-minted-trillions/
- [02]theblock.cohttps://www.theblock.co/post/381740/yearn-finance-9-million-yeth-exploit-confirms-partial-recovery-outlines-remediation
- [03]research.checkpoint.comhttps://research.checkpoint.com/2025/16-wei/