Reentrada de solo lectura en Conic Finance
El Omnipool ETH de Conic tenía guards de reentrada pero asumía una dirección ETH de Curve v2 específica. Un nuevo CurveLPOracleV2 se coló, drenando $3,2M.
- Fecha
- Víctima
- Conic Finance
- Cadena(s)
- Estado
- Fondos robados
El 21 de julio de 2023, la plataforma Curve-Omnipool Conic Finance perdió 1.724 ETH (~3,2 millones de dólares) por un exploit de reentrada de solo lectura. El protocolo tenía guards de reentrada en su lugar — pero se basaban en una suposición incorrecta sobre cómo los pools ETH de Curve v2 representan ETH internamente, permitiendo al atacante saltarse el guard por completo.
Qué ocurrió
El Omnipool ETH de Conic agregaba depósitos de usuarios a través de múltiples pools de liquidez de Curve para maximizar el rendimiento. Para valorar los tokens LP depositados, Conic usaba su contrato CurveLPOracleV2 — un oráculo recién desplegado que leía los pools subyacentes de Curve para computar el valor justo.
El guard de reentrada en el oráculo era condicional a un método _isETH() que devolvía true si una de las monedas del pool era la dirección canónica de ETH (0xeeeeeeee...eeeeeeee). Para los pools que coincidían con esta comprobación, el contrato adquiría un lock de reentrada antes de leer el estado. Para los pools que no coincidían, omitía el lock.
El error fatal: los pools Curve v2 que contienen ETH usan la dirección de WETH internamente, no la dirección canónica de ETH. El método _isETH() devolvía false para estos pools, y el contrato procedía sin el lock de reentrada.
El ataque:
- Préstamo flash de 20.000 stETH.
- Inició una serie de swaps a través del pool Curve de rETH que lo puso en un estado de ejecución parcial.
- A mitad de ejecución — mientras el pool rETH era internamente inconsistente — llamó al oráculo de Conic para leer el precio del token LP de rETH.
- El oráculo, sin el guard de reentrada, leyó el estado manipulado a mitad del swap y devolvió un precio incorrecto (inflado) para los tokens LP rETH.
- Depositó y retiró posiciones de Conic a la tasa inflada, acuñando casi el doble de tokens cncETH por el mismo valor de depósito.
- Encadenó la operación, drenó fondos del Omnipool, devolvió el préstamo flash.
Robo neto: 1.724 ETH (~$3,2M).
Consecuencias
- Conic pausó el Omnipool y publicó un post-mortem detallado.
- El equipo anunció un plan de compensación financiado con ingresos del protocolo.
- El CurveLPOracleV2 fue parcheado para usar la lógica de reentrada correcta consciente de WETH.
- El exploit reveló que el alcance de auditoría no había incluido CurveLPOracleV2 — el contrato fue desplegado después de la auditoría más reciente y el mismo problema de reentrada había sido previamente identificado y corregido en versiones anteriores del oráculo, pero reintroducido cuando se escribió V2.
Por qué importa
El incidente de Conic Finance es un caso de libro de texto de dos modos de fallo que se componen:
-
La reentrada de solo lectura es más difícil de detectar que la reentrada con escritura. La mayoría de la educación sobre reentrada se centra en ataques que mutan el estado durante la re-entrada — los guards checks-effects-interactions protegen específicamente contra esto. La reentrada de solo lectura — donde la función re-entrada solo lee estado, pero ese estado está a mitad de mutación — se cuela del análisis intuitivo porque "solo estamos leyendo" se siente seguro. El
remove_liquidityde Curve v1 es una fuente particularmente fértil de bugs de reentrada de solo lectura que las integraciones de oráculos posteriores siguen pasando por alto. -
Los bugs parcheados reaparecen en código nuevo. El oráculo anterior de Conic había sido auditado y parcheado contra la misma clase de reentrada; el oráculo V2, escrito desde cero por el mismo equipo, reintrodujo el bug porque no formaba parte del alcance de auditoría. El patrón se repite donde quiera que un equipo envía una "reescritura v2" de un contrato que había sido endurecido en v1 — el conocimiento institucional sobre vulnerabilidades específicas conocidas no siempre se transfiere a través de la reescritura.
La respuesta defensiva es consistente: cada integración de oráculo que lea del estado de otro protocolo debe manejar explícitamente la superficie de reentrada conocida de ese protocolo, y cualquier reescritura de un contrato previamente auditado debe incluir una re-auditoría de la clase de bug específica que abordó la corrección original. Los $3,2M de Conic son el precio de saltarse estos pasos.
Fuentes y evidencia on-chain
- [01]halborn.comhttps://www.halborn.com/blog/post/explained-the-conic-finance-hack-july-2023
- [02]coindesk.comhttps://www.coindesk.com/tech/2023/07/21/defi-protocol-conic-finance-hacked-for-1700-ether
- [03]immunebytes.comhttps://immunebytes.com/blog/conic-finance-detailed-hack-analysis-july-21/