Autor: SunSec
Quando comecei a estudar análise de transações OnChain, havia poucos artigos educacionais relacionados, então tive que coletar informações por conta própria para descobrir como analisar e testar. Estamos lançando uma série de artigos de segurança Web3 para ajudar mais pessoas a se juntarem à segurança Web3 e criar uma rede segura.
Nesta primeira série, vamos apresentar como realizar análises OnChain e escrever reproduções de ataques. Essa habilidade ajudará você a analisar o processo de ataque, as razões das vulnerabilidades e até mesmo como os robôs de arbitragem funcionam!
Antes de começar a análise, vou apresentar algumas ferramentas comumente usadas. As ferramentas corretas podem ajudá-lo a ser mais eficiente em sua pesquisa.
Phalcon | Tx.viewer | Cruise | Ethtx | Tenderly
Ferramentas como o Transaction Viewer são as mais comumente usadas e podem nos ajudar a visualizar o fluxo de chamadas de função e os parâmetros passados para cada função em uma transação que queremos analisar. Cada ferramenta é semelhante, diferindo apenas no suporte a diferentes blockchains e recursos auxiliares. Eu pessoalmente uso principalmente o Phalcon e o Transaction Viewer do Sam. Se encontrar uma blockchain não suportada, uso o Tenderly, que suporta a maioria das blockchains, mas não é tão conveniente em termos de legibilidade, exigindo uma análise mais lenta. No entanto, quando comecei a estudar análise OnChain, aprendi primeiro com o Ethtx e o Tenderly.
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
Tenderly: Ethereum, Polygon, BSC, Sepolia, Goerli, Gnosis, POA, RSK, Avalanche C-Chain, Arbitrum, Optimism, Fantom, Moonbeam, Moonriver
Vamos usar o exemplo do evento JayPeggers - Insufficient validation + Reentrancy link e o TXID para ilustrar o uso da ferramenta Phalcon desenvolvida pela Blocksec. Na imagem abaixo, você pode ver as informações básicas da transação e as mudanças no saldo. A partir das mudanças no saldo, você pode rapidamente ter uma ideia de quanto o atacante lucrou. Neste exemplo, o atacante lucrou 15,32 ETH.
Invocation Flow: visualiza o fluxo de chamadas de função da transação, permitindo que saibamos quais transações foram chamadas, quais projetos estão envolvidos, quais funções foram chamadas e quais parâmetros e dados brutos foram passados.
O Phalcon 2.0 adicionou recursos de análise de fluxo de fundos, depuração e análise de código-fonte, permitindo que você veja trechos de código, parâmetros e valores de retorno durante o processo de rastreamento, facilitando a análise.
Vamos agora usar o Transaction Viewer do Sam para ver o TXID. É semelhante ao Phalcon, mas o Sam integrou muitas ferramentas menores nele. Ao clicar no ícone de olho, você pode ver as alterações no armazenamento e o gás consumido por cada chamada.
Clicando na chamada mais à esquerda, você pode tentar decodificar os dados brutos de entrada.
Agora, vamos usar o Tenderly para ver o TXID. Na interface do Tenderly, você também pode ver as informações básicas, mas a parte de depuração não é visual, exigindo uma análise passo a passo. No entanto, a vantagem é que você pode depurar e ver o código-fonte e o processo de conversão dos dados brutos de entrada.
Até aqui, podemos ter uma ideia geral do que essa transação está fazendo. Antes de começar a escrever um PoC, você pode se perguntar se é possível reproduzir rapidamente o ataque? Sim, é possível! Você pode usar o Tenderly ou o Phalcon, que suportam a reprodução de transações simuladas. Na parte superior direita da imagem acima, há um botão "Re-Simulate", que preencherá automaticamente os parâmetros da transação. A partir dos campos na imagem, você pode alterar qualquer coisa, como o número do bloco, o remetente, o valor, os dados brutos de entrada, etc.
Nos dados brutos de entrada, os primeiros 4 bytes são a assinatura da função. Às vezes, quando o Etherscan ou outras ferramentas de análise não conseguem decodificar, você pode usar o Banco de Dados de Assinaturas para verificar qual função pode ser.
Aqui está um exemplo em que não sabemos o que é 0xac9650d8
como função.
Ao consultar o sig.eth, podemos ver que a assinatura de 4 bytes é multicall(bytes[])
.
ABI to interface | Get ABI for unverified contracts | ETH Calldata Decoder | ETHCMD - Guess ABI
ABI to interface: ao desenvolver um PoC e precisar chamar outros contratos, você precisa de uma interface. Essa ferramenta pode ajudá-lo a gerar rapidamente a interface desejada. Basta copiar o ABI do Etherscan e colá-lo na ferramenta para obter a interface gerada. Exemplo
ETH Calldata Decoder: às vezes, quando você não tem o ABI, mas deseja ver os dados brutos de entrada, pode experimentar o ETH Calldata Decoder. Como mencionado anteriormente, a ferramenta do Sam também suporta a decodificação dos dados brutos de entrada.
Get ABI for unverified contracts: se você encontrar um contrato não verificado, pode usar essa ferramenta para listar as assinaturas de função existentes nesse contrato. Exemplo
Etherscan-decompile bytecode | Dedaub | heimdall-rs
O Etherscan possui uma função de descompilação embutida, mas a legibilidade é um pouco comprometida. Eu pessoalmente uso o Dedaub com mais frequência, pois é mais legível. Muitas pessoas me perguntam qual ferramenta eu uso para descompilar. Vamos usar o exemplo de um MEV Bot que foi atacado link Você pode tentar descompilar você mesmo exemplo
Primeiro, copie o bytecode do contrato não verificado e cole-o no Dedaub. Em seguida, clique em "Decompile".
Por enquanto, é isso para a primeira lição. Se você quiser aprender mais, pode consultar os recursos de aprendizado abaixo.
samczsun's eth txn explorer and vscode extension
Vulnerabilities in DeFi by Daniel V.F.
Tenderly.co - Debug Transaction