2022 年 9 月 16 日,我們檢測到部分攻擊者通過在 EthereumPoW(即 PoW 鏈)上重放 PoS 鏈的訊息(即調用數據,calldata),成功竊取了大量 ETHW。 本次攻擊的根本原因是 PoW 鏈上的 Omni Bridge 使用了舊的 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
然而,由於隨後觀察到越來越多的攻擊行為,我們認為有必要向公眾通報此風險,因此我們於 2022 年 9 月 18 日發布了 預警。
鑒於目前對於這些攻擊存在一些誤解(例如認為是重放交易而非重放消息),我們希望通過本報告進行詳細剖析以釐清事實。
攻擊分析
以下是攻擊交易的範例:
- Ethereum 上的 PoS 交易:https://etherscan.io/tx/0xbddb0cc8bc9949321e1748f03503ed1a20dd618fbf0a51dc5734c975b1f8bdf5
- (攻擊) EthereumPow 上的 PoW 交易: https://www.oklink.com/en/ethw/tx/0x9c072551861ce384203516f4d705176a2d2e262d5b571d853467425f1a861fb4
請注意,這兩筆交易有所不同,但它們的 調用數據(即輸入數據,calldata)完全相同:
0x23caab4900000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000011500050000a7823d6f1e31569f51861e345b30c6bebf70ebe7000000000000e0f6f6a78083ca3e2a662d6dd1703c939c8ace2e268d88ad09518695c6c3712ac10a214be5109a655671000927c00101806401867f7a4d000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a6439ca0fcba1d0f80df0be6a17220fed9c9038a00000000000000000000000000000000000000000000000ad78ebc5ac62000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000001482faed2da812d2e5cced3c12b3baeb1a522dc67700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105041c1b1c1c981df6cdaf073d55b78d7f0c7e2b421a569bff677a9464d1d5203672d7b5a3d6af658d14ebc11c26f2547fd0aed01750cca58753a0a79b297bad8a62a71eb6b7ac2099611604eff316e7fe733e9981c1b3890cb04ff9d43612e6f2687227f0226cfa27e4b6cd96a10865e04aa9e0f369dda7548771a094f69bf0a9fa6c27257e22d2b1bbb84beb52ad3966592037b328d352fce375a1fa75cb3fbfd18166f4177a19ad2cc74ce67da68f5ce17b857e6382c3ebf20f76482534135f426f4a74222daa07d9f401cb8baca4339ecd44e285df0e0cb88447a31d08b673cecc67d22c7e6e0ce5afd2ac9439c5a8b68f05077b850cdfdfb79cdaefc5b103bb69360944000000000000000000000000000000000000000000000000000000
這僅僅是調用 safeExecuteSignaturesWithAutoGasLimit 函數的輸入數據。

很明顯,攻擊者(0x82fae)首先通過 Gnosis 鏈的 Omni bridge 轉移了 200 WETH,然後在 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];
}
它並非透過 EIP-1344 提出的 CHAINID 操作碼所取得的實際 chainId。 這可能是因為該代碼較為老舊(使用的是 Solidity 0.4.24)。 在 PoW 鏈分叉之前,該代碼一直運作良好。
簡而言之,本次漏洞的根本原因是 ETHW 鏈上的 Omni Bridge 使用了舊的 chainId,且未正確驗證跨鏈訊息的真實 chainId。 此外,類似的問題也可能存在於其他協議中。
影響範圍
最直接的影響是攻擊者可能竊取大量 ETHW(以及 PoW 鏈上橋接合約擁有的其他代幣),並在各個市場(例如某些中心化交易所)進行交易。 這可能會因流動性的增加而影響 ETHW 的價格。 因此,用戶與投資者在 PoW 鏈上進行相關代幣交易時應保持謹慎。
結論
Solidity 開發者在處理設計由合約自身維護的 chainId 時,應給予特別注意。
關於 BlockSec
BlockSec 是一家領先的區塊鏈安全公司,由一群全球傑出的安全專家於 2021 年創立。公司致力於提升新興 Web3 世界的安全性和可用性,以推動其大規模採用。為此,BlockSec 提供智能合約與 EVM 鏈的安全審計服務,開發了用於安全開發與主動威脅攔截的 Phalcon 平台,用於資金追蹤與調查的 MetaSleuth 平台,以及協助開發者在加密世界中高效航行的 MetaDock 擴充套件。
迄今為止,公司已服務超過 300 家知名客戶,包括 MetaMask、Uniswap Foundation、Compound、Forta 和 PancakeSwap,並獲得了包括 Matrix Partners(經緯創投)、Vitalbridge Capital(唯獵資本)和 Fenbushi Capital(分佈式資本)在內的頂尖投資者兩輪數千萬美元的融資。
官方 Twitter 帳號:https://twitter.com/BlockSecTeam



