スイの最新脆弱性「ハムスターホイール」の技術詳細と徹底分析

以前、CertiK チームは、Sui ブロックチェーンに一連のサービス拒否の脆弱性を発見しました。これらの脆弱性の中で、新たに影響の大きい脆弱性が目立っています。この脆弱性により、Sui ネットワーク ノードが新しいトランザクションを処理できなくなり、その影響はネットワーク全体の完全なシャットダウンに相当します。

つい先週の月曜日、CertiK は、この重大なセキュリティ脆弱性を発見したことに対して、SUI から 50 万ドルのバグ報奨金を受け取りました。米国の業界で権威あるメディアであるCoinDeskがこのイベントを報じ、大手メディアも報道を受けて関連ニュースを発表した。

このセキュリティ脆弱性は「ハムスター ホイール」と鮮やかに呼ばれており、その独特の攻撃手法は現在知られている攻撃とは異なり、攻撃者は約 100 バイトのペイロードを送信するだけで、Sui 検証ノードで無限ループを引き起こし、応答不能になります。新しい取引へ。

さらに、攻撃による被害はネットワークの再起動後も継続する可能性があり、Sui ネットワーク内で自動的に伝播する可能性があり、ハンドルで無限に走り続けるハムスターのように、すべてのノードが新しいトランザクションを処理できなくなります。したがって、この独特のタイプの攻撃を「ハムスター ホイール」攻撃と呼びます。

バグを発見した後、CertiK は、Sui のバグ報奨金プログラムを通じて、Sui にバグを報告しました。また、Sui は初回から効果的に対応し、脆弱性の深刻さを確認し、メインネットの公開前に問題を修復するための対応措置を積極的に講じました。この特定の脆弱性を修正することに加えて、Sui はこの脆弱性が引き起こす可能性のある潜在的な損害を軽減するための予防的な緩和策も実装しました。

責任ある情報開示を行った CertiK チームに感謝の意を表し、Sui 氏は CertiK チームに 50 万ドルの報奨金を授与しました。

この重大な脆弱性の詳細は以下の技術レベルで公開され、脆弱性の根本原因と潜在的な影響が明らかにされます。

脆弱性の説明

Sui におけるバリデーターの重要な役割

Sui や Aptos などの Move 言語に基づくブロックチェーンの場合、悪意のあるペイロード攻撃を防ぐための保護メカニズムは主に静的検証技術です。静的検証技術を通じて、Sui は契約が発行またはアップグレードされる前に、ユーザーが送信したペイロードの有効性をチェックできます。バリデーターは、構造とセマンティクスの正確性を保証する一連のチェッカーを提供し、チェック検証に合格した後にのみ、コントラクトは Move 仮想マシンに入り、実行されます。

移動チェーン上の悪意のあるペイロードの脅威

Sui チェーンは、元の Move 仮想マシン上に新しいストレージ モデルとインターフェイスのセットを提供するため、Sui にはカスタマイズされたバージョンの Move 仮想マシンが存在します。新しいストレージ プリミティブをサポートするために、Sui はさらに、オブジェクト セキュリティやグローバル ストレージ アクセス機能など、信頼できないペイロードのセキュリティ検証のための一連の追加のカスタマイズされた検査方法を導入します。これらのカスタム チェックは、Sui の独自の機能に適合するため、これらのカスタム チェックを Sui バリデーターと呼びます。

スイの荷物チェックの順番

上の図に示すように、ベリファイアのチェックのほとんどは、CompiledModule (ユーザー指定のコントラクト ペイロードの実行を表す) に対して構造セキュリティ検証を実行します。たとえば、「重複チェッカー」を使用してランタイム ペイロードに重複エントリがないことを確認し、「制限チェッカー」を使用してランタイム ペイロードの各フィールドの長さが最大許容エントリ制限内であることを確認します。

構造チェックに加えて、検証者の静的チェックでは、信頼できないペイロードの堅牢性をセマンティック レベルで保証するために、さらに複雑な分析方法が必要です。

Move の抽象インタープリタについて学習します:

線形および反復分析

Move が提供する抽象インタープリタは、抽象解釈を通じてバイトコードの複雑なセキュリティ分析を実行するために特別に設計されたフレームワークです。このメカニズムにより、検証プロセスがより詳細かつ正確になり、各バリデーターは分析用に独自の抽象状態を定義できるようになります。

起動時に、抽象インタープリタはコンパイルされたモジュールから制御フロー グラフ (CFG) を構築します。これらの CFG の各基本ブロックは、「事前順序状態」と「順序後状態」という一連の状態を維持します。 「事前順序状態」は基本ブロックの実行前のプログラム状態のスナップショットを提供し、「事後順序状態」は基本ブロックの実行後のプログラム状態の説明を提供します。

抽象インタプリタが制御フロー グラフ内でジャンプバック (またはループ) に遭遇しない場合、抽象インタプリタは単純な線形実行原理に従います。つまり、各基本ブロックが順番に分析され、前の命令がブロック内の各命令のセマンティクスに従って計算されます。ブロック、シーケンシャル状態とポストシーケンシャル状態。その結果、プログラムの実行中の各基本ブロックの状態の正確なスナップショットが得られ、プログラムのセキュリティ特性を検証するのに役立ちます。

Move 抽象インタープリタのワークフロー

ただし、制御フローにループがある場合、プロセスはより複雑になります。サイクルの出現は、制御フロー グラフにジャンプバック エッジが含まれていることを意味します。ジャンプバック エッジのソースは、現在の基本ブロックの後続状態と、ジャンプの対象となる基本ブロック (ループの先頭) に対応します。バックエッジは以前に分析されたものであるため、抽象インタプリタはジャンプバックに関連する 2 つの基本ブロックの状態を慎重にマージする必要があります。

マージされた状態がループヘッド基本ブロックの既存のプリオーダー状態と異なることが判明した場合、抽象インタプリタはループヘッド基本ブロックの状態を更新し、この基本ブロックから解析を再開する。この反復分析プロセスは、ループの前状態が安定するまで継続されます。言い換えれば、このプロセスは、ループヘッド基本ブロックのプリオーダー状態が反復間で変化しなくなるまで繰り返されます。固定点に到達すると、サイクル分析が完了したことを示します。

Sui IDLeak バリデータ:

カスタマイズされた抽象解釈分析

オリジナルの Move 設計とは異なり、Sui のブロックチェーン プラットフォームは、独自の「目標」中心のグローバル ストレージ モデルを導入しています。このモデルの注目すべき特徴は、キー属性を持つデータ構造 (インデックスとしてチェーンに格納される) は、構造の最初のフィールドとして ID タイプを持たなければならないことです。各オブジェクトはグローバルに一意の ID を持つ必要があるため、ID フィールドは不変であり、他のオブジェクトに転送できません。これらのプロパティを確保するために、Sui は抽象インタープリターの上に一連のカスタム分析ロジックを構築しました。

IDLeak ベリファイア (id_leak_verifier とも呼ばれます) は、分析用の抽象インタープリターと連携して動作します。これには、AbstractState と呼ばれる独自の一意の AbstractDomain があります。各 AbstractState は、複数のローカル変数に対応する AbstractValue で構成されます。各ローカル変数の状態は AbstractValue によって監視され、ID 変数が新しいかどうかを追跡します。

構造パッキングのプロセスでは、IDLeak バリデーターは、新しい ID を構造にパッキングすることのみを許可します。解釈分析を抽象化することで、IDLeak バリデーターはローカル データ フローの状態を徹底的に追跡し、既存の ID が他の構造体オブジェクトに転送されないようにできます。

Sui IDLeak バリデーターの状態維持の不一致の問題

IDLeak バリデーターは、AbstractState::join 関数を実装することによって、Move 抽象インタープリターと統合されています。この関数は、状態管理、特に状態値のマージと更新において重要な役割を果たします。

これらの関数を詳しく調べて、その動作を理解してください。

