Back to Blog

Раскрытие атак повторного воспроизведения «сообщения» в EthereumPoW

Code Auditing
September 19, 2022
3 min read

16 сентября 2022 года мы обнаружили, что злоумышленники успешно похитили большое количество ETHW, воспроизводя сообщения (т.е. calldata) из сети PoS в EthereumPoW (также известную как сеть PoW). Первопричина эксплойта заключается в том, что Omni bridge в сети PoW использует старый chainId и не проверяет должным образом фактический chainId кроссчейн-сообщения.

Мы немедленно связались с официальной командой EthereumPoW. Команда проявила готовность принять меры, а также попыталась связаться с Omni Bridge.

Однако, поскольку случаи атак продолжались, мы решили, что общественность должна быть уведомлена о рисках, и опубликовали предупреждение 18 сентября 2022 года.

Поскольку до сих пор существует некоторое непонимание сути этих атак (а именно воспроизведение транзакции вместо сообщения), в этом отчете мы хотели бы предоставить подробный анализ для прояснения ситуации.

Анализ атаки

Вот пример транзакций, использованных при эксплойте:

Обратите внимание, что эти две транзакции различаются, однако calldata (или входные данные) этих двух транзакций абсолютно идентичны:

0x23caab4900000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000011500050000a7823d6f1e31569f51861e345b30c6bebf70ebe7000000000000e0f6f6a78083ca3e2a662d6dd1703c939c8ace2e268d88ad09518695c6c3712ac10a214be5109a655671000927c00101806401867f7a4d000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a6439ca0fcba1d0f80df0be6a17220fed9c9038a00000000000000000000000000000000000000000000000ad78ebc5ac62000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000001482faed2da812d2e5cced3c12b3baeb1a522dc67700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105041c1b1c1c981df6cdaf073d55b78d7f0c7e2b421a569bff677a9464d1d5203672d7b5a3d6af658d14ebc11c26f2547fd0aed01750cca58753a0a79b297bad8a62a71eb6b7ac2099611604eff316e7fe733e9981c1b3890cb04ff9d43612e6f2687227f0226cfa27e4b6cd96a10865e04aa9e0f369dda7548771a094f69bf0a9fa6c27257e22d2b1bbb84beb52ad3966592037b328d352fce375a1fa75cb3fbfd18166f4177a19ad2cc74ce67da68f5ce17b857e6382c3ebf20f76482534135f426f4a74222daa07d9f401cb8baca4339ecd44e285df0e0cb88447a31d08b673cecc67d22c7e6e0ce5afd2ac9439c5a8b68f05077b850cdfdfb79cdaefc5b103bb69360944000000000000000000000000000000000000000000000000000000

Это просто входные данные вызова функции safeExecuteSignaturesWithAutoGasLimit.

Очевидно, что злоумышленник (0x82fae) сначала перевел 200 WETH через Omni Bridge в сети Gnosis, а затем воспроизвел то же самое сообщение в сети PoW и получил дополнительные 200 ETHW. Таким образом, баланс контракта моста, развернутого в сети PoW, мог быть исчерпан.

Анализ уязвимости

Проанализировав исходный код Omni bridge, мы обнаружили, что логика проверки chainId ДЕЙСТВИТЕЛЬНО существует.

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

К сожалению, проверяемый chainId, используемый в этом контракте, берется из значения, хранящегося в хранилище под названием 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];
    }

Это НЕ фактический chainId, полученный через опкод CHAINID, который был предложен в EIP-1344. Вероятно, это связано с тем, что код довольно старый (используется Solidity 0.4.24). Код отлично работал всё время до момента форка сети PoW.

Короче говоря, первопричина эксплойта заключается в том, что Omni bridge в сети ETHW использовал старый chainId и не проверял должным образом фактический chainId кроссчейн-сообщения. Кроме того, подобные проблемы могут существовать и в других протоколах.

Влияние

Прямое последствие заключается в том, что злоумышленник(и) могли похитить большое количество ETHW (а также другие токены, принадлежащие мосту в сети PoW) и торговать ими на некоторых площадках (например, на некоторых CEX). Таким образом, цена ETHW могла пострадать из-за увеличения ликвидности. Следовательно, пользователям/инвесторам следует проявлять осторожность при торговле этими токенами в сети PoW.

Заключение

Разработчикам на Solidity следует уделять особое внимание работе с chainId, который поддерживается самим контрактом.

О компании BlockSec

BlockSec — передовая компания в сфере безопасности блокчейна, основанная в 2021 году группой всемирно признанных экспертов по безопасности. Компания стремится повысить безопасность и удобство использования развивающегося мира Web3 для содействия его массовому внедрению. Для этого BlockSec предоставляет услуги по аудиту безопасности смарт-контрактов и EVM-сетей, платформу Phalcon для разработки систем безопасности и проактивной блокировки угроз, платформу MetaSleuth для отслеживания средств и расследований, а также расширение MetaDock для эффективной навигации разработчиков Web3 в криптовалютном мире.

На сегодняшний день компания обслужила более 300 уважаемых клиентов, таких как MetaMask, Uniswap Foundation, Compound, Forta и PancakeSwap, и получила десятки миллионов долларов США в двух раундах финансирования от выдающихся инвесторов, включая Matrix Partners, Vitalbridge Capital и Fenbushi Capital.

Официальный сайт: https://blocksec.com/

Официальный аккаунт в 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