Autor: Sun
- Recapitulação
- Em 20220913, um Bot MEV foi explorado por um atacante e todos os ativos no contrato foram transferidos, resultando em uma perda total de cerca de $140 mil.
- O atacante envia uma transação privada através do nó validador BNB48, semelhante ao Flashbot, não colocando a transação na mempool pública para evitar ser Front-running.
- Análise
- TXID do atacante, podemos ver que o contrato do Bot MEV não foi verificado e não era de código aberto. Como o atacante o explorou?
- Usando phalcon para verificar, a partir da parte do fluxo de funções dentro desta transação, o Bot MEV transferiu 6 tipos de ativos para a carteira do atacante. Como o atacante o explorou?
- Vamos olhar o processo de invocação da chamada de função e ver que a função
pancakeCall
foi chamada exatamente 6 vezes. - Vamos expandir uma das chamadas
pancakeCall
para ver, podemos ver que a chamada de retorno para o contrato do atacante lê o valor de token0() como BSC-USD e, em seguida, transfere BSC-USD para a carteira do atacante. Com isso, podemos saber que o atacante pode ter a permissão ou usar uma vulnerabilidade para mover todos os ativos no contrato do Bot MEV. O próximo passo é descobrir como o atacante o utiliza? - Por ter sido mencionado anteriormente que o contrato do Bot MEV não é de código aberto, então aqui podemos usar Lição 1 para introduzir a ferramenta de descompilação Dedaub. Vamos analisar e ver se podemos encontrar algo. Primeiro, copie os bytecodes do contrato do Bscscan e cole no Dedaub para descompilá-lo. Como mostrado na figura abaixo, podemos ver que a permissão da função
pancakeCall
é definida como pública e qualquer um pode chamá-la. Isso é normal e não deve ser um grande problema na chamada de retorno do Flash Loan, mas podemos ver o local destacado em vermelho, executando uma função0x10a
, e então vamos olhar para baixo. - A lógica da função
0x10a
é mostrada na figura abaixo. Podemos ver o ponto chave no local destacado em vermelho. Primeiro, leia qual token está em token0 no contrato do atacante e, em seguida, traga-o para a função de transferênciatransfer
. Na função, o primeiro parâmetro, endereço do receptoraddress(MEM[varg0.data])
, está empancakeCall
varg3 (_data)
, que pode ser controlado, então o problema de vulnerabilidade chave está aqui.
- Olhando para a carga útil da chamada do atacante
pancakeCall
, os primeiros 32 bytes do valor de entrada em_data
é o endereço da carteira do beneficiário.
- Escrevendo o POC
- Após analisar o processo de ataque acima, a lógica de escrever o POC é chamar o
pancakeCall
do contrato do Bot MEV e, em seguida, trazer os parâmetros correspondentes. A chave é o_data
para especificar o endereço da carteira de recebimento e, em seguida, o contrato deve ter as funções token0 e token1 para satisfazer a lógica do contrato. Você pode tentar escrevê-lo você mesmo. - Resposta: POC.
- Após analisar o processo de ataque acima, a lógica de escrever o POC é chamar o
-
Rastreamento do Foundry
- As funções de rastreamento da transação também podem ser listadas usando o Foundry, como segue:
cast run 0xd48758ef48d113b78a09f7b8c7cd663ad79e9965852e872fdfc92234c3e598d2 --quick --rpc-url https://rpc.ankr.com/bsc
-
Depuração do Foundry
- Você também pode usar o Foundry para depurar a transação, como segue:
cast run 0xd48758ef48d113b78a09f7b8c7cd663ad79e9965852e872fdfc92234c3e598d2 --quick --debug --rpc-url https://rpc.ankr.com/bsc
Flashbots: Kings of The Mempool
MEV Markets Part 1: Proof of Work