
このブログでは、MetaMask Snapsのトラストモデルを探り、web3エコシステムにおける開発者向けの一般的なセキュリティ問題とベストプラクティスを詳しく解説します。

MetaMask Snapsは、ユーザーがMetaMaskの機能を安全に拡張し、新しいウォレット体験を提供できるオープンソースシステムです。その中核となるSnapは、MetaMask内の隔離された環境で動作するJavaScriptプログラムです。
このブログでは、MetaMask Snapsのセキュリティ状況を探ります。Consensys Diligenceのブロックチェーンセキュリティオーディターとしてスマートコントラクトセキュリティを専門としています。Consensys Diligenceは、web3全体のプロジェクトが安全なdappを構築できるよう、包括的なスマートコントラクト監査サービスを提供するブロックチェーンセキュリティ企業です。
Snapsの開発者は全員、MetaMask Snapsに固有のトラストモデルを理解する必要があります。このトラストモデルは、異なるアクター間の信頼の境界を明確にします。覚えておくべき重要なメッセージは、エンドユーザーはMetaMaskを信頼しているが、dappは信頼していないということです。
以下の図にトラストモデルを整理してまとめました。この図は、Snapsを開発する際に開発者が念頭に置くべき、さまざまな信頼の境界を示しています:
第一に、ユーザーとdappの間には信頼の境界があります。ユーザーはdappを決して信頼しません。実際、dappは悪意を持っていたり、侵害されている可能性があります。ユーザーが特定のペイロードに署名していると思わせながら、実際には別のものに署名させることもできます。
第二に、MetaMaskとその拡張機能の周囲にも信頼の境界があります。ユーザーはdappを信頼しない一方で、MetaMaskは信頼しています。MetaMaskはユーザーにとっての真実の源です。コアモジュールを通じてであれ、Snapsを通じてであれ、MetaMask内で表示・署名されるペイロードこそが重要です。
第三に、MetaMaskのコアモジュールとSnapの間にも信頼の境界があります。Snaps開発者はSnaps APIを通じてMetaMaskのコアモジュールと対話できます。このAPIはパーミッションシステムを実装しており、制限されたAPI機能にアクセスする前に開発者がパーミッションをリクエストする必要があります。ただし、適切なパーミッションがあれば、SnapsはMetaMaskのルートエントロピーへのアクセス、データへの署名、外部APIとの通信など、重要なアクションを実行できます。
本質的に、MetaMaskエコシステムにおけるエンドユーザーの指針はシンプルでありながら深遠です:エンドユーザーは、Trust Moduleとして知られるMetaMaskおよびMetaMask Snapのコンテキスト内で発生する情報とインタラクションのみを信頼すればよい。
MetaMaskのトラストモデルは、構造化された監査アプローチを可能にし、監査者がセキュリティ問題を特定するのに役立ちます。Snapsの監査中に、さまざまなカテゴリの問題を特定しました。他にも潜在的なカテゴリがあるかどうか気になったため、9つの監査会社が監査した40のSnapsを対象に包括的な分析を実施しました。分類を作成し、この分類に従って問題を整理しました。以下では、いくつかの興味深いカテゴリと例を紹介します。このリストは網羅的なものではありません。
Markdown・制御文字インジェクション:ユーザー入力のMarkdownや制御文字を通じて、不要なコードやコマンドが注入されるリスクです。
ユーザー入力のサニタイズと検証:- 型チェック・型混乱および解析の問題
無効なRPCパラメータを拒否しないAPI:不正なチェーンID、アドレスチェックサム、手数料構造などの無効なパラメータをAPIが拒否しない場合に発生する問題です。
不適切なURIの検証:例えば、URIを検証する際に緩いregex表現を使用した場合に発生する可能性のある問題です。
MetaMaskの確立されたUXパターンの破壊:アプリケーションがMetaMaskの確立されたユーザー体験パターンから逸脱した場合に発生する問題です。- アカウントアクセスのプロンプトを表示しない:MetaMaskは、dappにアカウントを接続する前に常にユーザーにプロンプトを表示します。Snaps開発者も同じパターンに従う必要があります。
アカウントの列挙:適切な同意なしにアプリケーションがユーザーアカウントを列挙またはリスト表示する可能性があるプライバシーの懸念です。
ユーザーの同意を求めない:- ペイロードへの署名時:ユーザーの明示的な承認なしにアプリケーションが署名関連のアクションを実行するケースです。
パスワード表示切り替えなしで秘密鍵を表示:秘密鍵が、免責事項テキストを伴うクリックで表示するコンポーネントを使用せずに表示されます。例えばユーザーが公共の場にいる場合、これは問題になる可能性があります。
不透明なSnapダイアログ:透明性や明確さに欠けるダイアログです。- 情報が欠落したトランザクション署名ダイアログ:トランザクション署名ダイアログで重要な情報が省略されているか、ユーザーに提示される情報が人間が読める形式でないケースです。
手数料の丸め精度の問題:手数料の計算と表示における不正確さや精度の欠如に関する問題です。
オリジンの表示:Snapsがアクションのオリジンを表示しません。これにより、実際には別のdappから開始されたアクションを、あるdappから開始されたとユーザーに思わせる可能性があります。
脆弱な・信頼できない依存関係。
サプライチェーン攻撃:依存関係は、直接的または間接的な攻撃ベクターを通じて侵害される可能性があります。
古い依存関係:古い依存関係に依存すると、それらの依存関係に脆弱性が含まれている可能性があるため、セキュリティ上の悪影響を及ぼす可能性があります。
過剰なパーミッション:過剰なパーミッションを付与するとセキュリティが低下します。
低レベルパーミッションへのアクセス:例えばEthereumのMetaMaskルートキーエントロピーの不適切な管理。
暗号マテリアルの漏洩:- 秘密鍵のdappリクエスト:秘密鍵はMetaMaskから外に出てはいけません!
アカウント管理:Snapは最初の接続時に、アカウントを接続する前にユーザーにプロンプトを表示する必要があります。
現在、分析結果を精査し、新たな知見を特定しています。近日中にさらに多くの情報をお届けします。お楽しみに :)
あなたはトラストモジュールを開発していることを意識してください!ユーザーはMetaMaskを信頼していますが、dappは信頼していません。ユーザーはすべてのアクションを確認する必要があり、十分な情報に基づいた判断を下すために必要なすべての情報が利用可能である必要があります。鍵はMetaMaskから外に出ません。したがって、Snaps開発者として以下を実践できます:
最小限のパーミッションをリクエストする: Snapsは、攻撃対象領域を最小化するために、動作に必要な特定の機能やデータへのアクセスのみをリクエストする必要があります。
汚染された入力を検証・サニタイズする: インジェクション攻撃や信頼できないコードの実行を回避します。SnapがユーザーのウォレットのFunctionを拡張できることを考えると、すべての入力が安全でエクスプロイトから解放されていることを確認することは、ウォレットの整合性とユーザーの資産を保護するために不可欠です。
サプライチェーンを管理する: 脆弱性を回避するために、依存関係を慎重に選択し、更新します。
開発中にこれらの原則と根本的な一般的問題を念頭に置くことで、次の10億人にとってSnapsの未来がはるかに安全になります。
Consensys Diligenceは、ブロックチェーンエコシステム全体の幅広いプロジェクトを支援し、プロトコルがローンチの準備が整い、ユーザーを保護するように構築されていることを確認してきました。Consensys Diligenceは、カスタム監査でこれらおよびその他の脆弱性についてあなたのSnapを確認することを喜んでお手伝いします。お問い合わせいただき、見積もりを取得してください!
Martin Ortner (tintinweb)
Valentin Quelquejay
MartinとValentinは、Consensys Diligenceのセキュリティ専門家であり、Snapセキュリティ研究の最前線に立ち、プラットフォームのセキュリティ強化に精力的に取り組んでいます。
AIによる翻訳です。エラーが含まれている可能性があります。常に情報を確認してください。