El 21 de junio, uno de los MEV Bots más activos en la red Ethereum, Jaredfromsubway.eth, sufrió un sofisticado ataque de "honey pot" (cebo), perdiendo más de 7.5 millones de dólares en activos criptográficos. A continuación, el análisis del equipo de seguridad de Beosin sobre este ataque y el seguimiento del flujo de fondos robados.
Análisis del flujo del ataque
Familia de contratos del ataque
- Contrato coordinador (0xb84db016324e8f2bfdd8dd9c260338aee0a8df52): Se encarga de registrar si el bloque actual está en estado 'armed' y, en la fase final, llama cíclicamente a los subcontratos para extraer fondos.
- Contrato desencadenante (0x4de8c729a064ff6087cc84a4152969349e4feb98): Se encarga de configurar estados falsos de pares de transacciones dentro del mismo bloque, haciendo que la ruta de arbitraje parezca ejecutable.
- Subcontrato / Contrato de token falso: Se hace pasar por un token ERC-20 normal, utilizado para obtener autorizaciones reales.
- Contrato Hub: Se encarga de pagar pequeñas ganancias reales para que el MEV Bot perciba que es rentable.
- Par Ring V2: Par de transacciones de Uniswap v2 falsificado.
- Contrato de token intermedio falso: Utilizado para construir rutas de arbitraje de múltiples saltos, como fCAP, fUSDC.
La clave del ataque: Engañar para obtener autorizaciones
Al analizar las transacciones en cadena, el atacante construyó múltiples grupos de transacciones señuelo:
- Gran cantidad de USDC: El bot obtuvo una ganancia de aproximadamente 36.997120 USDC, pero dejó una autorización de 20 USDC.
- Gran cantidad de USDT: El bot obtuvo una ganancia de aproximadamente 37.053440 USDT, pero dejó una autorización de 20 USDT.
- Gran cantidad de WETH: El bot obtuvo una ganancia de aproximadamente 0.0179 WETH, pero dejó una autorización de 16 WETH.
- Las transacciones de pequeña cantidad se comportaron normalmente; la autorización se consumía dentro de la misma transacción, reduciendo las sospechas.
En transacciones de pequeña cantidad, después de que el bot autorizara el monto real del token, el subcontrato transfería inmediatamente el token real, consumiendo la autorización, lo que parecía completamente normal.
Sin embargo, en transacciones de gran cantidad, el subcontrato no llamaba a `transferFrom` para transferir el token real, sino que acuñaba tokens falsos directamente a través del par de transacciones falsificado. El bot pensaba que había completado los pasos previos normales de un swap, pero la autorización real del token aún se mantenía.
Esta es la esencia de todo el ataque: las transacciones pequeñas consumen la autorización normalmente, las transacciones grandes la retienen.
Proceso del ataque
Tomando como ejemplo la transacción de ataque contra USDC:
(1) El atacante llama al coordinador, estableciendo el bloque actual como 'armed'.
(2) El atacante llama al desencadenante, actualizando el estado de múltiples pares Ring V2 falsificados.
(3) El MEV Bot detecta la oportunidad de arbitraje y ejecuta la transacción.
El flujo interno aproximado de la transacción del MEV Bot es el siguiente:
(1) El contrato del MEV Bot autoriza un monto grande de USDC a un subcontrato.
(2) El MEV Bot llama a las funciones `wrapTo`/`wrap` del subcontrato.
(3) Dado que el estado actual es 'armed', el subcontrato no consume USDC real, sino que acuña tokens falsos para el par, manteniendo la autorización de USDC.
(4) El MEV Bot continúa llamando al `swap` del par falsificado.
(5) El segundo par del salto envía los tokens al MEV Bot.
(6) El contrato hub paga una pequeña ganancia real en USDC al MEV Bot.
Ejemplo de autorización
Hash de la transacción: 0x0121e07a916c06eea3e7daf11893f3f0b95b9e1684124545ae14c32aee6029bb
Lo que el MEV Bot vio: una transacción de arbitraje exitosa, obteniendo ganancias reales en USDC. Sin embargo, la autorización de USDC fue retenida por el subcontrato. Este proceso se repitió para USDC, USDT y WETH, resultando finalmente en una gran cantidad de autorizaciones.
El hash de la transacción del ataque es:
0x2be8704f5a59b69e0b71f64aefdb99eb0e8ae9fb3926147c581910d71bcf3e65
El atacante llama a la función `drain loop` del contrato coordinador, incluyendo en los `calldata` 66 direcciones de subcontratos y la dirección del contrato del MEV Bot. Siempre que el contrato del MEV Bot hubiera dejado previamente autorizaciones de monto a esos subcontratos, estos podían transferir directamente los tokens reales correspondientes al atacante.
Resultado final:
- Las 20 autorizaciones grandes de USDC fueron completamente consumidas.
- Las 16 autorizaciones grandes de WETH fueron completamente consumidas.
- Parte de las autorizaciones de USDT aún existían, pero el saldo de USDT ya era insuficiente.
Análisis del flujo de fondos
Tras el éxito del ataque, la dirección del atacante (0x3e37f4A10d771Ba9dE44b6d301410b1BEdeA65d0) recibió $2.87M en USDC, $2.04M en USDT y 1,474 WETH. Posteriormente, el atacante convirtió las stablecoins en ETH y las transfirió a las siguientes 4 direcciones:
- 0xe3Da36E4bd1a5738fa5D6Ef4F0e4dF40bDeB5f17 (aprox. 1,000 ETH)
- 0x74Dc5b93586D248D5Aec64b3586736FF0A0D0e65 (1,001 ETH)
- 0xd8C125efCBc99408eC8723E9BBd81d1E8D39D845 (1,001 ETH)
- 0x71d4416A7A85e08a5Fe7227Ca3B44Fc639e94e97 (1,423 ETH)
De estas, 0xe3Da3... transfirió 1,000 ETH a Tornado Cash. Los ETH de las otras tres direcciones no han sido transferidos más allá. El gráfico del flujo de fondos es el siguiente:
Conclusión
Este ataque demuestra un método altamente sofisticado: en lugar de atacar directamente el código del contrato, el atacante, basándose en la lógica de negocio del MEV Bot, construye escenarios de arbitraje correspondientes para engañar al MEV Bot y hacer que realice autorizaciones aparentemente sin problemas, y finalmente transfiere sus activos. Para los bots de arbitraje y MEV Bot, no deben confiar únicamente en la simulación de ganancias para juzgar la seguridad de una ruta. Especialmente cuando la ruta de arbitraje contiene contratos desconocidos, tokens falsificados o wrappers personalizados, se debe proceder con precaución y considerar realizar verificaciones obligatorias de los cambios en los 'allowances' después de la transacción.
Ver artículo original









