这篇文章深入探讨了Web3中常见的“钱包欺骗”骗局,该骗局并非协议漏洞,而是利用糟糕的用户体验、用户盲目签名和Web3签名信任模型的缺陷,诱骗用户签署恶意消息或交易,从而导致资产被盗。文章强调用户常在不知情的情况下签署不透明的十六进制数据,并呼吁钱包提供商改进用户界面和签名流程,以提升安全性。
2026 年 3 月 2 日
这是一个熟悉的时刻。你正在与一个 dApp 交互,一切看起来都很顺利,突然 MetaMask 弹出一个签名提示,里面充满了十六进制 blob。你点击了“签署”,因为你一直都是这么做的,对吗?
除了这一次,你刚刚授权了一个骗子耗尽你的资产。
欢迎来到钱包欺骗的世界,这种骗局本身并没有破坏钱包,而是劫持了用户与钱包交互的方式。它不依赖于复杂的重入攻击或自定义操作码。相反,它利用了仓促的用户体验、不知情的同意以及 Web3 中围绕签名的严重缺陷信任模型。
我们喜欢相信 Web3 用户是赋能的。伴随着巨大的责任、自我托管、签名和链上交互,会带来巨大的控制权。但实际上,我们给了用户极其锋利的工具,却几乎没有任何防护措施。钱包欺骗攻击是这种矛盾的后果。
如果你曾经在 MetaMask、Rabby 或任何 Web3 钱包中签署过一条消息,但没有完全理解你签署的内容,你并非孤单。如果攻击者当时欺骗了前端或制作了恶意的签名负载,你的资产将面临风险。
这并非理论。这每天都在发生。
欺骗,最简单的形式,就是 欺诈。在钱包的语境中,它指的是诱骗用户签署他们不打算授权的消息或交易。这不是智能合约的 bug 或协议层面的漏洞。它是社交工程和用户界面操纵,植根于 dApp 的设计和钱包提供商的盲点。
诈骗者通常会创建模仿合法应用程序的界面,或者通过受损的前端或恶意浏览器扩展将恶意提示注入到真实的 dApp 中。随之而来的钱包提示看起来与任何其他提示一样。但是签名负载呢?它绝非如此。
一个常见的技巧是使用 eth_sign 和精心制作的数据。用户可能认为他们正在登录服务或验证身份。实际上,他们正在签署一条消息,该消息授予恶意合约广泛的,有时是无限的权限。这些权限以后可能用于执行代币批准、耗尽 NFT 或通过中继元交易发起资产交换。
这里更深层的问题不仅仅是骗局,而是促成骗局的体验。钱包提示通常会呈现不透明的十六进制字符串、原始 calldata 或编码的 EIP-712 结构,而没有任何有意义的解释。对于普通用户来说,这些是无法理解的。对于经验丰富的用户来说,它们只是烦人的。在这两种情况下,用户都被条件反射地点击“签署”以继续他们的任务。
在传统金融中,你不能根据一条神秘的消息授权电汇。但在 Web3 中,你可以一键签署你拥有的一切,而且永远不会出现上下文警告。
这种认知捷径正是攻击者利用的。
即使是支持通过 EIP-712 显示人类可读消息的钱包,当 dApp 有意模糊消息内容,或者更糟的是,当用户习惯于忽略长签名中的细节时,也可能出现问题。我们创造了一种无摩擦交互的文化,讽刺的是,这让用户更容易受到基于签名的骗局的影响。
当 MetaMask 或其他钱包显示签名提示时,特别是使用 eth_sign 甚至 EIP-712 的提示时,用户会看到一串十六进制编码的数据。有时它是结构化的且半可读的。但更多时候,它是一个密集、陌生的字符字符串,普通人无法解读。恶意消息可以轻易地说“授权登录 ExampleDAO”,同时授予中继合约完全访问权限,该合约可以移动代币、交换资产或与金库交互。用户不会阅读细则。在大多数情况下,他们甚至不明白有细则。
2022 年,模仿 OpenSea 等 NFT 市场的网络钓鱼网站利用 eth_sign 诱使用户签署恶意消息。负载被巧妙地制作成看起来像登录挑战,但实际上是授权转让有价值 NFT 的订单。
到 2023 年初,类似的策略已演变为通过盲签名进行的更复杂的欺骗。一个备受瞩目的案例涉及一个知名代币的虚假空投网站。用户被要求“领取奖励”,并收到了一个看起来像标准申领的签名请求。他们签署的是一个元交易负载,该负载授予攻击者完全批准在后台花费代币。转账在几分钟后通过中继合约执行,并且造成的损失是不可逆转的。
核心漏洞不是 Solidity 中的 bug 或未检查的外部调用。这个问题的核心在于 Web3 签名用户体验中的一个基本缺陷。当前的模式假设用户理解他们正在签署什么。但这个假设是错误的。实际上,用户层面的验证几乎为零。钱包很少对签名做什么进行上下文化,更少提供有意义的警告或强制执行操作限制。
盲签名在整个生态系统中仍然很常见。有些钱包甚至不解析结构化数据,除非明确要求。其他钱包显示最少的警告或不提供检查工具。一旦签署,通常没有原始意图的记录,只有存储在链下日志中的原始字符串。
而且不仅仅是 eth_sign。即使是善意的 EIP-712 消息也可能适得其反。如果消息 schema 太冗长,用户会跳过阅读。如果它太抽象,它将毫无意义。如果用户界面不将其转换为人类可读的内容,那它就完全失去了意义。
当骗子比钱包提供商更了解这一点时,游戏从一开始就不公平。
为了解决这个问题,我们需要重新思考用户如何与签名交互。这意味着要摆脱盲签名,并采用更好的用户界面提示来应对风险。
钱包应该:
除此之外,我们还需要更好地标准化 dApp 请求签名的方式。开发者应该遵守更严格的规范,库应该引导他们走向更透明的用户流程。太多的 dApp 使用 eth_sign,而结构化的 EIP-712 就能胜任,更糟糕的是,甚至根本不需要签名。
安全不仅仅是更好的工具;它关乎用户行为。我们需要改掉“签署即忘”的习惯,通过清晰性重建信任。这不是要求增加摩擦,而是要求有目的性。点击“签署”应该有分量,而不仅仅是肌肉记忆。随着链上复杂性的增长和 dApp 变得更强大,签名将承载更大的分量。L2、账户抽象、无 Gas 交易、元签名和委托权限都依赖于用户在签署时做出明智的决定。这使得签名用户体验不仅仅是一个便利问题,而是一个基础的安全层。
钱包欺骗是一个更深层设计缺陷的症状:Web3 要求用户采取不可逆转的行动,却没有给他们理解后果的工具。除非我们解决这个问题,否则再多的审计、再多的漏洞赏金、再多的保险政策都无济于事。
如果我们真的相信用户赋能,我们就需要像设计它一样去设计。
- 原文链接: blog.immunebytes.com/the...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!