A exploração de US$ 10 milhões na ponte Ronin em 6 de agosto foi causado por um script de implantação de atualização com falha, de acordo com um relatório da empresa de segurança blockchain Verichains.

A atualização reduziu o limite de votos para validadores a zero, permitindo essencialmente que qualquer usuário retirasse fundos da ponte "sem assinatura", afirmou a Verichains.

O proprietário do bot devolveu a maior parte dos fundos à equipe da Ronin posteriormente.

A análise da Verichains revela os riscos que os usuários enfrentam ao interagir com contratos inteligentes atualizáveis. O protocolo poderia ter perdido o valor total se o invasor tivesse pago mais em taxas de gás e, assim, evitado o frontrunner.

Ronin é uma rede blockchain dedicada a hospedar jogos Web3, sendo mais conhecida por ser o lar do Axie Infinity, um jogo de criação de monstros play-to-earn que alegou ter mais de 2 milhões de jogadores durante seu auge em 2022. Os jogadores da Ronin utilizam a ponte para transferir fundos entre Ethereum e Ronin.

De acordo com o relatório da Verichains, a ponte depende da variável minimumVoteWeight para evitar que os usuários retirem fundos que não lhes pertencem. Cada transação deve ser autorizada por um número mínimo de validadores definido por essa variável. Quando minimumVoteWeight é calculado, ele usa outra variável, totalWeight, como entrada.

TotalWeight em uma versão anterior da Ronin. Fonte: Verichains

Nas versões anteriores da ponte, totalWeight existia em um contrato separado, chamado "MainchainBridgeManager". Quando os desenvolvedores criaram a nova atualização, eles queriam mover essa variável para o armazenamento interno da própria ponte, em vez de deixá-la no outro contrato. Isso significava que precisavam inicializar a variável no momento da implantação, definindo totalWeight com o valor que ela tinha na versão anterior.

Infelizmente, foi aqui que a atualização deu terrivelmente errado. De acordo com a Verichains, os desenvolvedores da Ronin escreveram várias funções de "inicialização" diferentes que deveriam ser chamadas no momento da implantação. Cada uma dessas funções tinha um número de versão diferente. A terceira versão continha a inicialização crucial de totalWeight. Mas, quando os desenvolvedores escreveram o script de implantação, eles chamaram apenas a versão 4, deixando totalWeight com seu valor padrão de zero.

Fonte: Verichains

Após essa atualização, os usuários não precisavam mais enviar assinaturas para os validadores para provar seu direito de retirar fundos. Eles podiam retirar "sem assinatura", já que "atendia à condição minimumVoteWeight (que era 0 devido à falta de inicialização)".

Em uma postagem de 7 de agosto no X, o auditor de contratos inteligentes da Composable Security, Damian Rusinek, deu mais detalhes sobre o que permitiu que o ataque ocorresse. Segundo Rusinek, o invasor forneceu uma assinatura de um endereço terminando em B849f. No entanto, esse endereço "não estava na lista de operadores da ponte". Não precisava estar na lista de operadores da ponte porque "o número mínimo de votos dos operadores era 0". Portanto, "apenas UMA assinatura era necessária e poderia ser QUALQUER assinatura válida".

Embora não tenha entrado em tantos detalhes quanto a Verichains ou Rusinek, a Ronin confirmou em uma postagem de 6 de agosto no X que a exploração foi causada quando a atualização "introduziu um problema que levou a ponte a interpretar erroneamente o limite de votos dos operadores da ponte necessário para retirar fundos".

Dados da blockchain mostram que essa transação de ataque foi front-run por um bot MEV chamado "Frontrunner Yoink", que conseguiu drenar mais de US$ 10 milhões em criptomoedas da ponte. De acordo com Rusinek, o bot provavelmente "simulou a alteração do endereço e da quantia, utilizando sua própria assinatura". Em seguida, submeteu a transação assim que a simulação provou que a exploração funcionaria.

O proprietário do Frontrunner Yoink devolveu a maior parte dos fundos no mesmo dia, e a equipe da Ronin anunciou que ele poderia ficar com US$ 500.000 como recompensa por identificar o bug.

Os usuários da Ronin passaram por um momento crítico com a invasão de 6 de agosto. Felizmente, o ataque foi front-run por um bot MEV cujo proprietário era um operador white hat honesto. No entanto, o fato de o ataque ter chegado tão perto de ser bem-sucedido expõe a natureza arriscada das pontes cross-chain atualizáveis.

Algumas redes afirmam que esse problema será eliminado quando as soluções de camada 2 do Ethereum atingirem o "estágio 2", e todas as atualizações forem adiadas por pelo menos sete dias após a sua iniciação. No entanto, os críticos afirmam que o processo para alcançar esse estágio está demorando muito e pode nunca ser concluído.