Back to Blog

Revelando os Ataques de Replay de "Mensagens" no EthereumPoW

Code Auditing
September 19, 2022
4 min read

Em 16 de setembro de 2022, detectamos que alguns atacantes conseguiram coletar muitos ETHW ao reproduzir a mensagem (ou seja, o calldata) da cadeia PoS na EthereumPoW (também conhecida como cadeia PoW). A causa raiz da exploração é que a ponte Omni na cadeia PoW usa o chainId antigo e não verifica corretamente o chainId real da mensagem cross-chain.

Imediatamente entramos em contato com a equipe oficial da EthereumPoW. A equipe estava ativamente disposta a tomar medidas, e eles também tentaram se comunicar com a Omni Bridge.

No entanto, à medida que mais e mais ataques foram observados em campo, acreditamos que o risco deveria ser notificado ao público, e publicamos o alerta em 18 de setembro de 2022.

Como ainda existe algum mal-entendido sobre esses ataques, ou seja, reproduzir a transação em vez da mensagem. Neste relatório, gostaríamos de fornecer uma análise detalhada para esclarecê-lo.

Análise do Ataque

Aqui está um exemplo de transações de exploração:

Note que essas duas transações são diferentes, porém, o calldata (ou dados de entrada) dessas duas transações são exatamente os mesmos*:

0x23caab4900000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000011500050000a7823d6f1e31569f51861e345b30c6bebf70ebe7000000000000e0f6f6a78083ca3e2a662d6dd1703c939c8ace2e268d88ad09518695c6c3712ac10a214be5109a655671000927c00101806401867f7a4d000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a6439ca0fcba1d0f80df0be6a17220fed9c9038a00000000000000000000000000000000000000000000000ad78ebc5ac62000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000001482faed2da812d2e5cced3c12b3baeb1a522dc67700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105041c1b1c1c981df6cdaf073d55b78d7f0c7e2b421a569bff677a9464d1d5203672d7b5a3d6af658d14ebc11c26f2547fd0aed01750cca58753a0a79b297bad8a62a71eb6b7ac2099611604eff316e7fe733e9981c1b3890cb04ff9d43612e6f2687227f0226cfa27e4b6cd96a10865e04aa9e0f369dda7548771a094f69bf0a9fa6c27257e22d2b1bbb84beb52ad3966592037b328d352fce375a1fa75cb3fbfd18166f4177a19ad2cc74ce67da68f5ce17b857e6382c3ebf20f76482534135f426f4a74222daa07d9f401cb8baca4339ecd44e285df0e0cb88447a31d08b673cecc67d22c7e6e0ce5afd2ac9439c5a8b68f05077b850cdfdfb79cdaefc5b103bb69360944000000000000000000000000000000000000000000000000000000

São apenas os dados de entrada da invocação da função safeExecuteSignaturesWithAutoGasLimit.

Obviamente, o atacante (0x82fae) primeiro transferiu 200 WETH através da ponte omni da cadeia Gnosis, e então reproduziu a mesma mensagem na cadeia PoW e obteve 200 ETHW extras. Ao fazer isso, o saldo do contrato da cadeia implantado na cadeia PoW poderia ser drenado.

Análise de Vulnerabilidade

Após analisar o código-fonte da ponte Omni, descobrimos que EXISTE a lógica para verificar o chainId.

    function _isDestinationChainIdValid(uint256 _chainId) internal returns (bool res) {
        return _chainId == sourceChainId();
    }

Infelizmente, o chainId verificado usado neste contrato vem do valor armazenado no armazenamento denominado unitStorage:

    /**
     * Internal function for retrieving chain id for the source network
     * @return chain id for the current network
     */
    function sourceChainId() public view returns (uint256) {
        return uintStorage[SOURCE_CHAIN_ID];
    }

NÃO é o chainId real obtido através do opcode CHAINID, que foi proposto no EIP-1344. Isso provavelmente se deve ao fato de que o código é bastante antigo (usando Solidity 0.4.24). O código funcionou bem o tempo todo até o fork da cadeia PoW.

Em resumo, a causa raiz da exploração é que a ponte Omni na cadeia ETHW usa o chainId antigo e não verifica corretamente o chainId real da mensagem cross-chain. Além disso, problemas semelhantes podem existir em outros protocolos.

O Impacto

O impacto mais direto é que o(s) atacante(s) poderia(m) coletar muitos ETHW (e também outros tokens de propriedade da ponte na cadeia PoW) e negociá-los em alguns mercados (por exemplo, algumas CEXs). Ao fazer isso, o preço do ETHW pode ser afetado devido ao aumento da liquidez. Portanto, usuários/investidores devem ter cautela com a negociação desses tokens na cadeia PoW.

Conclusão

Desenvolvedores Solidity devem prestar atenção especial ao lidar com o chainId que foi projetado para ser mantido pelo próprio contrato.

Sobre a BlockSec

A BlockSec é uma empresa pioneira em segurança blockchain estabelecida em 2021 por um grupo de especialistas em segurança de renome mundial. A empresa está comprometida em aprimorar a segurança e a usabilidade para o emergente mundo Web3, a fim de facilitar sua adoção em massa. Para esse fim, a BlockSec fornece serviços de auditoria de segurança para contratos inteligentes e cadeias EVM, a plataforma Phalcon para desenvolvimento de segurança e bloqueio proativo de ameaças, a plataforma MetaSleuth para rastreamento e investigação de fundos, e a extensão MetaDock para construtores web3 que navegam com eficiência no mundo cripto.

Até o momento, a empresa atendeu mais de 300 clientes estimados, como MetaMask, Uniswap Foundation, Compound, Forta e PancakeSwap, e recebeu dezenas de milhões de dólares americanos em duas rodadas de financiamento de investidores proeminentes, incluindo Matrix Partners, Vitalbridge Capital e Fenbushi Capital.

Site oficial: https://blocksec.com/

Conta oficial no Twitter: https://twitter.com/BlockSecTeam

Best Security Auditor for Web3

Validate design, code, and business logic before launch. Aligned with the highest industry security standards.

BlockSec Audit