AbstractState::join では、関数は別の AbstractState を入力として受け取り、そのローカル状態を現在のオブジェクトのローカル状態とマージしようとします。入力状態のローカル変数ごとに、その変数の値をローカル状態の現在の値と比較します (見つからない場合はデフォルトで AbstractValue::Other になります)。 2 つの値が等しくない場合は、最終状態のマージ結果が変更されたかどうかの基準として「変更済み」フラグを設定し、AbstractValue::join を呼び出してローカル状態のローカル変数値を更新します。

AbstractValue::join では、関数はその値を別の AbstractValue と比較します。それらが等しい場合は、渡された値を返します。等しくない場合は、AbstractValue::Other を返します。

ただし、この状態維持ロジックには隠れた不整合の問題が含まれています。 AbstractState::join は、新しい値と古い値の差に基づいてマージされた状態が変更されたことを示す結果 (JoinResult::Changed) を返しますが、マージされた更新された状態の値はまだ変更されていない可能性があります。

この不一致の問題は、操作の順序によって発生します。つまり、AbstractState::join で状態を変更する決定は状態更新 (AbstractValue::join) よりも前に行われ、この決定は実際の状態更新結果を反映しません。

さらに、AbstractValue::join では、AbstractValue::Other がマージの結果において決定的な役割を果たします。たとえば、古い値が AbstractValue::Other で、新しい値が AbstractValue::Fresh の場合、更新された状態の値は依然として AbstractValue::Other であり、古い値と新しい値が異なっていても、状態自体は変更されません。アップデート後。

例: ステートフル接続の一貫性のなさ

これにより、基本ブロックの状態をマージした結果は「変化した」と判断されるが、マージされた状態値自体は変化していないという矛盾が生じます。抽象的な解釈分析のプロセスにおいて、このような矛盾は重大な結果をもたらす可能性があります。制御フロー グラフ (CFG) でサイクルが発生したときの抽象インタープリターの動作を確認します。

ループに遭遇すると、抽象インタプリタは反復解析手法を使用して、ジャンプバック先の基本ブロックと現在の基本ブロックの状態をマージします。マージ状態が変化した場合、抽象インタプリタはジャンプ先から再解析を行います。

ただし、実際には状態の内部変数の値が変化していないにもかかわらず、抽象解釈分析のマージ操作で状態のマージ結果が誤って「変更」とマークされた場合、無限の再分析が発生し、結果的に無限ループ。

矛盾のさらなる悪用

Sui IDLeak バリデーターで無限ループをトリガーします

この不一致を利用して、攻撃者は IDLeak バリデーターをだまして無限ループに陥らせる悪意のある制御フロー グラフを構築する可能性があります。この慎重に構築された制御フロー グラフは、BB1、BB2、BB3 の 3 つの基本ブロックで構成されています。ループを構成するために、BB3 から BB2 へのバック ジャンプ エッジを意図的に導入していることは注目に値します。

悪意のある CFG+ ステータスにより、IDLeak バリデーターで内部無限ループが発生する可能性があります

プロセスは BB2 から始まり、特定のローカル変数の AbstractValue が ::Other に設定されます。 BB2 の実行後、フローは BB3 に移行し、同じ変数が ::Fresh に設定されます。 BB3 の最後にはバックジャンプエッジがあり、BB2 にジャンプします。

前述の矛盾は、この例の抽象的な解釈において重要な役割を果たします。バック ジャンプ エッジが処理されると、抽象インタープリタは BB3 のポストオーダー状態 (変数 "::Fresh" を使用) を BB2 のプレオーダー状態 (変数 "::Other" を使用) に接続しようとします。 AbstractState::join 関数は、古い値と新しい値の違いを認識し、BB2 を再分析する必要があることを示す「change」フラグを設定します。

ただし、AbstractValue::join の「::Other」の主要な動作は、AbstractValue がマージされた後も、BB2 状態変数の実際の値は依然として「::Other」であり、状態マージの結果は変更されていないことを意味します。 。

