CertiK: Análisis de los ataques de préstamos en la plataforma de préstamos descentralizada HopeLend

El 18 de octubre de 2023 a las 19:48:59 hora de Pekín, el grupo de préstamos de Hope.money fue atacado en base a préstamos flash.

Hope.money ha creado un servicio financiero descentralizado de pila completa que incluye la plataforma de préstamos HopeLend, el exchange descentralizado HopeSwap, el $HOPE de stablecoin y el $LT de tokens de gobernanza.

El protocolo involucrado en el ataque es HopeLend, una plataforma de préstamos descentralizada que permite a los usuarios proporcionar liquidez al protocolo o sobrecolateralizar para obtener ingresos.

Inicio y fin del evento

En la implementación de código de HopeLend, había una vulnerabilidad explotable en el grupo de préstamos, debido al problema de división de enteros incorrecto al destruir los certificados de depósito, lo que resultaba en que el punto decimal se truncara, logrando la destrucción de menos certificados de los esperados y obteniendo los mismos tokens de valor que se esperaban.

El atacante aprovechó esta falla para vaciar múltiples grupos de préstamos de fondos en Hope.money.

El grupo de préstamos hEthWbtc se implementó hace 73 días, pero no había fondos en él, por lo que los piratas informáticos inyectaron grandes cantidades de dinero en el grupo de préstamos para disparar drásticamente la tasa de descuento, vaciando así rápidamente todos los demás grupos de préstamos en una transacción en bloque.

Más dramáticamente, el hacker explotado no recibió los fondos para el exploit, y su transacción de ataque fue descubierta por el ladrón, quien imitó su ataque y robó con éxito todos los fondos de las ganancias del ataque (527 ETH), y finalmente el 50% de los fondos de las ganancias del ataque (263 ETH) fueron utilizados por los ladrones para sobornar a los mineros que empacaron el bloque (carga útil).

El hacker inicial que descubrió la vulnerabilidad creó un contrato de ataque en el bloque 18377039 e hizo una llamada para atacar el contrato en el bloque 18377042, momento en el que el snatcher monitoreó la transacción en el grupo de memoria y simuló su contrato de ataque, como la entrada del contrato de arrebato, y lo explotó en el mismo bloque 18377042, y la transacción del hacker inicial en el bloque 18377042 falló porque se clasificó detrás del snatcher.

