Ataque de repetição após a fusão do Ethereum: Análise de ataques Omni cross link bridge

1,Descrição do evento

Em 18 de Setembro de 2022,Após a consolidação do Ethereum, a cadeia PoW foi atacada repetindo transações na cadeia PoS. A causa raiz foi que a ponte não leu e verificou corretamente o id da cadeia do blockchain.O atacante primeiro transferiu 200 WETH através da ponte Omni cross link da cadeia Gnosis e, em seguida, repetiu a mesma mensagem na cadeia PoW para obter 200 ETHW adicionais.

A SharkTeam realizou uma análise técnica deste evento e resumiu as precauções de segurança. Espera-se que os projetos de acompanhamento possam aprender com isso e construir uma linha de defesa de segurança na indústria blockchain.

2,Análise dos acontecimentos

Este evento envolve hashes de transação e endereços de atacantes de duas cadeias diferentes, da seguinte forma:

(1) Hash de transacção em cadeia PoS: 0xbddbdb0cc8bc9949321e1748f03503ed1a20dd618fbf0a51dc5734c975b1f8bdf5

(2) Hash de transacção em cadeia PoW: 0x9c072551861ce384203516f4D705176a2d2e262d5b571d853467425f1a861fb4

(3) Endereço do atacante: 0x82FaEd2dA812D2E5CCed3C12b3baeB1a522DC677

Primeiro, verificamos que os contratos acessados pelas duas transações são os mesmos, e os dados de entrada são idênticos, ou seja, a mesma função do mesmo contrato é chamada com os mesmos parâmetros, e o ID é assinado de acordo com o mesmo método  0x23caab49 Pode-se ver que os hackers chamam a função safeExecuteSignaturesWithAutoGasLimit.

Portanto, o invasor transfere 200WETH através do Omni Bridge e, em seguida, reproduz os mesmos dados de entrada na cadeia PoW para obter mais 200 ETHW.

Neste momento, estamos céticos quanto à operação de reprodução aqui. Porque a rede Ethereum aplica EIP-155 antes da ramificação dura, o que significa que as transações na cadeia ETH PoS não podem ser repetidas na cadeia PoW. Em transações normais, usamos nonce para classificar transações para evitar transações repetidas. Em cadeia cruzada, identificaremos o tipo de cadeia de acordo com chianid. Por exemplo, o Chainid da rede primária Ethereum é 1, e o Chainid da rede primária ETHW é 10001.

Para isso, analisamos o código fonte correspondente da Omni Bridge. Vamos dar uma olhada na lógica da Omni Bridge para verificar o chainid. Verifica-se que o chainid vem do valor armazenado no unitStorage, em vez do chainid lido diretamente através do código de operação CHAINID (0x46).

O contrato BasicAMB onde a função sourceChainId() está localizada herda BasicBridge e VersionableAMB. Entre eles, BasicBridge herdou sucessivamente o contrato EternalStorage. Se o chainid não for redefinido ou o chainid estiver configurado incorretamente devido à ramificação dura da blockchain, o chainid real da mensagem de cadeia cruzada não será verificado corretamente a partir do nível do contrato porque o chainid não é obtido através do opcode. Essas vulnerabilidades são fáceis de serem exploradas pelos invasores.

Análise do problema e resumo: principalmente porque a versão de solidez usada pelo Omni é 0.4.24, o chainid é armazenado e atualizado manualmente e o chainid real não é obtido através do código de operação CHAINID (0x46) especificado no EIP-1344.

3,Conselhos de segurança

A razão para este incidente de segurança é que o Omni Bridge não conseguiu lidar com o chainid a tempo durante o processo de atualização PoW. Como resultado, restam problemas da história na antiga versão solidez. Sugere-se que nas iterações subsequentes do projeto, novos problemas devem ser resolvidos a tempo e medidas necessárias de otimização de código devem ser tomadas. Embora a Omni Bridge na cadeia Gnosis tenha um limite máximo diário de 250 WETHs para transferir tokens, ainda precisamos estar vigilantes para evitar mais perdas causadas pelo acúmulo de tokens pequenos.