El 2 de enero de 2021 (hora de Beijing 07:25 am), nuestro sistema de monitoreo ThunderForecast reportó una serie de transacciones sospechosas hacia el contrato inteligente yCREDIT. Luego, utilizamos el sistema EthScope desarrollado por nuestro equipo de investigación para analizar estas transacciones y confirmar que todas las transacciones reportadas son maliciosas. En este blog, ilustramos los detalles del ataque.
Detalles
El ataque se debe a que la cantidad de tokens acuñados es inconsistente con la prevista. De esta manera, el atacante puede obtener muchos más tokens yCREDIT a un precio más bajo. Luego, estos tokens pueden venderse para obtener ganancias.
La función vulnerable se encuentra en la función _deposit del contrato StableYieldCredit.
A continuación, utilizaremos una transacción de ataque para ilustrar todo el proceso.

El atacante primero transfirió 1e-8 WBTC y 331.335 yCredit tokens al pool de pares WBTC-yCREDIT. Luego, el atacante depositó 0.5 WBTC en el contrato StableYieldCredit para lanzar el ataque.
Específicamente, el _value se calcula utilizando el amount (0.5) del token (0x2260fac5e5542a773aa44fbcfedf7c193bc2c599 - WBTC) basándose en el proveedor de oráculo de precios ChainLink (línea 480, _value es 1466786010075). La intención es calcular el valor del WBTC depositado en USD. Luego, el contrato transferirá la cantidad de tokens yCREDIT (_value - fee) a quien depositó el WBTC (el atacante). Esto se debe a que el valor de yCREDIT equivale a un USD (según el diseño del sistema). Todo está bien excepto que el atacante pierde una pequeña cantidad de fee.
Además, el contrato agregará el WBTC depositado al pool de pares WBTC-yCREDIT. Esto se debe a que si el WBTC depositado se bloquea en el contrato, perderá liquidez. Por ello, primero se calculó el valor del par de tokens (WBTC a yCREDIT) que se colocará en el pool. Este valor se calcula utilizando la función _addLiquidity. Básicamente, se calcula en función de las reservas existentes dentro del pool. Dado que el pool solo tiene 1e-8 WBTC y 331.335 yCREDIT tokens, el amountA calculado es 44 (amountB es 1466786010075). Eso significa que el atacante solo gasta 44e-8 WBTC (línea 485) y obtiene 14667.86010075 - fee = 14594.52080025 tokens yCREDIT (línea 493). Al mismo tiempo, una pequeña cantidad de WBTC (1e-8 + 44e-8) y (331.335 + 14667.86010075) tokens yCREDIT permanecen en el pool.
Para obtener ganancias, el atacante simplemente puede intercambiar los 14594.52080025 tokens yCREDIT obtenidos en los exchanges. Curiosamente, el proceso para obtener ganancias en esta transacción es mucho más complicado de lo necesario. También hemos observado una estrategia de ataque inteligente en otras transacciones.
Hay una serie de transacciones involucradas en el ataque, incluyendo (pero no limitándose a) las siguientes.
Actualización
2020/01/03: Hay un nuevo contrato inteligente que corrige la vulnerabilidad.
Cronología
- 2021/01/01 23:25 UTC, los ataques fueron capturados por nuestro sistema
- 2021/01/02 16:20 UTC, este blog es publicado



