Reentrada 5x en Grim Finance
Los vaults de Grim Finance en Fantom perdieron 30 M$ por reentrada de 5 bucles en depositFor. El TVL colapsó de 98,9 M$ a 4,2 M$.
- Fecha
- Víctima
- Grim Finance
- Cadena(s)
- Estado
- Fondos robados
El 19 de diciembre de 2021, el agregador de yield basado en Fantom Grim Finance perdió aproximadamente 30 millones de dólares por un ataque de reentrada de 5 bucles sobre la función depositFor() de su vault. Para cuando el equipo pausó el protocolo, el TVL de Grim había colapsado de 98,9 M$ a 4,2 M$: una caída del 96%.
Qué ocurrió
Los vaults de Grim Finance usaban una función depositFor() para acreditar a un usuario con shares del vault a cambio de su depósito. La función seguía el patrón típico: tirar de los tokens del usuario vía transferFrom, luego acuñar shares al usuario según el cálculo del precio de share actual.
El fallo fatal: depositFor() carecía de protección adecuada contra reentrada. Cuando el transferFrom del token depositado disparaba un callback (como puede pasar con tokens ERC-777 o fee-on-transfer, o —más directamente— cuando el atacante controlaba enteramente el contrato del "token" depositado), el callback del atacante podía re-entrar en el depositFor() de Grim mientras la primera llamada estaba aún a media ejecución.
El ataque:
- Desplegó un contrato "token" malicioso cuya función
transferFromllamaba de vuelta aldepositFor()de Grim. - Llamó a
depositFor()de Grim con el token malicioso. - La primera llamada leyó el precio actual de la share y se preparó para acuñar shares.
- Antes de que el mint de la primera llamada se completara, el callback re-entró en
depositFor()y leyó el mismo precio de share previo al mint, preparándose para acuñar más shares contra lo que debería haber sido el mismo depósito. - Bucleó 5 veces antes de que la pila de llamadas se deshiciera.
- Se marchó con 5x la asignación legítima de shares del vault por un único depósito subyacente.
Drenaje neto: ~30 M$ en los vaults afectados de Grim, denominados en BTC, ETH, FTM, USDC y otros activos.
Consecuencias
- Grim pausó todas las operaciones de los vaults en horas.
- El equipo contactó a Circle (emisora de USDC), AnySwap y MakerDAO para congelar activos vinculados a las direcciones del atacante.
- El TVL cayó de 98,9 M$ a 4,2 M$: una caída del 96% impulsada tanto por el robo realizado como por retiros entrados en pánico de depositantes de vaults no afectados.
- El protocolo nunca recuperó su posición previa al incidente entre los agregadores de yield de Fantom.
- Los fondos robados fueron lavados mediante puentes cross-chain y mezcladores; sin recuperación pública.
Por qué importa
Grim Finance es uno de una serie recurrente de incidentes de reentrada en contratos de vault que se agrupan en agregadores de yield que forkean los mismos patrones base. La clase de bug —"la transferencia externa de tokens en la ruta de depósito carece de guard de reentrada"— recurre en:
- Pickle Finance (nov 2020) — inyección de Jar falso mediante swap.
- Cream Finance (ago 2021) — reentrada por
tokensReceivedde ERC-777. - Grim Finance (dic 2021) — reentrada de 5 bucles en
depositFor. - Visor Finance (dic 2021) — reentrada en
delegateTransferERC20. - Fei/Rari (abr 2022) —
exitMarketdejado sin protección. - Penpie (sep 2024) — reentrada en plugin de Pendle.
El patrón defensivo —el ReentrancyGuard de OpenZeppelin aplicado a cada ruta mutadora de estado con llamadas externas, sin excepciones— está bien documentado y disponible libremente. Cada protocolo que envíe cualquier ruta de depósito sin el guard está a un contrato de token cuidadosamente construido del desenlace de Grim Finance. El coste de 30 M$ es la matrícula recurrente por saltarse el guard.
Fuentes y evidencia on-chain
- [01]coindesk.comhttps://www.coindesk.com/tech/2021/12/20/fantom-defi-project-grim-finance-exploited-for-30m
- [02]cryptobriefing.comhttps://cryptobriefing.com/fantom-defi-project-grim-finance-suffers-30m-hack/
- [03]decrypt.cohttps://decrypt.co/88727/grim-finance-hacked-30-million-fantom-tokens