Autor original: Sun
Traducción al español: Eloi
Comunidad Discord
Este artículo ha sido publicado en XREX y WTF Academy.
Los recursos en línea eran escasos cuando empecé a aprender sobre análisis de transacciones onchain. Aun así, lentamente fui capaz de reunir información de diferentes fuentes para realizar pruebas y análisis.
A partir de mis estudios, lanzaremos una serie de artículos sobre seguridad Web3. El objetivo es atraer a más gente a la seguridad Web3 y crear juntos una red más segura.
En la primera serie, presentaremos cómo realizar un análisis (o debugging) onchain y, a continuación, reproduciremos ataques pasados. Esta habilidad nos ayudará a entender el proceso de ataque, la causa principal de la vulnerabilidad, ¡e incluso cómo arbitra un robot de arbitraje!
Antes de entrar en el análisis, permíteme presentarte algunas herramientas habituales. Las herramientas adecuadas pueden ayudarte a investigar de forma más eficaz y eficiente.
Phalcon | Tx.viewer | Cruise | Ethtx | Tenderly
Transaction Viewer (Tx.viewer
) es la herramienta más utilizada, es capaz de listar el "stack trace" de las llamadas a funciones y los datos de entrada en cada función durante la transacción. Las herramientas de inspección o análisis de transacciones son todas similares; la mayor diferencia es el soporte de diferentes cadenas y el soporte de funciones auxiliares. Yo personalmente uso Phalcon
y el Transaction Viewer de Sam. Si encuentro cadenas no soportadas, utilizo Tenderly
. Tenderly soporta la mayoría de las cadenas, pero la legibilidad es más limitada, y el análisis puede ser lento usando su función de "Debug". Sin embargo, es una de las primeras herramientas que aprendí junto con Ethtx
.
-
Phalcon:
Ethereum、BSC、Avalanche C-Chain、Polygon、Solana、Arbitrum、Fantom、Optimism、Base、Linea、zkSync Era、Kava、Evmos、Merlin、Manta、Mantle、Holesky testnet、Sepolia testnet
-
Sam's Transaction viewer:
Ethereum, Polygon, BSC, Avalanche C-Chain, Fantom, Arbitrum, Optimism
-
Cruise:
Ethereum, BSC, Polygon, Arbitrum, Fantom, Optimism, Avalanche, Celo, Gnosis
-
Ethtx:
Ethereum, Goerli testnet
-
Tenderly:
Ethereum, Polygon, BSC, Sepolia, Goerli, Gnosis, POA, RSK, Avalanche C-Chain, Arbitrum, Optimism, Fantom, Moonbeam, Moonriver
Vamos a ver el incidente de JayPeggers (Validación insuficiente + Reentrada) como ejemplo de transacción a diseccionar.
Primero utilizaremos la herramienta Phalcon desarrollada por Blocksec. La información básica ("Basic Info") y los cambios de saldo ("Balance Changes") de la transacción se pueden ver en la siguiente figura. A partir de los cambios de saldo, podemos ver rápidamente cuánto beneficio ha obtenido el atacante. En este ejemplo, el atacante obtuvo un beneficio de 15,32 ETH.
Visualización del flujo de invocación ("Invocation Flow") - Contiene la llamada de funciones con sus argumentos, valores devueltos y registro de eventos. Nos muestra la invocación de las funciones, el nivel de llamada a la función de esta transacción, si se utilizan flashloans, qué proyectos están involucrados, qué funciones se llaman, parámetros, datos en bruto, etc.
Phalcon 2.0 ha añadido el flujo de fondos y el análisis debug + código fuente. Estos muestran directamente el código fuente, los parámetros y los valores de retorno junto con la traza, lo que resulta más cómodo para el análisis.
Ahora vamos a probar el Visor de Transacciones de Sam en la misma transacción. Sam integra muchas herramientas en él, como se muestra en la imagen de abajo, se pueden ver los cambios en el almacenamiento y el gas consumido por cada llamada.
Puedes hacer clic en "call" (a la izquierda) para ver los datos de entrada ("Input data") sin procesar.
Cambiemos ahora a Tenderly para analizar la misma transacción. Se puede ver la información básica como con las otras herramientas. Pero usando la función "Debugger", no se visualizan todas las interacciones directamente sino que se necesita analizar paso a paso cada llamada. Sin embargo, la ventaja es que puedes ver el código y el proceso de conversión de los datos de entrada mientras lo analizas.
Esto puede ayudarnos a aclarar todo lo que hizo la transacción. Antes de escribir el PoC, ¿podemos simular una repetición del ataque? Sí. Tanto Tenderly como Phalcon soportan transacciones simuladas, puedes encontrar un botón "Re-Simulate" en la esquina superior derecha en la figura de arriba. La herramienta rellenará automáticamente los valores de los parámetros de la transacción como se muestra en la figura de abajo. Los parámetros pueden cambiarse arbitrariamente según las necesidades de la simulación, como cambiar el número de bloque, Desde, Gas, Datos de entrada, etc.
En los campos "Input Data", los primeros 4 bytes son las "Function Signatures" o firmas de las funciones. A veces, si Etherscan o las herramientas de análisis no pueden identificar la función, podemos comprobar las posibles funciones a través de las bases de datos de firmas.
El siguiente ejemplo supone que no sabemos qué es la función 0xac9650d8
.
Mediante una consulta en sig.eth
, encontramos que la firma de 4 bytes es multicall(bytes[])
.
ABI to interface | Get ABI for unverified contracts | ETH Calldata Decoder | ETHCMD - Guess ABI
De ABI a interfaz (interface): Cuando se desarrolla un PoC, es necesario tener interfaces para llamar a otros contratos. Podemos usar esta herramienta para ayudarnos a generar rápidamente las interfaces. Puedes ir a Etherscan para copiar la ABI, y pegarla en la herramienta para ver la interfaz generada. Ejemplo.
ETH Calldata Decoder: Si quieres decodificar datos de entrada sin la ABI, esta es la herramienta que necesitas. El visor de transacciones de Sam que vimos antes también soporta la decodificación de datos de entrada.
Obtener la ABI para contratos no verificados: Si te encuentras con un contrato que no está verificado, puedes utilizar esta herramienta para intentar averiguar las firmas de las funciones. Ejemplo
Etherscan-decompile bytecode | Dedaub | heimdall-rs
Etherscan tiene una función de decompilación incorporada, pero la legibilidad del resultado es a menudo pobre. Personalmente, suelo utilizar Dedaub, que produce mejor código descompilado. Es mi descompilador recomendado. Usemos un Bot de MEV siendo atacado como ejemplo. Puedes intentar descompilarlo por ti mismo usando este contrato.
Primero, copia el Bytecode
del contrato no verificado y pégalo en Dedaub. Después haz clic en "Decompile" (Decompilar).
Si quieres saber más, puedes consultar los siguientes recursos.
samczsun's eth txn explorer and vscode extension
Vulnerabilities in DeFi by Daniel V.F.
Tenderly.co - Debug Transaction