El 16 de julio de 2024, el protocolo de liquidez cross-chain LI.FI fue explotado por aproximadamente 11,6 millones de dólares. El bug era una única verificación de validación ausente en un facet recién desplegado del contrato diamond-proxy de LI.FI: una verificación que el deployer simplemente había olvidado incluir.
Qué ocurrió
Los contratos inteligentes de LI.FI usan el patrón diamond proxy: una sola dirección de contrato de cara al usuario enruta a un conjunto de contratos de implementación enchufables ("facets") que manejan funcionalidad específica (bridging, swapping, recolección de comisiones, etc.). Los usuarios que interactúan con LI.FI conceden aprobaciones de tokens al diamond proxy, a menudo con allowances infinitos: un patrón UX común en DeFi.
La librería LibSwap de LI.FI, usada por muchos de los facets, permite al protocolo hacer llamadas arbitrarias a cualquier contrato durante un swap, necesario para enrutar a través de DEX, recolectores de comisiones y puentes desconocidos. La librería es intencionalmente permisiva; la seguridad depende de los facets que la llaman validando los destinos del swap y la calldata antes de invocar la librería.
Un nuevo facet desplegado el 16 de julio no incluyó esta validación. Cualquier llamador podía:
- Identificar una wallet con aprobación infinita al diamond de LI.FI.
- Construir un "swap" cuya calldata subyacente invocara
transferFrom()sobre el allowance de la víctima. - Enviar el swap; el facet de LI.FI llamaba a LibSwap; LibSwap despachaba la llamada arbitraria; los tokens de la víctima se transferían al atacante.
El atacante barrió 11,6 M$ en ETH, USDC, USDT y DAI de wallets que alguna vez habían concedido aprobaciones infinitas a LI.FI. El número de wallets afectadas fue pequeño (el equipo estimó "un número muy pequeño de usuarios"), pero esos usuarios tenían saldos altos.
Consecuencias
- LI.FI pausó el diamond en horas desde la primera transacción maliciosa y añadió avisos on-chain sobre las direcciones afectadas.
- El equipo publicó un detallado análisis post-mortem y se comprometió al reembolso completo de los usuarios afectados con respaldo de inversores.
- El exploit fue el segundo incidente de seguridad de LI.FI: un bug menor en 2022 había costado ~600.000 $ mediante un patrón relacionado de manejo de aprobaciones.
Por qué importa
LI.FI es un caso fuerte para dos lecciones relacionadas:
- Las aprobaciones infinitas son confianza infinita: cualquier contrato al que un usuario alguna vez haya concedido aprobación ilimitada puede drenar sus tokens para siempre, incluso mediante bugs introducidos en código futuro que no existía en el momento de la aprobación. La UX de revoke —Revoke.cash et al.— es una respuesta parcial; la mejor respuesta es aprobaciones acotadas con expiración, que la mayoría de wallets ahora ofrecen por defecto para el patrón permit EIP-2612.
- Las primitivas permisivas necesitan defensa en profundidad: cuando una librería está diseñada para permitir llamadas arbitrarias, cada llamador de esa librería es responsable de validar sus entradas. Un único despliegue olvidadizo de un facet rompió todo el modelo de confianza de LI.FI.
Fuentes y evidencia on-chain
- [01]li.fihttps://li.fi/knowledge-hub/incident-report-16th-july/
- [02]coindesk.comhttps://www.coindesk.com/business/2024/07/16/defi-protocol-lifi-struck-by-8m-exploit
- [03]unchainedcrypto.comhttps://unchainedcrypto.com/li-fi-drained-of-more-than-10-million-via-wallets-with-infinite-approval-settings/