Exploit de periferia en Exactly Protocol
Un atacante pasó un mercado falso y un permit forjado al DebtManager de Exactly en Optimism; leverage() no validó nada, drenando 7,3 M$ de 117 cuentas.
- Fecha
- Víctima
- Exactly Protocol
- Cadena(s)
- Estado
- Fondos robados
El 18 de agosto de 2023, el protocolo de préstamo basado en Optimism Exactly Protocol fue explotado por aproximadamente 7,3 millones de dólares en ETH. El bug estaba en el contrato de periferia DebtManager, específicamente la función leverage() que aceptaba como entrada tanto una dirección de contrato de mercado como una firma permit y no validaba ninguna. 117 cuentas de usuarios vieron sus depósitos drenados. El TVL del protocolo cayó de 37 M$ a 11,74 M$ —un descenso del 70%— en horas.
Qué ocurrió
Los mercados principales de préstamo de Exactly fueron rigurosamente auditados; los contratos de periferia que los rodeaban —contratos de utilidad que ayudaban a los usuarios a realizar operaciones de varios pasos como el préstamo apalancado— estaban originalmente fuera del alcance. El DebtManager era uno de esos contratos de periferia.
La función leverage() en DebtManager aceptaba:
- Un parámetro
marketque identificaba con qué mercado de Exactly interactuar. - Una firma
permitque autorizaba transferencias de tokens en nombre del usuario.
La función usaba estas entradas para realizar una serie de operaciones que en última instancia movían valor desde las posiciones existentes del usuario en mercados legítimos de Exactly. El fallo fatal: ninguno de los parámetros era validado:
- El parámetro
marketse aceptaba tal cual, de modo que un atacante podía pasar la dirección de un contrato de mercado falso que había desplegado. - El
permitse procesaba mediante la lógica estándar ERC-2612, pero la función no verificaba que el permit hubiera sido firmado para el propósito correcto o por el participante legítimo del mercado.
El atacante:
- Desplegó un contrato "mercado" falso que implementaba la interfaz esperada pero hacía internamente lo que el atacante quisiera.
- Forjó un permit para la operación: la firma del permit era técnicamente válida para la llamada a la función, pero su semántica no coincidía con una operación legítima de apalancamiento en Exactly.
- Llamó a
leverage()con ambas entradas: la función usó las respuestas del mercado falso para controlar cómo se movía el valor entre los contratos legítimos de Exactly, enrutando en última instancia el colateral del usuario al atacante.
Drenadas de 117 cuentas por un total de ~7,3 M$.
Consecuencias
- Exactly pausó el protocolo en horas, siguiendo su manual de procedimientos de emergencia.
- El equipo reenganchó públicamente a ABDK, el auditor original, para una nueva ronda de auditorías, esta vez incluyendo los contratos de periferia que se habían excluido del alcance de la auditoría original.
- Se lanzó un plan de reembolso, financiado con ingresos del protocolo y reservas del equipo.
- Los fondos robados fueron lavados mediante Tornado Cash; sin recuperación pública.
Por qué importa
El incidente de Exactly Protocol es uno de los casos más claros del alcance de la auditoría como control de seguridad por sí mismo. Los mercados de préstamo fueron correctamente auditados y funcionaron según diseño. El bug estaba en los contratos que hablaban con los mercados: código de periferia que el equipo había desplegado para mejorar la UX pero que no estaba bajo el mismo rigor de seguridad que el núcleo del protocolo.
Las lecciones estructurales:
-
Los contratos de periferia son parte de la superficie de ataque del protocolo incluso cuando no retienen directamente fondos de usuarios. Si un contrato de periferia puede mover fondos de usuarios mediante permits o aprobaciones, tiene los mismos requisitos de seguridad que el núcleo.
-
El alcance de la auditoría debe ser explícito sobre lo que no está cubierto, y cualquier contrato excluido de auditoría debe excluirse del despliegue en producción hasta que tenga su propia revisión dedicada.
-
Las firmas permit son una primitiva poderosa que requiere validación semántica cuidadosa: una firma permit ERC-2612 válida no te dice por qué el firmante autorizó la operación, solo que firmó alguna operación. Cualquier función que consuma permits debe validar que los parámetros del permit coinciden con el propósito previsto.
La respuesta de Exactly Protocol —reenganchar al auditor original con alcance ampliado— se ha convertido en un patrón recurrente en la remediación post-incidente en todo DeFi. La lección, pagada con los 7,3 M$ de los usuarios afectados, es la correcta aunque el coste haya sido alto.
Fuentes y evidencia on-chain
- [01]halborn.comhttps://www.halborn.com/blog/post/explained-the-exactly-protocol-hack-august-2023
- [02]theblock.cohttps://www.theblock.co/post/246196/exactly-protocol-exploited-7-million-optimism-layer-2-network
- [03]olympix.securityhttps://olympix.security/blog/exactly-protocol-lost-7-3m-the-code-worked-the-assumptions-didnt