Autor: Sun
-
Contexto
-
Em 13 de setembro de 2022, um MEV Bot foi atacado e os atacantes exploraram uma vulnerabilidade para transferir os ativos do contrato, resultando em uma perda de cerca de $140 mil.
-
Os atacantes enviaram transações privadas através do nó de validação BNB48, semelhante ao Flashbot, que não coloca as transações na mempool pública para evitar ataques de front-running.
-
-
Análise
- O ataque foi realizado através desta TXID. O contrato do MEV Bot não é de código aberto, então como isso foi explorado?
- Analisando através do phalcon, podemos ver que nesta transação, o MEV Bot transferiu 6 tipos de ativos para a carteira do atacante. Como isso foi possível?
- Vamos analisar o fluxo de chamadas de função, onde podemos ver que a função
pancakeCall
foi chamada 6 vezes. - Vamos analisar uma das chamadas de
pancakeCall
. Podemos ver que o contrato do atacante leu o valor detoken0()
como BSC-USD e, em seguida, transferiu BSC-USD para a carteira do atacante. Com isso, podemos concluir que o atacante tinha permissão ou explorou uma vulnerabilidade para transferir os ativos do contrato do MEV Bot. Agora, precisamos descobrir como o atacante fez isso. - Como mencionado anteriormente, o contrato do MEV Bot não é de código aberto. Portanto, podemos usar a ferramenta de descompilação Dedaub, mencionada na primeira aula, para analisar o contrato e ver se encontramos algo. Primeiro, vamos colar os bytecodes do contrato no Dedaub para descompilá-lo. Na imagem abaixo, podemos ver que a função
pancakeCall
tem permissão pública, o que significa que qualquer pessoa pode chamá-la. É normal que a função de callback em um empréstimo relâmpago seja pública e não deve ser um problema. No entanto, podemos ver que, na parte destacada em vermelho, há uma chamada para a função0x10a
. Vamos continuar analisando. - A lógica da função
0x10a
é mostrada na imagem abaixo. Podemos ver que, na parte destacada em vermelho, o contrato lê o token0 do contrato do atacante e, em seguida, o utiliza como parâmetro na função de transferênciatransfer
. O primeiro parâmetro da função é o endereço do destinatárioaddress(MEM[varg0.data])
, que é controlado pelovarg3 (_data)
dopancakeCall
. Portanto, o problema crítico da vulnerabilidade está aqui.
- Vamos voltar e analisar o payload da chamada
pancakeCall
. Os primeiros 32 bytes do_data
são o endereço da carteira do destinatário.
- Desenvolvendo o POC
- Com base na análise do fluxo de ataque acima, o desenvolvimento do contrato POC envolve chamar a função
pancakeCall
do contrato do MEV Bot e fornecer os parâmetros corretos. A chave está no_data
, onde especificamos o endereço da carteira do destinatário. Além disso, o contrato deve ter as funçõestoken0
etoken1
para atender à lógica do contrato. Você pode tentar escrever o contrato por conta própria. - Resposta: POC para referência.
- Com base na análise do fluxo de ataque acima, o desenvolvimento do contrato POC envolve chamar a função
-
Rastreamento Foundry
- O Foundry também pode listar os rastros de função dessa transação, usando o seguinte método:
cast run 0xd48758ef48d113b78a09f7b8c7cd663ad79e9965852e872fdfc92234c3e598d2 --quick --rpc-url https://rpc.ankr.com/bsc
-
Depuração Foundry
- Também é possível usar o Foundry para depurar a transação, seguindo o método abaixo:
cast run 0xd48758ef48d113b78a09f7b8c7cd663ad79e9965852e872fdfc92234c3e598d2 --quick --debug --rpc-url https://rpc.ankr.com/bsc
Flashbots: Kings of The Mempool
MEV Markets Part 1: Proof of Work
MEV Markets Part 2: Proof of Stake