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
Revelando os Ataques de Replay de "Mensagens" no EthereumPoW