El 3 de septiembre de 2021, la plataforma de lanzamiento y distribución de tokens DAO Maker perdió aproximadamente 4 millones de dólares, afectando a unos 5.251 usuarios. Una función init() desprotegida en los contratos de distribución de DAO Maker permitió al atacante reinicializar el contrato, apoderarse de la propiedad y llamar a una función de retiro de emergencia para drenar los fondos de los usuarios.
Qué ocurrió
DAO Maker operaba infraestructura de venta y vesting de tokens: los tokens asignados a los usuarios y los fondos aportados se mantenían en contratos de distribución a la espera de los calendarios de vesting.
El fallo fatal fue el bug canónico del inicializador re-invocable: la función init() del contrato de distribución —que establecía el propietario del contrato y los parámetros críticos— no tenía ninguna protección contra ser llamada por segunda vez.
El ataque:
- Llamó a
init()en un contrato de distribución ya desplegado y financiado, pasando parámetros que establecían al atacante como propietario del contrato. - Con la propiedad capturada, llamó a la función
emergencyExit/ retiro privilegiado del contrato —legítimamente disponible para el propietario— para transferir los fondos de los usuarios. - Repitió el proceso en los pools afectados, drenando aproximadamente 4 M$.
Consecuencias
- DAO Maker reconoció la brecha y se comprometió a compensar a los usuarios afectados con reservas corporativas y de tesorería.
- Los contratos comprometidos se retiraron y reemplazaron con versiones debidamente protegidas.
- Los fondos robados fueron lavados; no hubo recuperación pública.
Por qué importa
DAO Maker es una entrada más en el linaje del inicializador re-invocable, el patrón catastrófico de Solidity más repetido del catálogo:
- Parity Multisig (2017) —
initWalletre-invocable, 30 M$ robados + 150 M$ congelados. - DODO (mar 2021) —
init()re-invocable en Crowdpools. - Punk Protocol (ago 2021) —
Initialize()re-invocable vía delegatecall. - DAO Maker (sep 2021) —
init()desprotegido, captura de propiedad. - Audius (2022) — inicializador de gobernanza re-invocable.
Más de cinco años de la misma clase exacta de bug, cada instancia costando millones, pese a que la mitigación es un único modificador bien documentado de una sola línea (el initializer de OpenZeppelin). La recurrencia es la lección: conocer una clase de vulnerabilidad como industria no impide que equipos individuales la envíen a producción. Cada nuevo contrato actualizable, escrito por un equipo que tal vez no haya interiorizado la historia de Parity/DODO/Punk, es una nueva oportunidad para omitir la protección.
DAO Maker también es notable por el impacto en el número de usuarios —~5.251 usuarios afectados—, lo que ilustra que las plataformas de lanzamiento/distribución concentran los fondos de muchos usuarios individuales en contratos compartidos, de modo que un único bug de inicializador se convierte en un evento de muchos miles de víctimas en lugar de una pérdida de tesorería de un solo protocolo. El radio de impacto de la clase de bug escala con la cantidad de dinero de los usuarios que custodia el contrato vulnerable, y las plataformas de distribución custodian mucho.
Fuentes y evidencia 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