
本文探討 MetaMask Snaps 的信任模型,詳細說明 Web3 生態系統中開發者常見的安全問題與最佳實踐。

MetaMask Snaps 是一個開源系統,讓使用者能夠安全地擴展 MetaMask 的功能,提供全新的錢包體驗。其核心是一個在 MetaMask 隔離環境中運行的 JavaScript 程式。
在這篇部落格文章中,我們將探討 MetaMask Snaps 的安全性概況。作為來自 Consensys Diligence 的區塊鏈安全審計人員,我們專精於智能合約安全。Consensys Diligence 是一家區塊鏈安全公司,提供全面的智能合約審計服務,協助 Web3 各項目打造安全的 dapp。
每位 Snaps 開發者都需要了解 MetaMask Snaps 固有的信任模型。此信任模型劃定了不同參與者之間的信任邊界。最重要的核心概念是:終端使用者信任 MetaMask,但不信任 dapp。
我們在下方圖表中正式整理並歸納了信任模型。此圖表描繪了開發者在開發 Snaps 時必須牢記的各種信任邊界:
首先,使用者與 dapp 之間存在信任邊界。使用者從不信任 dapp。事實上,dapp 可能具有惡意或已遭入侵,可能讓使用者誤以為自己正在簽署某個特定內容,實際上卻是在簽署其他東西。
其次,MetaMask 及其擴充功能周圍存在信任邊界。雖然使用者不信任 dapp,但他們信任 MetaMask。MetaMask 是使用者的唯一可信來源。在 MetaMask 內顯示並簽署的內容,無論是透過其核心模組還是 Snaps,才是真正重要的。
第三,MetaMask 核心模組與 Snap 之間也存在信任邊界。Snaps 開發者可以透過 Snaps API 與 MetaMask 的核心模組互動。此 API 實作了權限系統,意味著開發者在存取受限 API 功能之前必須先申請權限。然而,在獲得適當權限的情況下,Snaps 可以執行關鍵操作,例如存取 MetaMask 根熵、簽署資料或與外部 API 通訊。
本質上,MetaMask 生態系統中終端使用者的指導原則既簡單又深刻:終端使用者只需信任在 MetaMask 和 MetaMask Snap 環境中發生的資訊與互動,即所謂的信任模組(Trust Module)。
MetaMask 信任模型提供了一種結構化的審計方式,有助於審計人員識別安全問題。在我們的 Snaps 審計過程中,我們發現了不同類別的問題。我們對其他潛在類別也感到好奇,因此對 9 家審計公司審計的 40 個 Snaps 進行了全面分析。我們建立了一套分類體系,並依此對問題進行歸類。以下我們重點介紹幾個有趣的類別及相關範例。請注意,此清單並不完整。
Markdown 與控制字元注入:這涉及透過使用者輸入中的 markdown 或控制字元注入不必要程式碼或指令的風險。
使用者輸入清理與驗證:- 類型檢查/類型混淆與解析問題
API 未拒絕無效的 RPC 參數:當 API 未能拒絕無效參數(例如錯誤的鏈 ID、地址校驗碼或費用結構)時,就會出現此問題。
不當的 URI 驗證:例如在驗證 URI 時使用過於寬鬆的正規表示式,可能導致此問題。
違反 MetaMask 既定的 UX 模式:當應用程式偏離 MetaMask 既定的使用者體驗模式時,就會出現此問題。- 未提示使用者進行帳戶存取:MetaMask 在將任何帳戶連接到 dapp 之前,始終會提示使用者。Snaps 開發者應遵循相同的模式。
帳戶枚舉:一種隱私問題,應用程式可能在未獲得適當同意的情況下枚舉或列出使用者帳戶。
未請求使用者同意:- 簽署 payload 時:這指的是應用程式在未獲得使用者明確批准的情況下執行簽名相關操作的情況。
顯示私鑰時未提供密碼可見性切換:私鑰在顯示時未使用點擊顯示元件,也未附帶免責聲明文字。例如,當使用者處於公共環境中時,這可能會造成問題。
不透明的 Snap 對話框:這些對話框缺乏透明度或清晰度。- 交易簽署對話框缺少資訊:交易簽署對話框中遺漏了重要資訊,或呈現給使用者的資訊無法以人類可讀的方式顯示。
費用四捨五入精度問題:這涉及費用計算和顯示中的不準確或精度不足問題。
顯示來源:Snaps 未顯示操作的來源,可能讓使用者誤以為該操作是由某個 dapp 發起,實際上卻來自另一個 dapp。
有漏洞/不受信任的相依套件。
供應鏈攻擊:相依套件可能透過直接或間接的攻擊途徑遭到入侵。
過時的相依套件:依賴過時的相依套件可能帶來不良的安全影響,因為這些套件可能包含漏洞。
多餘的權限:授予過多權限會導致安全性降低。
存取低層級權限:例如不當管理以太坊的 MetaMask 根金鑰熵。
加密材料洩漏:- Dapp 請求私鑰:私鑰絕對不能離開 MetaMask!
帳戶管理:Snap 應在首次連接時,於連接任何帳戶之前提示使用者。
我們目前正在精煉分析結果並發掘新的見解,更多內容即將推出,敬請期待 :)
請記住,您正在開發的是一個信任模組!使用者信任 MetaMask,但不信任 dapp。使用者必須確認每一個操作,且應擁有做出明智決策所需的所有資訊。金鑰絕不離開 MetaMask。因此,作為 Snaps 開發者,您應該:
申請最小權限: Snaps 應僅請求其運作所需的特定功能或資料存取權限,以最小化攻擊面。
驗證並清理受污染的輸入: 避免注入攻擊或執行不受信任的程式碼。鑑於 Snap 能夠擴展使用者錢包的功能,確保所有輸入都是安全且無漏洞的,對於保護錢包完整性和使用者資產至關重要。
管理供應鏈: 謹慎選擇並更新相依套件,以避免漏洞。
在開發過程中牢記這些原則以及潛在的常見問題,將使 Snaps 的未來對下一個十億使用者更加安全。
Consensys Diligence 已協助區塊鏈生態系統中的各類項目,確保其協議在上線前已準備就緒,並以保護使用者為核心設計。Consensys Diligence 很樂意針對這些及更多漏洞對您的 Snap 進行客製化審計。立即聯繫我們並取得報價!
Martin Ortner(tintinweb)
Valentin Quelquejay
Martin 與 Valentin 是 Consensys Diligence 的安全專業人員,站在 Snap 安全研究的最前線,致力於提升平台的安全性。
AI 翻譯。可能包含錯誤。請務必核實資訊。