跳到内容

探索 MetaMask Snaps 的安全领域

本博客探讨 MetaMask Snaps 的信任模型,详细介绍 Web3 生态系统中开发者常见的安全问题及最佳实践。

5 分钟阅读
探索 MetaMask Snaps 的安全领域

MetaMask Snaps 是一个开源系统,允许用户安全地扩展 MetaMask 的功能,带来全新的钱包体验。其核心是一个在 MetaMask 内部隔离环境中运行的 JavaScript 程序。

在本文中,我们将探讨 MetaMask Snaps 的安全格局。作为来自 Consensys Diligence 的区块链安全审计员,我们专注于智能合约安全。Consensys Diligence 是一家区块链安全公司,提供全面的智能合约审计服务,帮助 Web3 领域的项目构建安全的 dapp。

理解 MetaMask Snap 信任模型

每位 Snaps 开发者都需要理解 MetaMask Snaps 固有的信任模型。该信任模型界定了不同参与方之间的信任边界。需要牢记的核心要点是:终端用户信任 MetaMask,但不信任 dapp。

我们在下图中对信任模型进行了正式化梳理与总结。该图展示了开发者在开发 Snaps 时必须牢记的不同信任边界:

Web3 dapp、用户与 MetaMask 之间的三大信任边界

第一,用户与 dapp 之间存在信任边界。用户从不信任 dapp。事实上,dapp 可能是恶意的,也可能已遭到入侵。它们可能让用户误以为自己在签署某个特定内容,而实际上签署的是完全不同的东西。

第二,MetaMask 及其扩展程序周围存在信任边界。尽管用户不信任 dapp,但他们信任 MetaMask。MetaMask 是用户的真相来源。无论是通过核心模块还是 Snaps,在 MetaMask 内部显示和签署的内容才是真正重要的。

第三,MetaMask 核心模块与 Snap 之间也存在信任边界。Snaps 开发者可以通过 Snaps API 与 MetaMask 的核心模块进行交互。该 API 实现了权限系统,这意味着开发者在访问受限 API 功能之前必须申请相应权限。然而,一旦获得适当权限,Snaps 便可执行关键操作,例如访问 MetaMask 根熵、签署数据或与外部 API 通信。

从本质上说,MetaMask 生态系统中终端用户的指导原则简单而深刻:终端用户只需信任在 MetaMask 和 MetaMask Snap 上下文中发生的信息与交互,即所谓的信任模块(Trust Module)。

解析 MetaMask Snaps 中的常见问题

MetaMask 信任模型支持结构化的审计方法,有助于审计员识别安全问题。在我们对 Snaps 的审计过程中,我们发现了不同类别的问题。出于对其他潜在类别的好奇,我们对 9 家审计公司审计的 40 个 Snaps 进行了全面分析。我们建立了一套分类体系,并据此对问题进行了归类。以下重点介绍几个有趣的类别及相关示例。请注意,此列表并不详尽。

用户输入验证:

  1. Markdown 与控制字符注入:这涉及通过用户输入中的 Markdown 或控制字符注入恶意代码或命令的风险。

  2. 用户输入清理与验证:- 类型检查/类型混淆及解析问题

  • API 未拒绝无效的 RPC 参数:当 API 未能拒绝无效参数(如错误的链 ID、地址校验和或费用结构)时,便会出现此问题。

  • 不当的 URI 验证:例如,在验证 URI 时使用过于宽松的正则表达式,可能导致此问题。

用户同意与用户界面问题:

  1. 违反 MetaMask 既定的用户体验模式:当应用程序偏离 MetaMask 既定的用户体验模式时,便会出现此问题。- 未提示用户进行账户访问授权:MetaMask 在将任何账户连接到 dapp 之前,始终会提示用户确认。Snaps 开发者应遵循相同的模式。

  • 账户枚举:一种隐私问题,应用程序可能在未获得适当同意的情况下枚举或列出用户账户。

  1. 未请求用户同意:- 签署 payload 时:指应用程序在未经用户明确批准的情况下执行签名相关操作的情形。

  • 显示私钥时未提供密码可见性切换:私钥在显示时未使用"点击显示"组件,也未附带免责声明文字。例如,当用户处于公共环境中时,这可能会带来安全隐患。

  1. 不透明的 Snap 对话框:这类对话框缺乏透明度或清晰度。- 交易签名对话框信息缺失:交易签名对话框中遗漏了关键信息,或向用户呈现的信息不具备可读性。

  • 费用四舍五入精度问题:涉及费用计算和显示中的不准确或精度不足问题。

  • 未显示来源:Snaps 未显示操作的来源,可能导致用户误以为该操作由某个 dapp 发起,而实际上来自另一个 dapp。

依赖项问题:

  1. 存在漏洞或不可信的依赖项。

  2. 供应链攻击:依赖项可能通过直接或间接攻击向量遭到入侵。

  3. 过时的依赖项:依赖过时的依赖项可能带来严重的安全隐患,因为这些依赖项可能包含漏洞。

权限与授权问题:

  1. 多余权限:授予过多权限会导致安全性降低。

  2. 访问低级权限:例如,不当管理以太坊的 MetaMask 根密钥熵。

  3. 密码学材料泄露:- Dapp 请求私钥:私钥绝不能离开 MetaMask!

  • 账户管理:Snap 应在首次连接时,在连接任何账户之前提示用户确认。

我们目前正在深化分析结果,并挖掘新的洞察。更多内容即将发布,敬请期待 :)

Snap 开发者的核心要点

请时刻牢记,您正在开发一个信任模块!用户信任 MetaMask,但不信任 dapp。用户必须确认每一项操作,并且应获得做出明智决策所需的全部信息。密钥永远不会离开 MetaMask。因此,作为 Snaps 开发者,您应当:

  1. 申请最小权限: Snaps 应仅请求访问其运行所必需的特定功能或数据,以最小化攻击面。

  2. 验证并清理受污染的输入: 避免注入攻击或执行不可信代码。鉴于 Snap 能够扩展用户钱包的功能,确保所有输入安全且不含漏洞,对于保护钱包完整性和用户资产至关重要。

  3. 管理供应链: 谨慎选择并及时更新依赖项,以避免漏洞风险。

在开发过程中牢记这些原则以及背后的常见问题,将使 Snaps 的未来对下一个十亿用户更加安全。

Consensys Diligence 已帮助区块链生态系统中的众多项目确保其协议在上线前做好准备,并为用户提供保护。Consensys Diligence 很乐意通过定制审计,检查您的 Snap 是否存在上述及更多漏洞。立即联系我们,获取报价!

Martin Ortner (tintinweb)

Valentin Quelquejay

Martin 与 Valentin 是 Consensys Diligence 的安全专家,他们站在 Snap 安全研究的前沿,致力于持续提升平台的安全性。

AI 翻译。可能包含错误。请务必核实信息。

评价此翻译

本文作者: