SharkTeam: ERC2771 およびマルチコール任意アドレス スプーフィングの脆弱性の原理の分析

avatar
SharkTeam
10ヶ月前
本文は約2306字で,全文を読むには約3分かかります
OpenZeppelin プロジェクトの脆弱性分析。

2023 年 12 月 8 日、OpenZeppelin はコミュニティに対して重要なセキュリティ警告を正式にリリースしました。このアラートは、プロジェクト統合においてマルチコールのような方法で ERC-2771 標準を使用する場合、任意のアドレス スプーフィング攻撃のリスクがある可能性があると指摘しています。

SharkTeam はこのインシデントの技術分析を直ちに実施し、セキュリティ上の注意事項をまとめましたので、今後のプロジェクトがこれを教訓にして、ブロックチェーン業界のセキュリティ防御ラインを共同で構築できることを期待しています。

1. 攻撃トランザクション分析

この脆弱性に関連する一連の攻撃トランザクションが存在するため、分析対象として攻撃トランザクションの 1 つを選択しました。

攻撃者のアドレス:
0xFDe0d1575Ed8E06FBf36256bcdfA1F359281455A

攻撃トランザクション:
0xecdd111a60debfadc6533de30fb7f55dc5ceed01dfadd30e4a7ebdb416d2f6b6

攻撃プロセス:

1. まず。攻撃者 (0xFDe0d157) は最初に 5 WETH を使用して、約 3, 455, 399, 346 TIME と交換しました。
SharkTeam: ERC2771 およびマルチコール任意アドレス スプーフィングの脆弱性の原理の分析

2. その後、攻撃者 (0xFDe0d157) は悪意のある calldata パラメータを構築し、[Forwarder].execute 関数を呼び出しました。

3. [Forwarder].execute 関数を呼び出すと、悪意のある calldata が TIME コントラクトのマルチコール関数をトリガーしました。その後、残りのコールデータを使用して TIME コントラクトの書き込み機能をトリガーし、プール内の TIME トークンを破棄します。
SharkTeam: ERC2771 およびマルチコール任意アドレス スプーフィングの脆弱性の原理の分析

2. 脆弱性分析

まず第一に、この攻撃には主に、ERC 2771、マルチコール、慎重に構築された通話データなどのいくつかの側面が関係しています。 TIME トークン コントラクトから関連する継承を見つけることができます。
SharkTeam: ERC2771 およびマルチコール任意アドレス スプーフィングの脆弱性の原理の分析

1. ERC 2771 は、仮想 msg.sender を持つ機能を提供し、ユーザーがガスコストを削減するためにトランザクションの実行をサードパーティ [フォワーダー] に委託できるようにします。トランザクションが送信されると、msg.sender アドレスが calldata に追加されます。

2.TIMEトークンコントラクトはERC2771Contextを継承します。 [Forwarder] がコントラクトを呼び出すと、_msgSender() は calldata データをチェックして右にシフトし、最後の 20 バイトを予期される msg.sender として切り捨てます。
SharkTeam: ERC2771 およびマルチコール任意アドレス スプーフィングの脆弱性の原理の分析

3.Multicall は、単一の関数呼び出しを、同じコントラクト内で連続して呼び出される複数の関数に変換するメソッドです。ユーザーがコーディングした一連の呼び出しを受け入れ、独自のコントラクトを実行します。この関数は、calls 配列を反復処理し、各操作で delegatecall() を実行します。これにより、ユーザーはプロトコルで特定の操作の組み合わせを事前に定義しなくても、独自の一連の操作を組み合わせて同じトランザクション内で順番に実行できます。その主な目的はガスの節約でもあります。
SharkTeam: ERC2771 およびマルチコール任意アドレス スプーフィングの脆弱性の原理の分析

4. 攻撃者は、慎重に構築された呼び出しデータに対して、[Forwarder].execute 関数を呼び出し、関連するパラメーターを渡しました。
SharkTeam: ERC2771 およびマルチコール任意アドレス スプーフィングの脆弱性の原理の分析

それに応じてデータ値を読みやすい形式にフォーマットし、次の結果を取得します。
SharkTeam: ERC2771 およびマルチコール任意アドレス スプーフィングの脆弱性の原理の分析

