签名陷阱:为何Web3中的钱包用户体验正在让用户失望

本文深入探讨了一种名为“钱包欺骗”的网络钓鱼攻击,攻击者通过欺骗用户签署恶意消息或交易来盗取用户资产。文章分析了这种攻击方式的原理,即利用用户对钱包签名机制的不了解和Web3交互中存在的UX设计缺陷,并通过实际案例展示了这种攻击的危害性。最后,文章强调,要解决这个问题,需要改进钱包的用户体验,例如提供更清晰的消息解读、行为警告和风险提示,以帮助用户更好地理解签名内容的含义和潜在风险。

这是一个熟悉的时刻。你正在与一个 dApp 交互,一切似乎都很顺利,突然 MetaMask 弹出一个签名提示,里面充满了十六进制的 blobs。你点击“签名”,因为你一直都是这么做的,对吧?

但这一次,你刚刚授权给一个诈骗者来耗尽你的资产。

欢迎来到钱包欺骗的世界,这是一种不会破坏钱包本身,而是劫持用户与之交互的方式的诈骗。它不依赖于复杂的重入攻击或自定义操作码。相反,它利用了仓促的 UX,不知情的同意,以及 Web3 中围绕签名的有缺陷的信任模型。

我们喜欢相信 Web3 用户是被赋予权力的。伴随着巨大的责任,自我托管、签名和链上交互也带来了巨大的控制权。但实际上,我们给用户提供了非常锋利的工具,却几乎没有任何防护措施。钱包欺骗攻击就是这种矛盾的后果。

如果你曾经在 MetaMask、Rabby 或任何 Web3 钱包中签署过消息,但没有完全理解你签署的内容,那么你并不孤单。而且,如果攻击者当时欺骗了前端,或者制作了恶意的签名有效载荷,那么你的资产就是唾手可得的。

这不是理论上的。这种情况每天都在发生。

什么是真正的钱包欺骗?

欺骗,以其最简单的形式,就是 欺骗。在钱包的上下文中,它指的是诱骗用户签署他们不打算授权的消息或交易。这不是智能合约漏洞或协议级别的漏洞。这是社会工程学和 UI 操作,被融入到 dApp 的设计以及钱包提供商的盲点中。

诈骗者经常创建模仿合法应用程序的界面,或者通过被破坏的前端或恶意浏览器扩展,将恶意提示注入到真实的 dApp 中。随后的钱包提示看起来与其他提示一样。但是签名有效载荷呢?它完全不是。

一个常见的技巧是使用 eth_sign 和精心制作的数据。用户可能认为他们正在登录服务或验证他们的身份。实际上,他们正在签署一条消息,该消息授予恶意合约广泛的,有时是无限的权限。这些权限可能稍后用于执行 token 授权、耗尽 NFT 或通过中继的 meta-transactions 发起资产交换。

UX 在哪里让我们失望

这里更深层的问题不仅仅是诈骗,而是促成诈骗的体验。钱包提示通常会显示不透明的十六进制字符串、原始calldata或编码的 EIP-712 结构,而没有任何有意义的解释。对于普通用户来说,这些都是无法理解的。对于老练的用户来说,它们只是令人讨厌。在这两种情况下,用户都被训练成点击“签名”,只是为了继续完成他们的任务。

在传统金融中,你不允许根据一条隐秘的消息来授权电汇。但是在 Web3 中,你可以通过一次点击就放弃你拥有的所有东西,而且永远不会出现任何上下文警告。

这种认知上的捷径正是攻击者所利用的。

即使是通过 EIP-712 支持人类可读消息的钱包,在 dApp 有意混淆消息内容,或者更糟的是,当用户习惯于忽略长签名中的细节时,也可能会失败。我们创造了一种无摩擦交互的文化,但具有讽刺意味的是,这使得用户更容易受到基于签名的诈骗。

