EthereumPoW における「メッセージ」リプレイ攻撃を明らかにする

EthereumPoWに対するメッセージリプレイを伴う最近の攻撃について学び、Omniブリッジの脆弱性とchainId検証の必要性を強調します。

EthereumPoW における「メッセージ」リプレイ攻撃を明らかにする

2022年9月16日、一部の攻撃者がEthereumPoW(PoWチェーンとも呼ばれる)のPoSチェーンのメッセージ(すなわち、calldata)をリプレイすることで、大量のETHWを収穫することに成功したことを検出しました。 エクスプロイトの根本原因は、PoWチェーン上のOmniブリッジが古いchainIdを使用しており、クロスチェーンメッセージの実際のchainIdを正しく検証していないことです。

直ちにEthereumPoWの公式チームに連絡しました。 チームは積極的に行動する意思があり、Omni Bridgeとのコミュニケーションを試みました

しかし、ますます多くの攻撃が観測されたため、リスクを公に通知すべきだと考え、2022年9月18日にアラートを公開しました。

これらの攻撃、つまりメッセージのリプレイではなくトランザクションのリプレイについて、まだ誤解が存在するため、本レポートでは、それを明確にするための詳細な分析を提供したいと思います。

攻撃分析

以下にエクスプロイトトランザクションの例を示します。

これらの2つのトランザクションは異なりますが、これらの2つのトランザクションのcalldata(または入力データ)は全く同じです

0x23caab4900000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000011500050000a7823d6f1e31569f51861e345b30c6bebf70ebe7000000000000e0f6f6a78083ca3e2a662d6dd1703c939c8ace2e268d88ad09518695c6c3712ac10a214be5109a655671000927c00101806401867f7a4d000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a6439ca0fcba1d0f80df0be6a17220fed9c9038a0000000000000000000000000000000000000000000000ad78ebc5ac62000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000001482faed2da812d2e5cced3c12b3baeb1a522dc67700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105041c1b1c1c981df6cdaf073d55b78d7f0c7e2b421a569bff677a9464d1d5203672d7b5a3d6af658d14ebc11c26f2547fd0aed01750cca58753a0a79b297bad8a62a71eb6b7ac2099611604eff316e7fe733e9981c1b3890cb04ff9d43612e6f2687227f0226cfa27e4b6cd96a10865e04aa9e0f369dda7548771a094f69bf0a9fa6c27257e22d2b1bbb84beb52ad3966592037b328d352fce375a1fa75cb3fbfd18166f4177a19ad2cc74ce67da68f5ce17b857e6382c3ebf20f76482534135f426f4a74222daa07d9f401cb8baca4339ecd44e285df0e0cb88447a31d08b673cecc67d22c7e6e0ce5afd2ac9439c5a8b68f05077b850cdfdfb79cdaefc5b103bb693609440000000000000000000000000000000000000000

これはsafeExecuteSignaturesWithAutoGasLimit関数の呼び出しの入力データにすぎません。

明らかに、攻撃者(0x82fae)はまずGnosisチェーンのOmniブリッジを通じて200 WETHを転送し、その後PoWチェーン上で同じメッセージをリプレイして、さらに200 ETHWを取得しました。 これにより、PoWチェーン上にデプロイされたチェーンコントラクトの残高を枯渇させることが可能になります。

脆弱性分析

Omniブリッジのソースコードを分析した後、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ブリッジが古いchainIdを使用しており、クロスチェーンメッセージの実際のchainIdを正しく検証していないことです。 さらに、類似の問題が他のプロトコルにも存在する可能性があります。

影響

直接的な影響は、攻撃者が大量のETHW(およびPoWチェーン上のブリッジが所有する他のトークン)を収穫し、いくつかのマーケットプレイス(例:一部のCEX)で取引できたことです。 これにより、流動性の増加によりETHWの価格に影響を与える可能性があります。 したがって、ユーザー/投資家はPoWチェーンでのこれらのトークンの取引には注意が必要です。

結論

Solidity開発者は、コントラクト自体が管理するように設計されたchainIdを扱う際には、特別な注意を払うべきです。

BlockSecについて

BlockSecは、2021年に世界的に著名なセキュリティ専門家グループによって設立された、先駆的なブロックチェーンセキュリティ企業です。当社は、Web3の世界のセキュリティと使いやすさを向上させ、その大規模な採用を促進することにコミットしています。この目的のために、BlockSecはスマートコントラクトとEVMチェーンのセキュリティ監査サービス、セキュリティ開発と脅威のプロアクティブなブロックのためのPhalconプラットフォーム、資金追跡と調査のためのMetaSleuthプラットフォーム、そしてWeb3ビルダーが効率的に仮想通貨の世界をサーフィンするためのMetaDock拡張機能を提供しています。

今日まで、当社はMetaMask、Uniswap Foundation、Compound、Forta、PancakeSwapなど300以上の著名なクライアントにサービスを提供し、Matrix Partners、Vitalbridge Capital、Fenbushi Capitalなどの著名な投資家から2回の資金調達で数千万米ドルを受け取っています。

公式ウェブサイト:https://blocksec.com/

公式Twitterアカウント:https://twitter.com/BlockSecTeam

Sign up for the latest updates