! [CertiK: Análisis del ataque de préstamos a la plataforma de préstamos descentralizada HopeLend] (https://piccdn.0daily.com/202310/22020909/vgmwbfe1izd6m7c3.png!webp)

A dónde va el dinero

Una hora después de que el ladrón reciba las ganancias, los fondos se transfieren a: 0x9a9122Ef3C4B33cAe7902EDFCD5F5a486792Bc3A

! [CertiK: Análisis del ataque de préstamos a la plataforma de préstamos descentralizada HopeLend] (https://piccdn.0daily.com/202310/22020909/xs8c5jce3oyl7qj1.png!webp)

El 20 de octubre a las 13:30:23, el equipo oficial sospechoso se puso en contacto con la dirección, lo que permitió a los corredores dejar 26 ETH (10% de ganancia) como recompensa y obtener una respuesta de los corredores.

! [CertiK: Análisis del ataque de préstamos a la plataforma de préstamos descentralizada HopeLend] (https://piccdn.0daily.com/202310/22020909/2k6prrcrl8b9ynve.png!webp)

Los fondos finales se transfirieron a la bóveda multifirma de GnosisSafe después de una hora de comunicación.

! [CertiK: Análisis del ataque de préstamos a la plataforma de préstamos descentralizada HopeLend] (https://piccdn.0daily.com/202310/22020909/to197jlp4ce8qoq1.png!webp)

A continuación mostraremos las vulnerabilidades reales y los detalles de los piratas informáticos que explotan.

Información previa

  • El protocolo de préstamos de HopeLend implementa bifurcaciones de Aave, por lo que se hace referencia a la lógica comercial central relacionada con las vulnerabilidades en el documento técnico de Aave.

0x00 Depósitos y Préstamos

Aave es un DeFi puro, el negocio de préstamos se realiza a través de fondos de liquidez, los usuarios esperan recibir los ingresos de los préstamos cuando los depósitos de Aave proporcionan liquidez.

Los ingresos por préstamos no se distribuyen completamente a los usuarios, una pequeña parte de los ingresos por intereses se incluirá en la reserva de riesgo, esta parte es una proporción menor, la mayor parte de los ingresos por préstamos se distribuirá al usuario que proporciona liquidez.

Al realizar préstamos de depósito en Aave, Aave convierte el número de depósitos en diferentes momentos en la parte del número de depósitos en el punto de tiempo inicial del fondo de liquidez a través del descuento, por lo que la suma del capital y los intereses correspondientes a los activos subyacentes de cada número de acciones se puede calcular directamente con el índice de cantidad *, lo que facilita enormemente el cálculo y la comprensión.

Se puede entender como un proceso similar a la compra de fondos, el valor neto inicial del fondo es 1, el usuario invierte 100 yuanes para obtener 100 acciones, suponiendo que después de un período de ganancia, el valor neto se convierte en 1.03, en este momento el usuario vuelve a invertir 100 yuanes, la participación obtenida es 97 y la participación total del usuario es 197.

En realidad, esto es descontar el activo de acuerdo con el índice. La razón de esto es que la suma real de capital e intereses del usuario se multiplica por el índice actual por saldo. Cuando el segundo depósito, la suma correcta de capital e intereses del usuario debe ser 100 * 1.03 + 100 = 203, si no se descuenta, el segundo usuario deposita 100 después de que la suma de capital e intereses se convierta en ( 100 + 100) * 1.03 = 206, es incorrecta, si se descuenta, la suma de capital e intereses se convierte en (100 + 100 / 1.03) * 1.03 = 103 + 100 = 203, 203 El resultado es correcto.

Proceso de ataque

0x25126...... 403907 (grupo hETHWBTC)

0x5a63e...... 844e74 (Contrato de ataque - Retiro)

Agresor:

1. Preste los fondos iniciales del préstamo flash y póngalos en prenda

El atacante primero toma prestados 2300 WBTC de Aave Lightning, apuesta 2000 depósitos de WBTC a HopeLend, y los fondos se transferirán al contrato hEthWbtc de HopeLende (0x251 ... 907), y también adquirir los correspondientes 2000 hETHWBTC.

! [CertiK: Análisis del ataque de préstamos a la plataforma de préstamos descentralizada HopeLend] (https://piccdn.0daily.com/202310/22020909/anso762vnbov1zr2.png!webp)

2. Manipulación de la tasa de descuento inicial (liquidityIndex) con grupos de préstamos vacíos

Pida prestados 2000 WBTC de HopeLend para un préstamo flash.

! [CertiK: Análisis del ataque de préstamos a la plataforma de préstamos descentralizada HopeLend] (https://piccdn.0daily.com/202310/22021102/74cv8ydz0ubnh1dd.png!webp)

El valor actual es 1 hETHWBTC = 1 WBTC.

De acuerdo con la operación normal de acceder a ETHWBTC para volver a intercambiar a WBTC, no afectará la relación de intercambio (solo cuando se ganen intereses afectará la relación de intercambio, 1 hETHWBTC obtendrá más WBTC).

En este punto, los hackers comenzaron a manipular la tasa de descuento a través de una serie de operaciones complejas:

• El hacker transfirió directamente los fondos de WBTC de 2000 al contrato hEthWbtc de HopeLen (0x 251 ... 907), este paso no es para pagar el préstamo.

• El hacker se retira entonces, la gran mayoría de los WBTC (1999.999 ... ), por lo que el paso anterior requiere volver al WBTC para reponer los activos del grupo.

• Finalmente, el hacker solo se queda con la unidad más pequeña (1 e-8) de hEthWbtc, que no se puede mencionar completamente aquí, porque es necesario dejar un poco, como cálculo del liquidityIndex, se basará en la adición positiva existente, si se borra, lo que resulta en que el liquidityIndex se convierta en 0, no puede hacer que la proporción en el pool esté desequilibrada.

• Destruye la mayor parte de los wBTC intercambiados por hEthWbtc en el paso anterior, agrega los wBTC restantes del préstamo flash anterior y devuelve el préstamo flash prestado al pool de HopeLend, pagando un total de 2001.8 WBTC (incluyendo un interés de 1.8 wBTC).

• El proceso anterior destruye la mayor parte de hEthWbtc, dejando solo 1 unidad más pequeña (1 e-8) de hEthWbtc en la cuenta del hacker, por lo que la cantidad total de hETHWBTC se reduce, y hay 2001.8 wBTC en el grupo de préstamos, momento en el que el índice de liquidez alcanza la asombrosa cifra de 126.000.000. Esto implica el conocimiento de que el interés de los usuarios de depósitos proviene fundamentalmente del crecimiento de la liquidez en el grupo, y que el grupo de préstamos ajustará dinámicamente las tasas de interés de los préstamos y los depósitos de acuerdo con la tasa de depósito y la tasa de utilización.

! [CertiK: Análisis del ataque de préstamos a la plataforma de préstamos descentralizada HopeLend] (https://piccdn.0daily.com/202310/22021101/5iww6yvocq828lnk.png!webp)

Aquí, cuando el grupo recibe liquidez adicional del interés del préstamo flash (1.8 WBTC), el setenta por ciento (126, 000, 000) se incluye en el liquidityIndex (liquidityIndex), que se utiliza para calcular el valor descontado por unidad de depósito (hEthWbt).

! [CertiK: Análisis del ataque de préstamos a la plataforma de préstamos descentralizada HopeLend] (https://piccdn.0daily.com/202310/22021101/0y2avv1q0k0d6dvq.png!webp)

! [CertiK: Análisis del ataque de préstamos a la plataforma de préstamos descentralizada HopeLend] (https://piccdn.0daily.com/202310/22021101/he1rfuj0gcks7icu.png!webp)

! [CertiK: Análisis del ataque de préstamos a la plataforma de préstamos descentralizada HopeLend] (https://piccdn.0daily.com/202310/22021101/z8wqinijs1xrxj4q.png!webp)

Dado que el grupo estaba vacío antes del hackeo, totalLiquidity es solo 1 después del reembolso, la cantidad es 126000000 y el liquidity Index inicial es 1, lo que resulta en un resultado de 126000001.

! [CertiK: Análisis del ataque de préstamos a la plataforma de préstamos descentralizada HopeLend] (https://piccdn.0daily.com/202310/22021225/4obpc8c6fmseyxxt.png!webp)

3. Continuar amplificando la tasa de descuento

Los piratas informáticos tomaron prestados 2.000 WBTC de HopeLend para préstamos flash y devolvieron 1,8 WBTC adicionales cada vez, lo que permitió que cada LiquidityIndex acumulara 126.000.000.

Los piratas informáticos repitieron el proceso 60 veces y, finalmente, el índice de liquidez alcanzó 7, 560, 000, 001, y el valor descontado de 1 unidad más pequeña de hEthWBTC en poder del atacante podría alcanzar los 75,6 WBTC (unos 2,14 millones de dólares).

Esto permite a los piratas informáticos manipular hEthWBTC, distorsionando su valor.

! [CertiK: Análisis del ataque de préstamos a la plataforma de préstamos descentralizada HopeLend] (https://piccdn.0daily.com/202310/22021225/6c3vhd5dzcqouduz.png!webp)

4. Vaciar otros grupos de préstamos donde existen fondos para formar ganancias

Luego, los atacantes apostaron 1 unidad más pequeña de hEthWBTC y prestaron una gran cantidad de activos de los otros cinco grupos de tokens de HopeLond.

Incluír:

  • 175.4 - WETH
  • 145, 522.220985 - USDT
  • 123, 406.134999 - USDC
  • 844, 282.284002229528476039 - ESPERANZA
  • 220, 617.821736563540747967 - stHOPE

! [CertiK: Análisis del ataque de préstamos a la plataforma de préstamos descentralizada HopeLend] (https://piccdn.0daily.com/202310/22021225/xloltizb5ua2puhd.png!webp)

Estos tokens se intercambiaron por WBTC y WETH a través de Uniswap como ganancias, y después de deducir varias tarifas, el hacker finalmente obtuvo una ganancia de alrededor de 263 WETH (excluyendo los 263.9 WETH que sobornaron la carga útil).

Por qué los hackers pueden pedir prestadas grandes cantidades de dinero de otros pools:

Al pedir prestado o retirar depósitos, el contrato de préstamo comprobará el estado de los activos garantizados del usuario para asegurarse de que el préstamo no supera la garantía.

Dado que la tasa de descuento ha sido manipulada por piratas informáticos y la tasa de descuento se calcula en el valor de la garantía en el multiplicador de ingresos normalizado, el valor de la garantía de una unidad de hEthWBTC en sus manos es tan alto como 75.6 WBTC.

! [CertiK: Análisis del ataque de préstamos a la plataforma de préstamos descentralizada HopeLend] (https://piccdn.0daily.com/202310/22021225/l92lr3astj8pxwg6.png!webp)

! [CertiK: Análisis del ataque de préstamos a la plataforma de préstamos descentralizada HopeLend] (https://piccdn.0daily.com/202310/22021225/fz7hdciyi6ismgwr.png!webp)

Cada vez que tomaban dinero prestado de otros pools, el hacker pasaba fácilmente la verificación de activos colaterales.

! [CertiK: Análisis del ataque de préstamos a la plataforma de préstamos descentralizada HopeLend] (https://piccdn.0daily.com/202310/22021356/8n7rgjpvl64lytjz.png!webp)

En este punto, los atacantes invirtieron un total de 2000+ 1.8* 60 WBTCs en HopeLend para manipular liquidityIndex, dejando solo 1 unidad de hEtthWBTC.

5. Explota los puntos de vulnerabilidad críticos (errores de división de enteros) para cobrar

Para eliminar la inversión anterior wBTC, los atacantes desplegaron otro contrato de ataque: 0x 5 a 63 e... 844 e 74 y llame al método withdrawAllBtc() allí

! [CertiK: Análisis del ataque de préstamos a la plataforma de préstamos descentralizada HopeLend] (https://piccdn.0daily.com/202310/22021356/gxsep176zr1ulz6y.png!webp)

El proceso de vulnerabilidad es el siguiente:

(1) Primer depósito 151.20000002 wBTC, de acuerdo con el índice de liquidez actual (1 unidad más pequeña hEthWBTC=75.6 wBTC), el atacante obtiene 2 unidades más pequeñas de hEthWBTC.

(2) Saca (retira) 113.4 wBTC, calcula de forma inversa su cuota de hEthWBTC correspondiente y quema hEthWBTC.

(3) 113.4 wBTC necesitan destruir 1.999999999998 unidades más pequeñas de hEthWBTC, pero debido a la precisión de la función div, solo se destruye una unidad más pequeña de hEthWBTC, por lo que se convierte en una vulnerabilidad explotable, y los piratas informáticos aún pueden mantener 1 unidad más pequeña de hEthWBTC.

Vulnerabilidades críticas

! [CertiK: Análisis del ataque de préstamos a la plataforma de préstamos descentralizada HopeLend] (https://piccdn.0daily.com/202310/22021356/i8sobsuj4gkdna0o.png!webp)

El método de quemado de hEthWBTC llama a rayDiv de división de alta precisión.

! [CertiK: Análisis del ataque de préstamos a la plataforma de préstamos descentralizada HopeLend] (https://piccdn.0daily.com/202310/22021356/xw84ns4thoyh5i1g.png!webp)

Aquí:

a= 11340000000 (WBTC destinado a ser eliminado)

b=7560000001000000000000000009655610336(tasa de descuento)

Aunque (a* 1e27+b/2)/b = 1.99999999998, el método div integrado de Solidity trunca y devuelve 1, lo que equivale a 11340000000 / 7560000001 decimales se truncan después de la división.

0x5a63 (Contrato de Ataque - Retiro de Efectivo) continúa depositando 75.60000001 WBTC exactamente para obtener 1 unidad mínima más hEthWBTC, por lo que continúa manteniendo 2 unidades mínimas hEthWBTC.

En este bucle, se retiran 113.400000000 wBTC y se depositan 75.60000001 wBTC, cada atacante puede obtener 37.8 wBTC de la nada.

Después de 58 ciclos, los atacantes retiraron todo el wBTC invertido por adelantado y devolvieron sin problemas el préstamo flash de Aave.

Conclusión

Dado que el grupo de préstamos hEthWBTC no se inicializa, el atacante puede manipular fácilmente el liquidityIndex para aumentarlo al máximo, y la tasa de retiro se amplifica en gran medida como divisor, lo que facilita la eliminación de la inversión anterior en un bloque debido al error de truncamiento de la división de enteros.

En un fondo común de préstamos que funciona bien, no es fácil aumentar significativamente la tasa de descuento debido a un pequeño aumento en el interés del préstamo debido a la liquidez existente en el grupo.

Ver originales
Esta página puede contener contenido de terceros, que se proporciona únicamente con fines informativos (sin garantías ni declaraciones) y no debe considerarse como un respaldo por parte de Gate a las opiniones expresadas ni como asesoramiento financiero o profesional. Consulte el Descargo de responsabilidad para obtener más detalles.
  • Recompensa
  • Comentar
  • Compartir
Comentar
0/400
Sin comentarios
Opere con criptomonedas en cualquier momento y lugar
qrCode
Escanee para descargar la aplicación Gate
Comunidad
Español
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)