Le 3 septembre 2021, la plateforme de lancement et de distribution de tokens DAO Maker a perdu environ 4 millions de dollars affectant environ 5 251 utilisateurs. Une fonction init() non protégée sur les contrats de distribution de DAO Maker a permis à l'attaquant de ré-initialiser le contrat, prendre le contrôle et appeler une fonction de retrait d'urgence pour drainer les fonds des utilisateurs.
Ce qui s'est passé
DAO Maker exploitait une infrastructure de vente de tokens et de vesting — les tokens alloués aux utilisateurs et les fonds contribués étaient détenus dans des contrats de distribution en attente des calendriers de vesting.
La faille fatale était le bug canonique d'initializer ré-invocable : la fonction init() du contrat de distribution — qui définissait le propriétaire du contrat et les paramètres critiques — n'avait aucune protection contre un second appel.
L'attaque :
- A appelé
init()sur un contrat de distribution déjà déployé et financé, en passant des paramètres qui définissaient l'attaquant comme propriétaire du contrat. - Avec la propriété saisie, a appelé la fonction
emergencyExit/ retrait privilégié du contrat — légitimement disponible pour le propriétaire — pour transférer les fonds des utilisateurs. - A répété sur les pools affectés, drainant environ 4 M$.
Conséquences
- DAO Maker a reconnu la brèche et s'est engagée à indemniser les utilisateurs affectés depuis ses réserves d'entreprise et de trésorerie.
- Les contrats compromis ont été retirés et remplacés par des versions correctement protégées.
- Les fonds volés ont été blanchis ; aucune récupération publique.
Pourquoi c'est important
DAO Maker est une entrée de plus dans la lignée des initializers ré-invocables — le pattern catastrophique Solidity le plus répété du catalogue :
- Parity Multisig (2017) —
initWalletré-invocable, 30 M$ volés + 150 M$ gelés. - DODO (mars 2021) —
init()ré-invocable sur Crowdpools. - Punk Protocol (août 2021) —
Initialize()ré-invocable via delegatecall. - DAO Maker (sept. 2021) —
init()non protégée, saisie de propriété. - Audius (2022) — initializer de gouvernance ré-invocable.
Plus de cinq ans de la même classe de bug exactement, chaque instance coûtant des millions, malgré le fait que la mitigation est un seul modifier d'une ligne bien documenté (l'initializer d'OpenZeppelin). La récurrence est la leçon : connaître une classe de vulnérabilité en tant qu'industrie n'empêche pas les équipes individuelles de l'expédier. Chaque nouveau contrat upgradeable, écrit par une équipe qui n'a peut-être pas intériorisé l'historique Parity/DODO/Punk, est une nouvelle opportunité d'omettre la protection.
DAO Maker est aussi notable pour l'impact en nombre d'utilisateurs — environ 5 251 utilisateurs affectés — illustrant que les plateformes de lancement/distribution concentrent les fonds de nombreux utilisateurs individuels dans des contrats partagés, de sorte qu'un seul bug d'initializer devient un événement à plusieurs milliers de victimes plutôt qu'une perte unique de trésorerie de protocole. Le rayon d'impact de la classe de bug s'échelle avec la quantité d'argent utilisateur que le contrat vulnérable garde en custodie, et les plateformes de distribution en gardent beaucoup.
Sources & preuves on-chain
- [01]halborn.comhttps://www.halborn.com/blog/post/explained-the-dao-maker-hack-september-2021
- [02]newsweek.comhttps://www.newsweek.com/dao-maker-hack-7m-stolen-defi-heist-1618785
- [03]rekt.newshttps://rekt.news/daomaker-rekt