Una serie de ataques comprometieron varios proyectos de Binance Smart Chain (BSC) en mayo. Después de PancakeBunny, sus tres proyectos de Forks, AutoShark, Merlin Labs y PancakeHunny, también fueron atacados con técnicas similares. PancakeBunny sufrió el ataque más caro de los cuatro, causando un daño total de casi $ 45 millones. En este artículo, el Dr. Chiachih Wu, jefe del equipo de seguridad blockchain del Grupo Amber, explicó los detalles de los ataques a los tres imitadores.
Imitadores
AutoShark fue atacado cinco días después de PancakeBunny, seguido por Merlin Labs y PancakeHunny, respectivamente. A continuación se analizan los problemas y las posibles técnicas de ataque de estos tres proyectos ramificados.
En la función SharkMinter.mintFor (), la cantidad de tokens SHARK que valen la pena (es decir, mintShark) que se van a acuñar se deriva del SharkBNBAmount calculado por tokenToSharkBNB () en la línea 1494, lo que lo convierte en un punto vulnerable. Se podría suponer que la cantidad de tokens recibidos en la línea 1492 es igual a la cantidad del crédito invertido. Aún así, un mal actor podría manipular el balance de inversión simplemente enviando algunos tokens de inversión justo antes de llamar a getReward () e indirectamente rompiendo la lógica de tokenToSharkBNB ().
Hay otra superficie de ataque en la implementación subyacente de tokenToSharkBNB (). Como se muestra en el fragmento de código anterior, _flipToSharkBNBFlip () elimina la liquidez de ApeSwap (línea 1243) o PantherSwap (línea 1262) y convierte los tokens LP en SHARK + WBNB. El generateFlipToken () se llama más tarde para convertir SHARK + WBNB en tokens SHARK-BNB LP.
Dentro de generateFlipToken (), los saldos actuales de SHARK y WBNB de SharkMinter (amountADesired, heightBDesired) se utilizan para generar tokens LP y la cantidad de tokens LP se devuelve a mintFor () como SharkBNBAmount. Residencia en, el malvado actor podría transferir SHARK + WBNB a SharkMinter para manipular también la cantidad de tokens de SHARK que se acuñarán.
La laguna en PancakeHunny es idéntica a la de AutoShark, ya que el mal actor puede manipular la acuñación de recompensas de HUNNY usando tokens de HUNNY y WBNB.
En comparación con AutoShark y PancakeHunny, _getReward () de Merlin Labs tiene una vulnerabilidad más obvia.
El extracto del código anterior muestra que la tarifa de rendimiento podría ser manipulada por el crédito de CAKE, lo que tiene un efecto indirecto en el sellado de las recompensas REAL. Sin embargo, el modificador no contractual elimina los préstamos flash.
Incluso sin un contrato de explotación, el villano podría beneficiarse de múltiples llamadas.
Reproducción de ataques de AutoShark
Para reproducir el truco de AutoShark, primero necesitamos obtener algunos tokens SHARK-BNB-LP de PantherSwap. Específicamente, intercambiamos 0.5 WBNB en SHARK (línea 58) y transferimos el resto del WBNB con estos tokens SHARK en PantherSwap para acuñar tokens SHARK-BNB-LP (línea 64). Luego, Depositamos estos tokens LP en el contrato StrategyCompoundFLIP de AutoShark (línea 69) para calificar para las recompensas. Tenga en cuenta que deliberadamente solo estamos depositando la mitad de los tokens de LP en la línea 69.
El segundo paso es agregar getReward () al contrato de SharkMinter. En el fragmento de código anterior, sabemos que la recompensa se puede obtener utilizando la función obtenida () (línea 1658). Además, el 30% de la recompensa (es decir, PerformanceFee) debe ser superior a 1.000 (es decir, DUST) para activar SharkMinter.mintFor () en la línea 1668.
Por lo tanto, en nuestro código de explotación, transferimos algunos tokens LP en la línea 76 al contrato StrategyCompoundFLIP para evitar la verificación performanceFee> DUST y activar la llamada mintFor (). Dado que necesitamos una gran cantidad de WBNB + SHARK para manipular SharkMinter, usamos PantherSwaps 100k WBNB a través de una llamada de intercambio flash en la línea 81.
En el flash swap callback pancakeCall () intercambiamos la mitad del WBNB por SHARK y enviamos el SHARK con los 50,000 WBNB restantes al contrato de SharkMinter para manipular la acuñación premium.
El siguiente paso es disparar getReward () cuando el SharkMinter recibe los tokens WBNB + SHARK para generar una gran cantidad de SHARK a la persona que llama.
El último paso es convertir SHARK en WBNB, pagar el préstamo flash y llevarse los tokens WBNB restantes.
En nuestro experimento, el mal actor comienza con 1 WBNB. Con la ayuda de préstamos flash, se beneficia del hecho de que se devuelven más de 1000 WBNB en una sola transacción.
Reproducir Pancake Hunny Attack
La teoría detrás del ataque PancakeHunny es similar al ataque AutoShark. En resumen, necesitamos enviar una gran cantidad de HUNNY + WBNB a HunnyMinter antes de activar getReward (). Sin embargo, el contrato de token HUNNY tiene un mecanismo de protección llamado antiWhale para evitar que se transfieran grandes cantidades de dinero. Por lo tanto, los préstamos flash no funcionan aquí.
Para evitar antiWhale, creamos varios contratos secundarios e iniciamos varias llamadas a CakeFlipVault.deposit () sobre estos contratos.
En el fragmento de código de explotación anterior, los tokens LP recopilados en la línea 116 se dividen en 10 partes y se transfieren a 10 contratos Lib en la línea 122, seguidos de llamadas Lib.prepare () para cada uno de ellos.
Dentro de Lib.prepare () aprobamos CakeFlipVault () para emitir los tokens LP y llamamos a CakeFlipVault.deposit () para activar las llamadas getReward () posteriores para generar tokens HUNNY que valgan la pena.
Después de preparar 10 contratos Lib, el contrato principal itera cada uno de ellos para: 1) intercambiar WBNB por la cantidad máxima permitida de HUNNY; 2) Transferencia de WBNB + HUNNY a HunnyMinter; 3) activar getReward () a través de lib.trigger (); y 4) cambiar HUNNY de nuevo a WBNB.
Al final, el jugador malo con 10 WBNB gana alrededor de 200 WBNB de 10 iteraciones de operaciones de contrato de 10 Lib.
Reproducción del ataque de Merlin Labs
Como se mencionó anteriormente, Merlin Labs tiene el modificador noContract para deshacerse de los ataques de crédito flash. Sin embargo, podríamos usar un script para desencadenar el ataque con múltiples transacciones iniciadas desde una dirección de cuenta de propiedad externa (EOA). La única diferencia es que alguien puede llevar la transacción del actor malintencionado a la cima para robar las ganancias.
De manera similar al ataque AutoShark, necesitamos preparar suficientes LINK y WBNB (línea 23), usarlos para acuñar tokens WBNB-LINK-LP (línea 34) y depositar tokens LP en el contrato VaultFlipCake (línea 38).
Las acciones restantes son:
- Cambie de WBNB a CAKE (línea 42).
- Manipulación de la impresión REAL mediante el envío de CAKE al contrato VaultFlipToCake (línea 50).
- Activar getReward () en la línea 55 (se acuña una gran cantidad de tokens REAL).
- Vuelva a cambiar REAL a WBNB y repita los pasos anteriores varias veces.
Como se mencionó anteriormente, una persona que realiza el paso 3 inmediatamente después del paso 2 podría eliminar una gran cantidad de REAL.
En nuestro experimento, el mal actor comienza con 10 WBNB y desaparece con aproximadamente 165 WBNB repitiendo los cuatro pasos 10 veces.
Sobre el grupo ámbar
Amber Group es una empresa líder mundial de servicios financieros criptográficos que opera en todo el mundo y las 24 horas del día, con oficinas en Hong Kong, Taipei, Seúl y Vancouver. Fundado en 2017, Amber Group sirve a más de 500 clientes institucionales y ha acumulado más de $ 500 mil millones negociados en más de 100 intercambios electrónicos con más de $ 1,5 mil millones en activos bajo administración. En 2021, Amber Group recaudó $ 100 millones en fondos de la Serie B y se convirtió en el unicornio FinTech más nuevo, valorado en más de $ 1 mil millones. Más información está disponible en www.ambergroup.io.