CertiK:Sui の最新の脆弱性「ハムスター ホイール」、技術的な詳細と詳細な分析

avatar
CertiK
1年前
本文は約5801字で,全文を読むには約8分かかります
先週、CertiK は、この重大なセキュリティ上の欠陥を発見したとして、SUI から 50 万ドルのバグ報奨金を受け取りました。

CertiK:Sui の最新の脆弱性「ハムスター ホイール」、技術的な詳細と詳細な分析

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

つい先週の月曜日、CertiK、重大なセキュリティ欠陥の発見に対して SUI に 500,000 ドルのバグ報奨金を授与。米国の業界権威メディアCoinDeskがこの事件を報じ、大手メディアも報道を受けて関連ニュースを発表した。

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

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

CertiK:Sui の最新の脆弱性「ハムスター ホイール」、技術的な詳細と詳細な分析

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

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

最初のレベルのタイトル

CertiK:Sui の最新の脆弱性「ハムスター ホイール」、技術的な詳細と詳細な分析

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

画像の説明

CertiK:Sui の最新の脆弱性「ハムスター ホイール」、技術的な詳細と詳細な分析

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

画像の説明

CertiK:Sui の最新の脆弱性「ハムスター ホイール」、技術的な詳細と詳細な分析

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

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

最初のレベルのタイトル

Move の抽象インタプリタを理解する: 線形分析と反復分析

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

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

画像の説明

CertiK:Sui の最新の脆弱性「ハムスター ホイール」、技術的な詳細と詳細な分析

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

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

最初のレベルのタイトル

Ai IDLeak Validator: カスタマイズされた抽象解釈分析

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

CertiK:Sui の最新の脆弱性「ハムスター ホイール」、技術的な詳細と詳細な分析

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

最初のレベルのタイトル

Sui IDLeak バリデーターのステータスのメンテナンスの不一致

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

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

CertiK:Sui の最新の脆弱性「ハムスター ホイール」、技術的な詳細と詳細な分析

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

CertiK:Sui の最新の脆弱性「ハムスター ホイール」、技術的な詳細と詳細な分析

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

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

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

画像の説明

CertiK:Sui の最新の脆弱性「ハムスター ホイール」、技術的な詳細と詳細な分析

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

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

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

最初のレベルのタイトル

不整合をさらに悪用すると、Sui IDLeak バリデーターで無限ループがトリガーされます。

画像の説明

CertiK:Sui の最新の脆弱性「ハムスター ホイール」、技術的な詳細と詳細な分析

悪意のある CFG+ 状態。IDLeak バリデーター内で無限ループを引き起こす可能性があります。

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

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

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

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

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

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

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

CertiK:Sui の最新の脆弱性「ハムスター ホイール」、技術的な詳細と詳細な分析

最初のレベルのタイトル

スイネットワークにおける「ハムスターホイール」攻撃の継続的な危険性

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

画像の説明

CertiK:Sui の最新の脆弱性「ハムスター ホイール」、技術的な詳細と詳細な分析

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

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

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

最初のレベルのタイトル

スイさんの解決策

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

CertiK:Sui の最新の脆弱性「ハムスター ホイール」、技術的な詳細と詳細な分析上記の不一致を取り除くために、Sui の修正には、AbstractState::join 関数に対する小さいながらも重要な調整が含まれています。このパッチは、AbstractValue::join を実行する前に状態マージの結果を決定するロジックを削除し、代わりに状態マージのために最初に AbstractValue::join 関数を実行し、最終的な更新結果と元の状態値を比較することによってマージが発生するかどうかを設定します。 (old_value) マークアップを変更します。

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

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

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

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

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

- バグ修正に関するSui開発者からのメモ

要約する

CertiK:Sui の最新の脆弱性「ハムスター ホイール」、技術的な詳細と詳細な分析

要約する

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

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

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

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