Autor: SunSec
Os recursos online eram escassos quando comecei a aprender análise de transações OnChain. Embora lentamente, consegui reunir informações fragmentadas para realizar testes e análises.
A partir dos meus estudos, lançaremos uma série de artigos de segurança Web3 para incentivar mais pessoas a ingressarem na segurança Web3 e criar uma rede segura juntos.
Na primeira série, vamos apresentar como realizar uma análise OnChain e, em seguida, reproduziremos ataque(s) OnChain. Essa habilidade nos ajudará a entender o processo de ataque, a causa raiz da vulnerabilidade e até mesmo como o robô de arbitragem faz arbitragem!
Antes de entrar na análise, permita-me apresentar algumas ferramentas comuns. As ferramentas certas podem ajudá-lo a fazer pesquisas de forma mais eficiente.
Phalcon | Tx.viewer | Cruise | Ethtx | Tenderly
O Transaction Viewer é a ferramenta mais comumente usada, ele é capaz de listar o rastreamento de chamadas de função e os dados de entrada em cada função durante a transação. As ferramentas de visualização de transações são todas semelhantes; a diferença principal é o suporte de cadeia e o suporte de funções auxiliares. Eu pessoalmente uso o Phalcon e o Transaction Viewer do Sam. Se eu encontrar cadeias não suportadas, usarei o Tenderly. O Tenderly suporta a maioria das cadeias, mas a legibilidade é limitada e a análise pode ser lenta usando sua função de depuração. No entanto, é uma das primeiras ferramentas que aprendi junto com o Ethtx.
Phalcon: Ethereum, BSC, Cronos, Avalanche C-Chain, Polygon
Transaction viewer do Sam: Ethereum, Polygon, BSC, Avalanche C-Chain, Fantom, Arbitrum, Optimism
Cruise: Ethereum, BSC, Polygon, Arbitrum, Fantom, Optimism, Avalanche, Celo, Gnosis
Ethtx: Ethereum, Goerli testnet
Tendery: Ethereum, Polygon, BSC, Sepolia, Goerli, Gnosis, POA, RSK, Avalanche C-Chain, Arbitrum, Optimism, Fantom, Moonbeam, Moonriver
Vamos analisar o incidente JayPeggers - Validação Insuficiente + Reentrância como exemplo de transação TXID para dissecar.
Primeiro, uso a ferramenta Phalcon desenvolvida pela Blocksec para ilustrar. As informações básicas e as alterações de saldo da transação podem ser vistas na figura abaixo. A partir das alterações de saldo, podemos ver rapidamente quanto lucro o atacante obteve. Neste exemplo, o atacante obteve um lucro de 15,32 ETH.
Visualização do Fluxo de Chamadas - É uma invocação de função com informações de rastreamento e logs de eventos. Ele nos mostra a invocação da chamada, o nível de chamada de função desta transação, se foi usado um flash loan, quais projetos estão envolvidos, quais funções são chamadas e quais parâmetros e dados brutos são trazidos, etc.
O Phalcon 2.0 adicionou fluxo de fundos, e a análise de código-fonte + depuração mostra diretamente o código-fonte, os parâmetros e os valores de retorno juntamente com o rastreamento, o que é mais conveniente para análise.
Agora vamos experimentar o Transaction Viewer do Sam na mesma TXID. O Sam integra muitas ferramentas nele, como mostrado na imagem abaixo, você pode ver a alteração no Storage e o Gás consumido por cada chamada.
Clique em Call à esquerda para decodificar os dados de entrada brutos.
Agora vamos mudar para o Tendery para analisar a mesma TXID, você pode ver as informações básicas como outras ferramentas. Mas usando a função de depuração, não é visualizado e precisa ser analisado passo a passo. No entanto, a vantagem é que você pode visualizar o código e o processo de conversão dos dados de entrada durante a depuração.
Isso pode nos ajudar a esclarecer todas as coisas que essa transação fez. Antes de escrever o POC, podemos executar um ataque de replay? Sim! Tanto o Tendery quanto o Phalcon suportam transações simuladas, você pode encontrar um botão Re-Simulate no canto superior direito na figura acima. A ferramenta preencherá automaticamente os valores dos parâmetros da transação para você, como mostrado na figura abaixo. Os parâmetros podem ser alterados arbitrariamente de acordo com as necessidades de simulação, como alterar o número do bloco, From, Gas, dados de entrada, etc.
Nos dados de entrada brutos, os primeiros 4 bytes são Assinaturas de Função. Às vezes, se o Etherscan ou as ferramentas de análise não conseguem identificar a função, podemos verificar as possíveis Funções por meio do Banco de Dados de Assinaturas.
O exemplo a seguir assume que não sabemos qual é a Função 0xac9650d8
Através de uma consulta no sig.eth, descobrimos que a assinatura de 4 bytes é multicall(bytes[])
ABI para interface | Obter ABI para contratos não verificados | Decodificador de Calldata ETH | ETHCMD - Adivinhar ABI
ABI para interface: Ao desenvolver um POC, você precisa chamar outros contratos, mas precisa de uma interface. Podemos usar essa ferramenta para ajudá-lo a gerar rapidamente as interfaces. Vá para o Etherscan para copiar o ABI e cole-o na ferramenta para ver a Interface gerada. Exemplo.
Decodificador de Calldata ETH: Se você deseja decodificar dados de entrada sem o ABI, esta é a ferramenta que você precisa. O Transaction Viewer do Sam que mencionei anteriormente também suporta a decodificação de dados de entrada.
Obter ABI para contratos não verificados: Se você encontrar um contrato que não foi verificado, pode usar essa ferramenta para tentar descobrir as assinaturas de função. Exemplo
Etherscan - descompilar bytecode | Dedaub | heimdall-rs
O Etherscan possui um recurso de descompilação embutido, mas a legibilidade do resultado geralmente é ruim. Pessoalmente, costumo usar o Dedaub, que produz um código descompilado melhor. É o meu descompilador recomendado. Vamos usar um MEV Bot sendo atacado como exemplo. Você pode tentar descompilá-lo por conta própria usando este contrato.
Primeiro, copie os Bytecodes do contrato não verificado e cole-os no Dedaub, e clique em Decompile.
Se você quiser aprender mais, pode consultar os seguintes vídeos.
samczsun's eth txn explorer and vscode extension
Vulnerabilities in DeFi by Daniel V.F.
Tenderly.co - Debug Transaction
Reversing The EVM: Raw Calldata
.