したがって、この循環プロセスが開始されると、つまりバリデーターが BB2 とその後継のすべての基本ブロック ノード (この場合は BB3) の再分析を継続すると、プロセスは無期限に継続します。無限ループは、利用可能なすべての CPU サイクルを消費し、新しいトランザクションを処理して応答できなくなり、バリデーターの再起動後もこの状態が継続します。

この脆弱性を悪用すると、検証ノードが無限ループで車輪に乗るハムスターのように際限なく実行され、新しいトランザクションを処理できなくなります。したがって、この独特のタイプの攻撃を「ハムスター ホイール」攻撃と呼びます。

「ハムスター ホイール」攻撃は、Sui バリデーターを効果的に停止させる可能性があり、その結果、Sui ネットワーク全体がダウンする可能性があります。

脆弱性の原因とトリガー プロセスを理解した後、次の Move バイトコード シミュレーションを使用して具体的な例を構築し、実環境のシミュレーションで脆弱性をトリガーすることに成功しました。

この例では、慎重に構築されたバイトコードを通じて実際の環境で脆弱性をトリガーする方法を示します。具体的には、攻撃者は IDLeak バリデーターで無限ループをトリガーし、わずか約 100 バイトのペイロードで Sui ノードのすべての CPU サイクルを消費し、新しいトランザクション処理を効果的に阻止し、Sui ネットワーク上でサービス妨害を引き起こす可能性があります。

「Hamster Wheel」攻撃は、Sui ネットワークに被害を与え続けています

スイのバグ報奨金プログラムには、主にネットワーク全体への害の程度に基づいて、脆弱性レベルの評価に関する厳格な規制があります。 「重大」の評価を満たす脆弱性は、ネットワーク全体をシャットダウンし、新しいトランザクションの確認を効果的に阻止する必要があり、問題を修正するにはハードフォークが必要です。(中)」または「高リスク (高)」の脆弱性。

CertiK Skyfall チームが発見した「ハムスターホイール」の脆弱性は、Sui ネットワーク全体をシャットダウンする可能性があり、アップグレードと修復には新しいバージョンの正式リリースが必要です。スイ氏は最終的に、その重大度に基づいてこの脆弱性を「緊急」と評価した。 「ハムスターホイール」攻撃によって引き起こされた深刻な影響をさらに理解するには、Sui のバックエンド システムの複雑なアーキテクチャ、特にチェーン上のトランザクションの公開またはアップグレードのプロセス全体を理解する必要があります。

Sui でトランザクションを送信するためのインタラクションの概要

最初に、ユーザー トランザクションはフロントエンド RPC 経由で送信され、基本的な検証後にバックエンド サービスに渡されます。 Sui バックエンド サービスは、受信トランザクション ペイロードをさらに検証する役割を果たします。ユーザーの署名が正常に検証された後、トランザクションはトランザクション証明書 (トランザクション情報とスイの署名を含む) に変換されます。

これらのトランザクション証明書は、Sui ネットワークの運用の基本部分であり、ネットワーク内のさまざまな検証ノード間で配布できます。コントラクト作成/アップグレード トランザクションの場合、チェーンにアップロードする前に、検証ノードは、Sui 検証者を呼び出して、これらの証明書のコントラクト構造/セマンティクスの有効性をチェックおよび検証します。 「無限ループ」の脆弱性が引き起こされ、悪用される可能性があるのは、この重要な検証段階です。

この脆弱性が発生すると、検証プロセスが無期限に中断され、システムによる新しいトランザクションの処理能力が実質的に妨げられ、ネットワークが完全にシャットダウンされてしまいます。さらに追い打ちをかけるように、この状況はノードの再起動後も継続しており、従来の緩和策では十分とは言えませんでした。この脆弱性が引き起こされると、「継続的な被害」が発生し、Sui ネットワーク全体に永続的な影響を残します。

スイの解決策

CertiK からのフィードバックを受けて、Sui はタイムリーに脆弱性を確認し、重大な欠陥に対処する修正プログラムをリリースしました。この修正により、状態の変更と変更後のフラグの間の一貫性が保証され、「ハムスターホイール」攻撃の重大な影響が除去されます。

