16 сентября 2022 года мы обнаружили, что злоумышленники успешно похитили большое количество ETHW, воспроизводя сообщения (т.е. calldata) из сети PoS в EthereumPoW (также известную как сеть PoW). Первопричина эксплойта заключается в том, что Omni bridge в сети PoW использует старый chainId и не проверяет должным образом фактический chainId кроссчейн-сообщения.
Мы немедленно связались с официальной командой EthereumPoW. Команда проявила готовность принять меры, а также попыталась связаться с Omni Bridge.
That's why we asked the other day...
— EthereumPoW (ETHW) Official (@EthereumPoW) September 18, 2022
A message from the core -https://t.co/aemIaDFXvP
And a tweet to clarify - https://t.co/9bCKm0sugK
Thanks Blocksec, they were the 1st to pinpoint the issue.
Thanks the core and eip155, for protecting ETHW community.#safu #security https://t.co/htlLXQlTT7
Однако, поскольку случаи атак продолжались, мы решили, что общественность должна быть уведомлена о рисках, и опубликовали предупреждение 18 сентября 2022 года.
Поскольку до сих пор существует некоторое непонимание сути этих атак (а именно воспроизведение транзакции вместо сообщения), в этом отчете мы хотели бы предоставить подробный анализ для прояснения ситуации.
Анализ атаки
Вот пример транзакций, использованных при эксплойте:
- Транзакция PoS в Ethereum: https://etherscan.io/tx/0xbddb0cc8bc9949321e1748f03503ed1a20dd618fbf0a51dc5734c975b1f8bdf5
- (Эксплойт) Транзакция PoW в EthereumPow: https://www.oklink.com/en/ethw/tx/0x9c072551861ce384203516f4d705176a2d2e262d5b571d853467425f1a861fb4
Обратите внимание, что эти две транзакции различаются, однако 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



