Back to Blog

Cómo fue explotado el Protocolo Mirror

Code Auditing
May 31, 2022
4 min read

El Protocolo Mirror fue reportado por @FatMan como víctima de una explotación. El blog tiene un buen informe al respecto. En este breve artículo, utilizaremos la transacción del ataque para explicar cómo ocurrió esto.

Descargo de responsabilidad: Este artículo se basa en la transacción pública y en nuestra comprensión del protocolo Mirror y el ecosistema Terra. Por favor, háganoslo saber si hay alguna inexactitud. Cualquier comentario sobre este blog es bienvenido.

1 Ataque

1.1 Preparación

La transacción se utiliza para preparar los ataques.

PASO 1: En esta transacción, el atacante primero envió 100,000 USTC al contrato de bloqueo. Esto no es necesario para abrir una posición, pero es fundamental para el ataque.

PASO 2: Después de eso, el atacante abrió una posición depositando 10 USTC como garantía y especificando el collateral_ratio en 2.5.

El short_params se especifica para que el contrato de acuñación venda los mAssets acuñados (es decir, mETH) y añada el USTC obtenido al monto bloqueado de la posición.

PASO 2.1: Analicemos la transacción paso a paso. Primero, se invocará la función open_position para abrir una posición corta cuyo ID es 43186.

PASO 2.2: Dado que se agrega el short_params opcional, el contrato primero acuñará 0.001208 mETH (basado en el precio actual de ETH) y luego lo venderá mediante un intercambio en el mETH-UST Pair.

PASO 2.3: Los 0.001208 mETH se intercambiarán por 4.06582 USTC, el USTC obtenido se enviará al contrato de bloqueo después de deducir las comisiones correspondientes (por ejemplo, impuestos). Esto se debe a que la posición abierta solo puede desbloquearse después de un período de tiempo determinado.

PASO 2.4: Luego se invocará lock_position_funds_hook. En esta función, position_locked_amount se calculará consultando el current_balance y comparando el current_balance con los locked_funds.

Sin embargo, como vimos en el Paso 1, se transfirieron directamente 100,000 USTC al contrato de bloqueo, por lo que el locked_amount será de aproximadamente 100,004 USTC en lugar de 4 USTC.

PASO 2.5: Finalmente, se invocará increase_short_token para registrar los tokens sLP.

Hasta aquí, el atacante abrió una posición enviando 100,000 USTC directamente al contrato de bloqueo y 10 USTC como garantía. El monto bloqueado de la posición es de aproximadamente 100,004 USTC y puede desbloquearse después de un período de tiempo. El atacante abrió muchas posiciones de este tipo enviando entre 1,000 y 100,000 USTC.

1.2. Ataque

El Protocolo Mirror no verifica la duplicación del ID de posición. En este caso, el atacante puede introducir múltiples IDs de posición duplicados para desbloquear el monto bloqueado de una posición una y otra vez.

La transacción es la transacción del ataque. Por ejemplo, para el ID de posición 43186, el atacante lo duplicó 437 veces.

Dado que el código del contrato original no verifica la duplicación, aproximadamente 43.7M437 * 0.1M)USTC fue desbloqueado (en esta única llamada a la función).

Cabe señalar que las demás posiciones fueron desbloqueadas con el mismo mecanismo.

2. Corrección del Error

La vulnerabilidad fue corregida en este commit.

Específicamente, unlockable_positions es un vector que contiene los IDs de posición a desbloquear. En el código original, no existe ninguna verificación sobre si hay IDs duplicados en unlockable_positions. El código parcheado añade una verificación para la duplicación de los IDs de posición.

3. Conclusión

Como señalaron @FatMan y otros miembros de la comunidad, este error existió durante varios meses y fue explotado en el entorno real. Creemos que parchear silenciosamente una vulnerabilidad que ya ha sido explotada en el entorno real no es una buena práctica de seguridad. Además, también consideramos que los proyectos DeFi de alto perfil deberían implementar sistemas de vigilancia para monitorear activamente el estado de sus aplicaciones y recibir alertas cuando ocurra algo inusual.

Best Security Auditor for Web3

Validate design, code, and business logic before launch. Aligned with the highest industry security standards.

BlockSec Audit