毎月、MetaMaskのセキュリティディレクターであるLukerが、知っておくべき最新の暗号資産攻撃と新たなリスクについてレポートします。
MetaMaskセキュリティチームの2022年4月レポートでは、npmの依存関係チェーンにおけるEndoのCommonJS互換性マイルストーン、LavaMoat v6の新しい「'a'a」パッケージ命名記法によるmetamask-extensionの実行時間の約600倍の短縮(10分未満1秒以下へ)、MetaMask ExtensionへのLavaMoat v6サプライチェーン保護の採用、LavaMoatのlockdown()がReact Native互換性に到達しMetaMask Mobileへの道を開いたこと、そしてMetaMaskのvaultデータに関するiCloudバックアップに関する注意事項を取り上げています。詳細は以下をご覧ください。まずは…
注目のSTEMパイオニア:ケイパビリティベースのコンピュータセキュリティの父、Butler Lampson
Butler Lampsonは、ソフトウェアがリソースへのアクセスを制御する方法を体系化したアメリカのコンピュータ科学者です。1970年代初頭に開発されたアクセスマトリックスモデルは、ケイパビリティとアクセス制御リストを単一のフレームワークに統合し、1992年のチューリング賞を受賞しました。彼が先駆けたケイパビリティベースの分離は、現在MetaMaskを保護するためにEndoとLavaMoatが使用するコンパートメントサンドボックスの理論的基盤となっています。
EndoがCommonJSモジュール互換性を達成し、npmパッケージ読み込みの残存課題を明確化
EndoのCommonJSサポートは、2022年4月に重要なマイルストーンに到達しました。npmエコシステムの実際のパッケージ(主にMetaMaskの依存関係から選択)を使ったエンドツーエンドテストにより、CommonJSサポートが不十分なケースが明らかになり、実装の推進に役立ちました。Endo、Node.js、および複数のバンドラーにわたって、ESMでインポートされたCommonJSからの複数のエクスポート形式を比較するテストは、目標の設定とリグレッションの防止に貢献しました。
この期間におけるEndoのCommonJSサポートの主な変更点には、import *へのエクスポートの接続と暗黙的なデフォルトエクスポートの導入、requireのすべての出現箇所を検出するためのレキサーの改善と不足パッケージエラーのランタイムへの延期、module.exportsをデフォルトとして名前付きエクスポートを識別するためのエクスポート処理のリファクタリング、そしてtype:moduleを持つネストされたpackage.jsonとpackage.jsonエクスポートにおけるオプション値の配列のサポート追加が含まれます。
進捗状況はCommonJSトラッキングエピックで追跡されています。
EndoはCommonJSモジュールの正しい読み込みをサポートするようになりました。npmから実際のパッケージを読み込む際に残存する問題は、4つのカテゴリに分類されます:不足している機能の使用(require.resolveやimport.metaなど)、グローバルおよびプリモーディアルの変更、インポートやHTMLコメントの注入を防ぐフィルターのトリガー、そしてEndoによる誤ったエクスポートマッピングとモジュールタイプの解決です。
Endoの実験的なrunコマンドがコンパートメント分離でJSファイルを実行
Endoのエンドツーエンドテストを接続するために使用される既存のツールをベースに、実験的なendo runコマンドがコンパートメントを使用してJSファイルを実行できるようになりました。これはnode app.jsに似ていますが、Endoの分離モデルが適用されています。
現在、すべてのNode.jsコアモジュールは、コードベースと依存関係によってrequire/importで利用可能になっています。今後の作業では、LavaMoatのポリシーのサポートを追加する予定です。
LavaMoat v6の「'a'a」パッケージ命名によりmetamask-extensionの実行時間が600倍短縮、10分未満1秒以下へ
LavaMoat v6は、なりすましやパッケージ名の再利用による問題を防ぐための新しいパッケージ識別子記法とともにリリースされました。「'a'a」と呼ばれるこの記法は、ポリシーファイルのキーに使用されるようになりました。
初期実装のパフォーマンスは、Node.jsがファイルを検索・アクセスする際の非効率性により大きく影響を受けていました。パフォーマンス改善の最初の試み(単純なメモ化の2つのケースに限定)により、metamask-extensionにおける「'a'a」の最悪ケースの実行時間は10分から30秒に短縮されました。しかし、メモリ使用量のスパイクのコストが高すぎました。
パフォーマンス診断と改善の第2回イテレーションでは、新しいアルゴリズム、再帰の排除、Node.jsモジュール解決へのローカルパフォーマンス改善により、最初のイテレーション結果と比較して時間とRAMを25倍以上削減しました。
合計で、最初の完全な実装から現在のバージョンまでの実行時間の改善は約600倍となりました。
MetaMask ExtensionがLavaMoat v6のサプライチェーン保護を採用
MetaMask ExtensionはLavaMoat v6の保護のもとで動作するようになり、ロールアウトはPR #14488で追跡されています。
LavaMoatのlockdown()がReact Native互換性に到達し、MetaMask Mobileへの道を開く
React NativeアプリケーションでLavaMoatを機能させるための基本的なステップは、SESのlockdown()関数を実行することです。lockdown()関数は、JavaScriptのプリモーディアルをリスト化してプロトタイプをフリーズすることで、悪意のある攻撃者がプロトタイプ汚染攻撃を実行することを困難にし、サプライチェーン攻撃からソフトウェアを保護します。
この取り組みで得られた知見の詳細なまとめはReact Native互換性トラッカーに記載されています。互換性を実現するための主要な事項は、MetroがSESバンドルを実行できるよう.cjsファイルを実行すること、特定のlockdownオプションの追加、Babelプラグインの削除、およびPromise polyfillの削除です。その他の問題は、SentryやEthereumJSの依存関係など、MetaMask Mobileアプリケーション固有のものです。
その結果、MetaMask Mobileアプリケーションリポジトリへのプルリクエストが作成されました。次のステップでは、エンドツーエンドテストを実行してlockdown()が追加機能を破壊していないことを確認した後、次の段階であるLavaMoatのMetaMask Mobileへの統合に進みます。
iCloudバックアップにパスワード暗号化されたMetaMask vaultデータが含まれることが判明
アプリデータのiCloudバックアップを有効にしているAppleユーザーは、気づかないうちにパスワード暗号化されたMetaMask vaultをバックアップしている可能性があります。パスワードが十分に強力でない場合、iCloudの認証情報がフィッシングされると、資金が盗まれる可能性があります。MetaMaskはXでガイダンスを公開し、デバイスでこの設定を制御する方法の手順を説明しています。
MetaMaskの2022年4月暗号資産セキュリティレポートでは、MetaMaskのnpm依存関係チェーンにおけるEndoのCommonJS互換性マイルストーン、新しい「'a'a」パッケージ命名記法によるmetamask-extensionでのLavaMoat v6の600倍のパフォーマンス改善、そしてMetaMask vaultデータに関するiCloudバックアップの注意事項を取り上げました。エコシステム全体で安全を保つための脅威、トレンド、ヒントについては、MetaMask暗号資産セキュリティレポートのバックナンバーをご覧ください。