当 MetaMask 或其他钱包显示签名提示时,特别是使用 eth_sign 甚至 EIP-712 的提示时,用户会看到一个十六进制编码的数据块。有时它是结构化的并且是半可读的。但更多时候,它是一段密集的、陌生的字符,普通人无法理解。一条恶意消息可以很容易地说“授权登录到 ExampleDAO”,同时授予对中继器合约的完全访问权限,该合约可以移动 token、交换资产或与 vaults 交互。用户不会阅读小字条款。在大多数情况下,他们甚至不明白那里_有_小字条款。

野外的真实事件

2022 年,模仿 OpenSea 等 NFT 市场的钓鱼网站使用 eth_sign 引诱用户签署恶意消息。这些有效载荷经过巧妙的制作,看起来像是登录挑战,但实际上是授权转移有价值 NFT 的订单。

到 2023 年初,类似的策略已经演变成通过盲签名的更复杂的欺骗。其中一个备受瞩目的案例涉及一个知名 token 的虚假空投网站。用户被要求“领取奖励”,并被提供了一个看起来像标准领取的签名请求。他们签署的是一个 meta-transaction 有效载荷,该有效载荷授予攻击者完全的授权,可以在后台花费 token。转移是在几分钟后通过一个中继器合约执行的,而且造成的破坏是不可逆转的。

为什么盲签名如此危险

核心漏洞不是 Solidity 中的错误或未检查的外部调用。这个问题的核心在于 Web3 签名 UX 中的一个基本差距。当前的模式假设用户理解他们正在签署的内容。但这种假设是错误的。在实践中,用户级别的验证几乎为零。钱包很少将签名行为置于上下文中,更少提供有意义的警告或强制执行操作限制。

盲签名在整个生态系统中仍然很常见。一些钱包甚至不会解析结构化数据,除非明确要求。其他的则显示最少的警告或不提供任何检查工具。一旦签名,通常就没有原始意图的记录,只有存储在链下日志中的原始字符串。

而且不仅仅是 eth_sign。即使是善意的 EIP-712 消息也可能会适得其反。如果消息模式过于冗长,用户会跳过阅读。如果它过于抽象,那就没有意义。而且,如果 UI 没有将其翻译成人类可以理解的内容,那就会完全适得其反。

当诈骗者比钱包提供商更了解这一点时,游戏从一开始就被操纵了。

更好的 UX 是唯一的出路

要解决这个问题,我们需要重新思考用户与签名交互的方式。这意味着放弃盲签名,并采用更好的 UI 来承受风险。

钱包应该:

  • 根据已知的恶意模式提供上下文标签和警告。
  • 将 EIP-712 消息解析为人类可读的摘要,并清楚地说明签名后会发生什么。
  • 检测已知的审批函数,并明确高亮显示 token 权限更改。
  • 限制或沙盒化高风险操作,并在额外的用户验证(如 2FA 或锁时批准)之后进行。
  • 使用众包的信誉层标记未知的域名或合约交互。

除此之外,我们还需要更好地标准化 dApp 请求签名的方式。应该对开发人员实施更严格的规范,并且库应该引导他们走向更透明的用户流程。太多的 dApp 使用了 eth_sign,而结构化的 EIP-712 本可以满足需求,或者更糟的是,根本不需要签名。

一场文化变革即将到来

安全不仅仅是关于更好的工具,而是关于用户的行为。我们需要纠正“签名并忘记”的习惯,并通过清晰度重建信任。这不是要求更多的摩擦,而是要求有目的性。点击“签名”应该具有分量,而不仅仅是肌肉记忆。随着链上复杂性的增长和 dApp 变得更加强大,签名将承担更大的分量。L2、账户抽象、无 gas 交易、meta-signatures 和委托权限都依赖于用户在签名时做出合理的决定。这使得签名 UX 不仅仅是一个便利性问题,而是一个基础的安全层。

钱包欺骗是一种更深层次的设计缺陷的症状:Web3 要求用户采取不可逆转的行动,但没有给他们提供理解后果的工具。而且,在我们解决这个问题之前,任何审计、任何漏洞赏金和任何保险单都不够。

如果我们真的相信用户赋权,我们需要像那样进行设计。

  • 原文链接: blog.immunebytes.com/202...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
ImmuneBytes
ImmuneBytes
Stay Ahead of the Security Curve.