Back to Blog

#5: Platypus Finance: Sobreviviendo a Tres Ataques con un Golpe de Suerte

Code Auditing
15 de febrero de 2024
6 min read

Resumen

Platypus Finance es un protocolo AMM en la blockchain de Avalanche. Ha sido atacado tres veces, de la siguiente manera:

  • El 17 de febrero de 2023, sufrió un hackeo debido a una verificación de solvencia incorrecta, lo que resultó en una pérdida total de aproximadamente $9.05M. De esto, $2.4M fueron rescatados con la ayuda de BlockSec. Aproximadamente 380K tokens quedaron atrapados en el contrato de Aave y luego fueron devueltos.
  • El 12 de julio de 2023, fue hackeado, con alrededor de $50K perdidos debido a ignorar la diferencia de precio entre stablecoins.
  • El 12 de octubre de 2023, sufrió ataques de manipulación de precios, con alrededor de $2.2M perdidos. Después de negociar con el exploiter, se devolvió el 90% de los fondos robados.

El proyecto tiene la suerte de haber sobrevivido a todos esos ataques. Nuestro análisis de estos tres exploits muestra que las fallas lógicas podrían haberse evitado si se hubiera utilizado una auditoría cuidadosa o medidas de seguridad más activas.

Ataque Uno

Para comprender este incidente de seguridad, es necesario entender el flujo de trabajo de varios contratos inteligentes. El proceso general es el siguiente:

  • Un usuario puede depositar un token en un pool para convertirse en LP y recibir un token LP.
  • El token LP se puede hacer staking en MasterPlatypus para recibir recompensas. El token LP se transferirá al contrato MasterPlatypus durante este proceso.
  • El token LP se puede usar como garantía para pedir prestados otros activos y mejorar la eficiencia de los activos.

La siguiente figura muestra las interacciones.

Análisis de la vulnerabilidad

La vulnerabilidad existe en una función llamada emergencyWithdraw dentro del contrato MasterPlatypus. En emergencias, esta función debería usarse para retirar los tokens LP en staking en el contrato MasterPlatypus. En esta función, el contrato verifica si el usuario es Solvent para permitir el retiro. La lógica comprueba si los usuarios tienen alguna deuda incobrable (es decir, si la garantía puede usarse para pagar la deuda). Si no la tienen, los usuarios pueden retirar los tokens LP en staking.

Sin embargo, esta lógica es defectuosa. Que el usuario sea Solvent solo significa que la garantía del usuario puede pagar su deuda. Sin embargo, NO verifica si el usuario sigue siendo Solvent después de retirar de emergencia los tokens en staking. Un atacante puede aprovechar esta falla para pedir prestados los activos y luego retirar de emergencia los tokens LP en staking también (sin pagar las deudas). Vea el análisis detallado en el blog de Immunefi.

Análisis del ataque

Usamos una transacción de ataque como ejemplo para mostrar todo el proceso del ataque.

Paso 1: Pedir un préstamo flash de 44 millones de USDC de AAVE

Paso 2: Depositar 44 millones de USDC en el pool para obtener LP-USDC

Paso 3: Depositar LP-USDC en MasterPlatypus

Paso 4: Usar LP-USDC como garantía para pedir prestado USP

Paso 5: Ejecutar la función emergencyWithdraw para lanzar el ataque

El atacante obtiene el LP-USDC sin pagar la deuda de USP.

Paso 6: Retirar LP-USDC del pool para obtener USDC

Paso 7: Vender USP para obtener ganancias

Sin embargo, las ganancias quedan dentro del contrato de ataque. De hecho, el atacante puede configurar una nueva dirección de recepción para el swap y así obtener las ganancias.

El rescate de BlockSec

Descubrimos que el atacante dejó las ganancias dentro del contrato de ataque. Además, no hay lógica dentro del contrato de ataque para retirar los activos. Sin embargo, encontramos una vulnerabilidad en el contrato de ataque, que se puede aprovechar para hacer un "hack back" y retirar parte de los activos dentro del contrato.

Específicamente, existe un control de acceso en la función de callback del flashloan, lo que significa que cualquiera puede invocar esta función de callback. Esta es también la causa raíz de que muchos bots MEV sean atacados.

Además, dentro de la función de callback, el contrato del atacante aprueba el token USDC al contrato del pool de Platypus finance. ¡Y este contrato de pool es actualizable!

Combinando los dos puntos anteriores, podemos rescatar el USDC dentro del contrato de ataque mediante:

  • Actualizar el contrato del pool de Platypus finance para incluir una lógica que permita retirar el USDC dentro del contrato
  • Invocar el callback del contrato de ataque para aprobar el USDC al contrato del pool
  • El contrato del pool puede reemplazar cualquier función (que será ejecutada por el contrato de ataque) para transferir el USDC desde el contrato de ataque (ya que el contrato de ataque aprueba el USDC al contrato del pool).

Aquí está la transacción para rescatar 2.4 millones de USDC.

Otros dos ataques

Consulte los siguientes enlaces para obtener más detalles sobre los otros dos ataques.

Resumen

Los tres ataques explotaron diferentes vulnerabilidades en el protocolo. Aunque otros proveedores han auditado el protocolo, el atacante aún encontró el resquicio legal y explotó el protocolo con éxito. Afortunadamente, se rescataron algunos activos, pero no podemos esperar tener siempre suerte. Se deben adoptar más medidas de seguridad, incluyendo el monitoreo de ataques y la respuesta automática, para proteger el protocolo y los activos de los usuarios.

Lea otros artículos de esta serie:

Best Security Auditor for Web3

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

BlockSec Audit