前述の矛盾を取り除くために、Sui の修正には、AbstractState::join 関数に対する小さいながらも重要な調整が含まれています。このパッチでは、AbstractValue::join を実行する前にステート マージの結果を判定するロジックを削除し、代わりにステート マージ用の AbstractValue::join 関数を最初に実行し、最終的な更新結果と元のステート値 (旧バージョン) を比較することによってマージを設定します。 _value) 変更のフラグ。

このようにして、状態のマージの結果は実際の更新の結果と一致し、分析プロセス中に無限ループが発生することはありません。

この特定の脆弱性を修正することに加えて、Sui は将来のバリデーターの脆弱性の影響を軽減するための緩和策も導入しました。バグレポートのSuiさんの回答によると、軽減策にはDenylistと呼ばれる機能が含まれています。

「ただし、バリデーターには、特定のクラスのトランザクションを一時的に拒否できるノード構成ファイルがあります。この構成は、リリースやパッケージのアップグレードの処理を一時的に無効にするために使用できます。このバグにより、リリースまたはパッケージのアップグレード tx に署名する前に、Sui が実行されます。」バリデーターの場合、拒否リストはバリデーターの実行を停止し、悪意のある TX を削除しますが、これらの TX タイプを一時的に拒否リストに登録することは 100% 効果的な軽減策です (ただし、コードをリリースまたはアップグレードしようとする人々のサービスは一時的に中断されます)。

ちなみに、この TX 拒否リスト構成ファイルは以前から存在していましたが、以前に報告された「検証ループ」脆弱性へのフォローアップ緩和策として、証明書にも同様のメカニズムを追加しました。このメカニズムを使用すると、この攻撃に対する柔軟性が高まります。証明書拒否リスト構成を使用して、バリデーターが不正な証明書を忘れるようにし (無限ループを解消)、TX 拒否リスト構成を使用して公開/アップグレードを禁止し、それによって、新たな悪意のある攻撃トランザクション。このことについて考えさせてくれてありがとう!

バリデーターは、トランザクションに署名する前にバイトコードを検証するための「ティック」数 (ガスとは異なります) に制限があり、トランザクションで発行されたすべてのバイトコードをこの多数のティック内に検証できない場合、バリデーターはトランザクションへの署名を拒否し、トランザクションの署名を防ぎます。ネットワーク上で実行されないようにします。以前は、メータリングは選択された複雑なバリデータ パスのセットにのみ適用されていました。これに対処するために、メータリングを各バリデーターに拡張して、各ティックの検証プロセス中にバリデーターが実行する作業に対する制約を保証します。また、ID リークバリデーターの潜在的な無限ループのバグも修正しました。 」

--Sui開発者からのバグ修正についての説明

全体として、Denylist を使用すると、バリデーターはバリデーターの脆弱性の悪用を一時的に回避し、リリースまたはアップグレードのプロセスを無効にすることで、一部の悪意のあるトランザクションによって引き起こされる潜在的な損害を効果的に防ぐことができます。 Denylist の緩和策が有効になると、ノードは自身のパブリッシング/更新コントラクト機能を犠牲にして動作を継続できるようになります。

要約

この記事では、CertiK Skyfall チームが発見した「Hamster Wheel」攻撃の技術的な詳細を共有し、この新しいタイプの攻撃が主要な脆弱性を悪用して、Sui ネットワークの完全なシャットダウンを引き起こす方法を説明します。さらに、この重大な問題を修正するためのSuiのタイムリーな対応も注意深く調査し、同様の脆弱性に対する脆弱性修正とその後の緩和方法を共有しました。

原文表示
内容は参考用であり、勧誘やオファーではありません。 投資、税務、または法律に関するアドバイスは提供されません。 リスク開示の詳細については、免責事項 を参照してください。
  • 報酬
  • コメント
  • 共有
コメント
0/400
コメントなし
  • ピン
いつでもどこでも暗号資産取引
qrCode
スキャンしてGate.ioアプリをダウンロード
コミュニティ
日本語
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)