攻撃者 (0x FDe 0 d 157) は、現在の calldata のオフセット操作を通じて新しいデータ値を取得し、その値を multicall(bytes[]) 関数に渡します。新しいデータの最初の 4 バイトは burn(uint 256) 関数のセレクターであり、量パラメーターは 62227259510000000000000000000 です。

5. multicall(bytes[]) 関数で、delegatecall を通じて burn(uint 256) 関数を呼び出します。行 0x 20 では、calldata を構築するときにアドレス 0x760dc1e043d99394a10605b2fa08f123d60faf84 が最後に最初に追加されます。このアドレスは、Uniswap v2 の TIME-ETH 流動性プールに対応しており、これは上記の予想される msg.sender です。
SharkTeam: ERC2771 およびマルチコール任意アドレス スプーフィングの脆弱性の原理の分析

6. 先ほど述べた msg.sender が TIME-ETH 流動性プール アドレスになったのはなぜですか?理由は、msg.senderが先頭の[Forwarder]コントラクトアドレスだからです。信頼できる [フォワーダー] であるかどうかを判断するには、信頼できる [フォワーダー] である場合は、msg.sender に calldata の最後の 20 バイトを設定します。

3. 安全に関する提案

この攻撃の根本原因: ERC-2771 では、[フォワーダー] はマルチコール用に設計されていません。攻撃者は、_msgSender() 関数の関連パラメーターをマルチコールの外部呼び出し、つまりこのイベントの [Forwarder].execute 関数に追加します。マルチコール関数では、一部の関数が関連パラメーターを _msgSender() に追加するため、攻撃者が _msgSender() になりすますことができます。したがって、攻撃者はマルチコールを使用して関連関数を呼び出すことにより、任意のアドレスへの呼び出しを模倣することができます。最後に、プール内の TIME トークンは承認を通じて破棄されます。

このインシデントに対応して、次の緩和および防止策を講じることができます。

1. バグを修正して新しいバージョンを使用する OpenZeppelin の Multicall の新しいバージョンには、ERC 2771 のコンテキスト サフィックス長が含まれています。1context データは、ERC-2771 の予想されるコンテキスト サフィックス長を識別するために使用されます。したがって、信頼できる [フォワーダー] からの呼び出しはすべて認識され、各サブ関数呼び出しに適応されます。
SharkTeam: ERC2771 およびマルチコール任意アドレス スプーフィングの脆弱性の原理の分析

以下は、バグ バージョンと更新バージョンの比較表です。
SharkTeam: ERC2771 およびマルチコール任意アドレス スプーフィングの脆弱性の原理の分析

2. [フォワーダー] が使用できないように、マルチコールを呼び出すコントラクトを禁止します。ThirdWeb を例として、この方法を OpenZeppelin のソリューションと比較します。OpenZeppelin は依然としてコントラクトを介したマルチコールを許可します。以下は、ThirdWeb の関連バグ バージョンと更新バージョンの比較表です。
SharkTeam: ERC2771 およびマルチコール任意アドレス スプーフィングの脆弱性の原理の分析

About Us

SharkTeam のビジョンは、Web3 の世界を保護することです。このチームは、ブロックチェーンとスマート コントラクトの基礎理論に精通した、世界中から集まった経験豊富なセキュリティ専門家と上級研究者で構成されています。オンチェーンビッグデータ分析、オンチェーンリスク警告、スマートコントラクト監査、暗号資産回復などのサービスを提供しており、オンチェーンビッグデータ分析およびリスク警告プラットフォームChainAegisを構築しています。詳細なグラフ分析を利用して、Web3 の世界での高度永続的脅威 (APT) と効果的に戦うことができます。 Polkadot、Moonbeam、polygon、Sui、OKX、imToken、ChainIDE など、Web3 エコシステムのさまざまな分野の主要企業と長期的な協力関係を確立しています。

公式ウェブサイト:https://www.sharkteam.org

Twitter:https://twitter.com/sharkteamorg

オリジナル記事、著者:SharkTeam。転載/コンテンツ連携/記事探しはご連絡ください report@odaily.email;法に違反して転載するには必ず追究しなければならない

ODAILYは、多くの読者が正しい貨幣観念と投資理念を確立し、ブロックチェーンを理性的に見て、リスク意識を確実に高めてください、発見された違法犯罪の手がかりについては、積極的に関係部門に通報することができる。

おすすめの読み物
編集者の選択