重要な Ethereum セキュリティの前提は、スマート コントラクト コードは不変であるため、ブロックチェーンに展開されると変更できないということです。 実際には、いくつかのスマートコントラクト できる 変更 – デプロイされた後でも。 いくつかの巧妙なトリックを使用すると、「メタモルフォーゼ」 が別のものに変換されます – そして何がそれらを可能にするのかを理解することで、それらを検出することができます.
メタモルフィック スマート コントラクトは変更可能です。つまり、開発者はその中のコードを変更できます。 これらのスマート コントラクトは、絶対的な一貫性を持って実行されることを期待するコードを信頼している web3 ユーザーに深刻なリスクをもたらします。 攻撃者がこの手法を使用して、変成的であることに気付いていないスマート コントラクトでトークンをステーキングしている人々を「からかう」ことを想像してみてください。 これと同様の前提に基づく攻撃は、詐欺師が人々を食い物にするように準備し、一般的に分散型システムの完全な約束に対する信頼を損なう可能性があります.
スマート コントラクトにメタモルフィック プロパティが含まれているかどうかを分析するには、 シンプルなものを作りました 変成契約検出器 (のオリジナル作品に触発され、それを基に構築されています ジェイソンカーバー, 0歳, 他人). 誰でもこのツールを使用して、特定のコントラクトがメタモルフィズムの可能性を示す危険信号を示しているかどうかを確認できます。 この方法は絶対確実というわけではありません。スマート コントラクトがフラグを示しているからといって、それが必ずしも変成的であるとは限りません。 そうでないからといって、安全であるとは限りません。 チェッカーは、契約の初期評価を迅速に提供するだけです。 かもしれない 可能な指標に基づいて変成する。
Web3 ユーザーは、起こりうる攻撃に注意して回避できるように、メタモルフィック コントラクトによってもたらされる脅威に精通する必要があります。 ウォレットとブロックチェーン インデクサーは、メタモルフィック プロパティを含む可能性のあるスマート コントラクトを操作する前に、ユーザーに警告することで役立ちます。 このツールは、この潜在的な脅威について人々を教育することと、それに対する防御の両方を支援することを目的としています。
メタモルフィック スマート コントラクトの検出
変成契約検出器 スマート コントラクトが変成的であるかどうかを示す可能性のある XNUMX つのプロパティを分析しました。
-
- コントラクトの展開に既知の変成コードが使用されましたか? 既知のメタモルフィックバイトコード(通常はSolidityで記述されたEthereumスマートコントラクトがコンパイル後に変換される低レベルの仮想マシン可読コード)が、特定のスマートコントラクトの展開のトランザクションに表示される場合、それは主要な危険信号です。 次のセクションでは、0ageによって開発されたメタモルフィックバイトコードのそのような例のXNUMXつについて説明します。 重要な注意事項:メタモルフィックバイトコードには潜在的に無数のバリエーションがあり、すべての種類を検出することは困難です。 ただし、よく知られているインスタンスをスキャンすることで、検出器は、既存の例をコピーして貼り付けるだけの攻撃者にとって、手に負えない成果を排除します。
- スマート コントラクト コードは自己破壊できますか? コントラクト内のコードを置き換える (メタモルフィック コントラクトを作成するための重要なステップ) には、開発者はまず既存のコードを削除する必要があります。 これを行う唯一の方法は、 SELFDESTRUCT オペコード、まさにそのように聞こえるコマンドです。これは、指定されたコントラクト アドレスにあるすべてのコードとストレージを消去します。 コントラクトに自己破壊コードが存在しても、それが変成的であることを証明するものではありません。 しかし、それは契約が かもしれない とにかく、あなたが依存している契約が自分自身を核攻撃できるかどうかを知ることは価値があります.
- スマート コントラクトは他の場所からコードを呼び出しますか? 問題のスマートコントラクトが直接自己破壊できない場合でも、を使用してそれ自体を消去できる可能性があります DELEGATECALL オペコード. このオペコードにより、スマート コントラクトは別のスマート コントラクト内に存在するコードを動的に読み込んで実行できます。 スマート コントラクトに SELFDESTRUCT オペコードが含まれていない場合でも、DELEGATECALL を使用して、別の場所から自己破壊コードを読み込むことができます。 DELEGATECALL 機能は、スマート コントラクトが変成的であるかどうかを直接示すものではありませんが、注目に値する潜在的な手がかり (および潜在的なセキュリティ問題) です。 この指標は、多くの誤検出を引き起こす可能性があることに注意してください。
- 別のコントラクトがこのコントラクトをデプロイしましたか? 変成契約を展開できます の 他のスマートコントラクトによって。 これは、メタモルフィック コントラクトが、CREATE2 と呼ばれる他のスマート コントラクトでのみ使用できる別のオペコードによって有効になるためです。 (CREATE2 については、それがどのように機能し、なぜ重要なのかについて、後のセクションで詳しく説明します。) この特性は、メタモルフィズムの可能性を示す最も目立たない指標の XNUMX つです。 それは必要ではあるが不十分な前提条件です。 この特性をスキャンすると、多くの誤検知が発生する可能性がありますが、特にスマート コントラクトに次に説明するオペコードが含まれている場合は、疑いを引き起こし、コントラクトをさらに精査する理由を提供できるため、知っておくと有益な情報です。
- デプロイヤ コントラクトには CREATE2 オペコードが含まれていますか? 前述のように、CREATE2 によるデプロイは、メタモーフィズムの必須の前提条件です。 デプロイヤ コントラクトに CREATE2 オペコードが含まれている場合、問題のコントラクトをデプロイするために CREATE2 を使用したことを示している可能性があります。 デプロイヤが実際に CREATE2 を使用して上記のコントラクトをデプロイした場合、それはコントラクトが必ずしもメタモルフィックであることを意味するわけではありませんが、 かもしれない 変化する可能性があり、注意して続行し、さらに調査することが賢明かもしれません。 繰り返しますが、誤検知に注意してください。 作成2 たくさんあります 正当な使用、強化を含む 「レイヤー 2」スケーリング ソリューション web3を改善できるスマートコントラクトウォレットの作成を容易にする ユーザーオンボーディング キー回復オプション。
- コードは変更されましたか? これは最も明白なテルですが、メタモルフィック コントラクトが既にモーフィングされた後にのみ表示されます。 スマート コントラクトのコード ハッシュ (一意の暗号化識別子) が、コントラクトが最初に展開されたときと異なる場合、コードが削除、置換、または変更された可能性があります。 ハッシュが一致しなくなった場合は、コードに関する何かが変更されており、コントラクトが変成されている可能性があります。 このフラグは、変態の最も確実な指標ですが、モーフィングがすでに発生したことを確認するだけなので、モーフィングの予測や予防には役立ちません。
Metamorphic Contract Detector 用の単純なコマンド ライン ツールを構築するだけでなく、次のセクションで説明する、詐欺のメタモルフィック コントラクト ステーキング シナリオを示すスマート コントラクトの例をいくつか構築しました。 すべてのコードはこれで利用可能です GitHubリポジトリ.
悪意のあるアクターがメタモルフィック コントラクトを使用して人々の資金を盗む方法
これは、誰かが詐欺の一部としてメタモルフィック スマート コントラクトを使用する方法です。
最初はセットアップフェーズです。 攻撃者は、メタモルフィックバイトコードとCREATE2オペコードのXNUMXつのツールを使用して、ブロックチェーン上の特定のアドレスにスマートコントラクトを展開します。 (これらの概念の両方については後で詳しく説明します。)次に、メタモーフィックバイトコードは、その名前が示すとおりに実行し、「モーフ」します。 ここで、それはに変わります ステーキング契約 ユーザーがERC-20トークンを賭けることができる場所。 (繰り返しになりますが、このモーフィングトリックの詳細については後で説明します。約束してください!)
次は餌とスイッチです。 疑いを持たないユーザーは、利回りやその他の特典を獲得できる可能性に誘惑されて、このコントラクトにトークンを賭けます。 次に、攻撃者は、このスマート コントラクト アドレスで、すべてのステーキング コードと「状態」 (ブロックチェーン ストレージまたはメモリ) を削除します。 SELFDESTRUCT オペコード 前のセクションで説明しました. (個別のERC-20コントラクトの一部として存在するトークンは、自己破壊コントラクトの影響を受けずに存続することに注意してください。)
最後に、ラグプル。 攻撃者は、セットアップ フェーズで使用されたのと同じメタモルフィック バイトコードを再利用して、新しいコントラクトを「再デプロイ」します。 この新しいコントラクトは、自己破壊コントラクトによって最近空になった同じアドレスに展開されます。 しかし今回は、バイトコードがコントラクト アドレスでステークされたすべてのトークンを盗むことができる悪意のあるコントラクトに「変形」します (これについては後で説明します)。 詐欺完了。
メタモルフィック スマート コントラクトがもたらすリスクは、今では明らかです。 しかし、この変成術のトリックが実際にどのように機能するのか、まだ疑問に思っているかもしれません。 それを理解するには、バイトコード レベルまで深く調べる必要があります。
CREATE2がメタモルフィズムの可能性を開く方法
作成2 オペコードのアップグレードであり、 イーサリアムに導入されました 2019 年 XNUMX 月に、スマート コントラクトを展開する新しい方法を提供します。
CREATE2 を使用すると、開発者はスマート コントラクトの展開を以前よりも細かく制御できます。 元の CREATE オペコードでは、開発者が展開されるスマート コントラクトの宛先アドレスを制御することが困難になります。 CREATE2 を使用すると、実際にブロックチェーンにデプロイする前に、特定のスマート コントラクトのアドレスを事前に制御して知ることができます。 この予知といくつかの巧妙なトリックにより、人々は変成的なスマート コントラクトを作成できます。
CREATE2 はどのように未来を予測できますか? オペコードの計算は決定論的です。入力が変更されない限り、CREATE2 によって決定されたアドレスは変更されません。 (わずかな変更でも、展開は別の場所で発生します。)
より詳細には、CREATE2は、いくつかの要素を組み合わせてハッシュする関数です。 まず、デプロイヤー(または送信者)のアドレスが組み込まれています。これは、作成されるコントラクトの親として機能する開始スマートコントラクトです。 次に、送信者(または「ソルト」)から提供された任意の番号を追加します。これにより、開発者は同じコードを異なるアドレスにデプロイし(ソルトを変更することにより)、既存の同一のコントラクトを上書きすることを防ぎます。 最後に、スマートコントラクト初期化(「init」)バイトコードのkeccak256ハッシュを使用します。これは、新しいスマートコントラクトに変わるシードです。 このハッシュ化された組み合わせにより、イーサリアムアドレスが決定され、指定されたバイトコードがそのアドレスにデプロイされます。 に限って バイトコードはまったく同じままで、CREATE2 は常に指定されたバイトコードをブロックチェーン上の同じアドレスにデプロイします。
CREATE2式は次のようになります。 (注:以下の例では、別の要素「0xFF」に気付くでしょう。 これは、CREATE2 が使用する単なる定数です。 衝突を防ぐ 前の CREATE オペコードを使用します。)
コードを決定論的なアドレスに展開する方法ができたので、どうすればそれが可能になりますか 変化する その同じアドレスのコード? 最初は、これは不可能に思えるかもしれません。 CREATE2 を使用して新しいコードをデプロイする場合は、バイトコードを変更する必要があるため、CREATE2 は別のアドレスにデプロイされます。 しかし、開発者が、CREATE2 がスマート コントラクトを展開するときに別のコードに「モーフィング」できるような方法でバイトコードを構築した場合はどうなるでしょうか?
変成契約が実際にどのように機能するか
スマート コントラクトをメタモルフィック コントラクトに変えるには、合計 XNUMX つのスマート コントラクトが必要で、それぞれが独自の役割を果たします。
これらの必要なコンポーネントの XNUMX つは、操作の頭脳である Metamorphic Contract Factory です。 この「ファクトリ」は、メタモルフィック コントラクトと実装コントラクトと呼ばれる別のスマート コントラクトのデプロイを担当します。実装コントラクトのコードは最終的にメタモルフィック コントラクト内に実装されるため、このように名付けられました。 下の図に示すように、これら XNUMX つのコントラクト間の微妙なコレオグラフィーが変成作用をもたらします。
1 から 7 までの各ステップについて詳しく説明し、作業中の操作を明らかにします。
ステップ 1: 開発者がすべてを動かす
コーダーは、最終的にメタモルフィック コントラクトになるスマート コントラクト コード (実装コントラクト バイトコード) を設計します。 開発者は、このコードを Metamorphic Contract Factory に送信します。これは、他のスマート コントラクトを展開することを主な目的とするスマート コントラクトです。 このアクションにより、Metamorphic Contract 作成プロセス全体が開始されます。
以降のすべては、この最初のステップの結果です。 それはそう、 ステップ 1 から 6 は、ブロックチェーン上の XNUMX つのアトミック トランザクションで発生します。つまり、ほぼ同時に発生します。 これらの手順は、Metamorphic Contract 内のコードを置き換えて継続的にモーフィングし続けるために、無限に何度も繰り返すことができます。
ステップ 2: 工場は実装契約を展開します
Factory がデプロイする最初のコントラクトは、実装コードを含む実装コントラクトです。 (クリエイティブ、私たちは知っています。)実装コントラクトは、最終目的地に出荷される前にコードを保持する積み込みドックまたはウェイポイントと考えてください。この場合、メタモルフィック コントラクト内になります。
ステップ 3: ファクトリ ストア実装契約アドレス
ブロックチェーンへの展開後、実装コントラクトは必ずブロックチェーン アドレスに存在します。 Factory は、このコントラクト アドレスを独自のメモリに格納します (後で、手順 5 で使用します)。
ステップ4:ファクトリがメタモルフィックコントラクトを展開する
Factory は、CREATE2 とメタモルフィック バイトコードを使用してメタモルフィック コントラクトをデプロイします。 メタモルフィック バイトコードの仕組みに関する技術的で詳細なウォークスルーを見つけることができます こちらですが、メタモルフィック バイトコードが実行されると、チェーン上の他の場所 (この場合は実装コントラクト) からメタモルフィック コントラクトにコードがコピーされると言えば十分です。 前のセクションで説明したように、CREATE2 は決定論的であるため (同じ送信者、salt、およびバイトコードが使用されている限り)、Metamorphic Contract アドレスは、これらの手順が何度繰り返されても同じままです。
以下は、メタモルフィック バイトコードがどのように見えるかの例です。 変成レポ 0歳までに。 これはメタモルフィック バイトコードの一例にすぎません。潜在的に無数のバリエーションが存在し、メタモルフィック コントラクトの検出を非常に複雑にしています。
ステップ 5: メタモルフィック バイトコードが実装コントラクト アドレスを Factory に問い合わせる
メタモルフィック バイトコードは、実装コントラクト アドレス (手順 3 で保存) を Factory に要求します。 アドレスを要求するメタモルフィック バイトコードが同じままである限り、実装コントラクトのアドレスが変更されても問題ありません。 実際、開発者が後で新しい実装コントラクト (トークンを盗むように設計された悪意のあるものなど) をデプロイする場合、ステップ 2 に従って、必然的に別のブロックチェーン アドレスにデプロイされます。これは、メタモルフィック コントラクトの作成には影響しません。
ステップ6: 実装コントラクトコードはメタモルフィックコントラクトにコピーされます
ステップ5で学習したブロックチェーンアドレスを使用して、メタモルフィックバイトコードは実装コントラクト内のコードを見つけ、そのコードをメタモルフィックコントラクトのローカルストレージにコピーします。 これは、メタモルフィックコントラクトがどのように形を変えるかです:実装コントラクトからコードをコピーすることによって。
ステップ7:すすぎと繰り返し
開発者は、ステップ 1 から 6 を何度も繰り返して、新しい実装コントラクトを使用して、メタモルフィック コントラクトのコードを好きなものに置き換えることができます。 必要なのは、メタモルフィック コントラクトの既存のコードを削除するために、SELFDESTRUCT オペコード (または、より巧妙に言えば、最終的に SELFDESTRUCT になる DELEGATECALL オペコード) を使用することだけです。 このサイクルを新しい実装コントラクト バイトコードで繰り返すことにより、メタモルフィック コントラクトは魔法のように、 モーフ!
変成コントラクトを作成するためのこの手法を使用すると、賢い開発者は、web3 ユーザーの足元で地面を絶えず変えることができます。 たとえば、詐欺のシナリオをもう一度考えてみましょう。 開発者は、最初にトークン ステーキング コードを使用して実装コントラクトを展開する場合があります。このコードは、図に示され、上記の手順で詳しく説明されている遠回りのパスを経由して、最終的にメタモルフィック コントラクトになります。 詐欺師は後でこのコードを自己破壊し、トークンを含む新しい実装契約を展開することでそれを置き換えることができます-窃盗 コード。
実装コントラクトに展開されるものは、最終的にメタモルフィック コントラクトになります。 それがトリックの本質です。
***
メタモルフィック スマート コントラクトは、見たものを手に入れるという暗黙の web3 社会契約を破ります。 シェル ゲームがボールを隠すために 3 つの動くカップを使用する方法と同様に、変成コントラクトの作成における XNUMX つのコントラクトの相互作用により、コントラクトの真の機能に従うことが難しくなります。 シェル ゲームは、コンフィデンス トリックスターが勝利を確実にするために手品やミスディレクションを使用することが多いため、特に適切な比較です。 webXNUMX バージョンでは、メタモルフィック コントラクト作成者は同様に「ボール」、つまり実装コードを消滅させ (読み方: 自己破壊)、好きなもので置き換えることができます。
メタモルフィック コントラクトの存在は、web3 ユーザーが自由に変更できるコントラクトを締結できることを意味します。そのため、この脅威を理解し、防御することが非常に重要です。 私の変成契約検出器 彼らが採用している手先の早業によって変成契約を識別するための最初のステップを提供します。 検出器を将来改善する方法はいくつかあります。 たとえば、Metamorphic Contract を作成した Factory (またはデプロイヤー コントラクト) を再帰的にチェックすることで、Factory 自体が Metamorphic であるかどうかを確認できます。 この機能は、Detector のアップグレード バージョン 2 に追加すると便利です。
繰り返しますが、この Detector ツールは万能ではありません。 それがキャッチするフラグは、すべてが変成の可能性を示す明確な兆候ではありませんが、手がかりを提供します. これらのフラグを特定することは、より徹底的な調査の始まりにすぎません。 そのため、ディテクターを拡張して、CREATE2 や DELEGATECALL オペコードの存在など、誤検知を簡単に生成する可能性のあるフラグを検索できるようにしました。 ツールを改善するための提案がある場合、またはこの最初の作業に基づいて構築または追加したい場合は、私に連絡してください。 .
変成特性のスマート コントラクトを分析する 探知ツールの使用 そして、訪問 GitHubレポ 詳細については、
編集者:Robert Hackett @rhhackett
***
謝辞: この投稿とツールを実現するにあたり貴重なフィードバックとアドバイスを提供してくれた Robert Hackett、Eddy Lazzarin、Sam Ragsdale、Riyaz Faizullabhoy、Noah Citron、Mason Hall、Daejun Park に感謝します。
***
ここに示されている見解は、引用された個々のAH Capital Management、LLC(「a16z」)の担当者の見解であり、a16zまたはその関連会社の見解ではありません。 ここに含まれる特定の情報は、a16zが管理するファンドのポートフォリオ企業を含むサードパーティの情報源から入手したものです。 a16zは、信頼できると思われる情報源から取得したものですが、そのような情報を独自に検証しておらず、情報の永続的な正確性や特定の状況に対するその適切性について表明していません。 さらに、このコンテンツにはサードパーティの広告が含まれる場合があります。 a16zはそのような広告をレビューしておらず、そこに含まれる広告コンテンツを推奨していません。
このコンテンツは情報提供のみを目的として提供されており、法律、ビジネス、投資、または税務に関するアドバイスとして信頼されるべきではありません。 これらの問題については、ご自身のアドバイザーにご相談ください。 証券またはデジタル資産への言及は、説明のみを目的としたものであり、投資の推奨または投資顧問サービスの提供を構成するものではありません。 さらに、このコンテンツは、投資家または将来の投資家による使用を目的としたものではなく、a16zが管理するファンドへの投資を決定する際にいかなる状況においても信頼されない場合があります。 (a16zファンドへの投資の申し出は、私募覚書、サブスクリプション契約、およびそのようなファンドの他の関連文書によってのみ行われ、その全体を読む必要があります。)言及、参照、または記載されているのは、a16zが管理する車両へのすべての投資を代表するものではなく、投資が有益である、または将来行われる他の投資が同様の特性または結果をもたらすという保証はありません。 アンドリーセンホロウィッツが管理するファンドが行った投資のリスト(発行者がa16zに公開を許可していない投資、および公開されているデジタル資産への未発表の投資を除く)は、https://a16z.com/investmentsで入手できます。 /。
記載されているチャートおよびグラフは、情報提供のみを目的としており、投資を決定する際に信頼することはできません。 過去の実績は将来の結果を示すものではありません。 内容は、示された日付の時点でのみ話されています。 これらの資料に記載されている予測、推定、予測、目標、見通し、および/または意見は、予告なしに変更される場合があり、他の人が表明した意見と異なる場合があります。 その他の重要な情報については、https://a16z.com/disclosuresを参照してください。