本文深入探讨了一种名为“钱包欺骗”的网络钓鱼攻击,攻击者通过欺骗用户签署恶意消息或交易来盗取用户资产。文章分析了这种攻击方式的原理,即利用用户对钱包签名机制的不了解和Web3交互中存在的UX设计缺陷,并通过实际案例展示了这种攻击的危害性。最后,文章强调,要解决这个问题,需要改进钱包的用户体验,例如提供更清晰的消息解读、行为警告和风险提示,以帮助用户更好地理解签名内容的含义和潜在风险。
这是一个熟悉的时刻。你正在与一个 dApp 交互,一切似乎都很顺利,突然 MetaMask 弹出一个签名提示,里面充满了十六进制的 blobs。你点击“签名”,因为你一直都是这么做的,对吧?
但这一次,你刚刚授权给一个诈骗者来耗尽你的资产。
欢迎来到钱包欺骗的世界,这是一种不会破坏钱包本身,而是劫持用户与之交互的方式的诈骗。它不依赖于复杂的重入攻击或自定义操作码。相反,它利用了仓促的 UX,不知情的同意,以及 Web3 中围绕签名的有缺陷的信任模型。
我们喜欢相信 Web3 用户是被赋予权力的。伴随着巨大的责任,自我托管、签名和链上交互也带来了巨大的控制权。但实际上,我们给用户提供了非常锋利的工具,却几乎没有任何防护措施。钱包欺骗攻击就是这种矛盾的后果。
如果你曾经在 MetaMask、Rabby 或任何 Web3 钱包中签署过消息,但没有完全理解你签署的内容,那么你并不孤单。而且,如果攻击者当时欺骗了前端,或者制作了恶意的签名有效载荷,那么你的资产就是唾手可得的。
这不是理论上的。这种情况每天都在发生。
欺骗,以其最简单的形式,就是 欺骗。在钱包的上下文中,它指的是诱骗用户签署他们不打算授权的消息或交易。这不是智能合约漏洞或协议级别的漏洞。这是社会工程学和 UI 操作,被融入到 dApp 的设计以及钱包提供商的盲点中。
诈骗者经常创建模仿合法应用程序的界面,或者通过被破坏的前端或恶意浏览器扩展,将恶意提示注入到真实的 dApp 中。随后的钱包提示看起来与其他提示一样。但是签名有效载荷呢?它完全不是。
一个常见的技巧是使用 eth_sign
和精心制作的数据。用户可能认为他们正在登录服务或验证他们的身份。实际上,他们正在签署一条消息,该消息授予恶意合约广泛的,有时是无限的权限。这些权限可能稍后用于执行 token 授权、耗尽 NFT 或通过中继的 meta-transactions 发起资产交换。
这里更深层的问题不仅仅是诈骗,而是促成诈骗的体验。钱包提示通常会显示不透明的十六进制字符串、原始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 没有将其翻译成人类可以理解的内容,那就会完全适得其反。
当诈骗者比钱包提供商更了解这一点时,游戏从一开始就被操纵了。
要解决这个问题,我们需要重新思考用户与签名交互的方式。这意味着放弃盲签名,并采用更好的 UI 来承受风险。
钱包应该:
除此之外,我们还需要更好地标准化 dApp 请求签名的方式。应该对开发人员实施更严格的规范,并且库应该引导他们走向更透明的用户流程。太多的 dApp 使用了 eth_sign
,而结构化的 EIP-712 本可以满足需求,或者更糟的是,根本不需要签名。
安全不仅仅是关于更好的工具,而是关于用户的行为。我们需要纠正“签名并忘记”的习惯,并通过清晰度重建信任。这不是要求更多的摩擦,而是要求有目的性。点击“签名”应该具有分量,而不仅仅是肌肉记忆。随着链上复杂性的增长和 dApp 变得更加强大,签名将承担更大的分量。L2、账户抽象、无 gas 交易、meta-signatures 和委托权限都依赖于用户在签名时做出合理的决定。这使得签名 UX 不仅仅是一个便利性问题,而是一个基础的安全层。
钱包欺骗是一种更深层次的设计缺陷的症状:Web3 要求用户采取不可逆转的行动,但没有给他们提供理解后果的工具。而且,在我们解决这个问题之前,任何审计、任何漏洞赏金和任何保险单都不够。
如果我们真的相信用户赋权,我们需要像那样进行设计。
- 原文链接: blog.immunebytes.com/202...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!