5月28日 00:16

Web3 如何防止前端签名钓鱼攻击?

签名钓鱼攻击的本质

前端签名钓鱼攻击的核心是:攻击者不需要破解区块链本身,只需要操控用户看到的界面,诱导用户主动签署恶意交易。用户在钱包弹窗中点击"确认"的那一刻,攻击就完成了——因为链上无法区分"用户主动签名"和"用户被欺骗后签名"。

主流攻击类型分为三种:

  • Permit 离线签名钓鱼:攻击者构造 ERC-20 Permit 消息,用户签名后无需 gas 费即可被授权转账。这是目前最猖獗的类型,Scam Sniffer 2024年报告显示 Permit 类钓鱼占所有签名钓鱼的 43%。
  • Permit2 通用签名钓鱼:Uniswap 的 Permit2 合约允许一次性授权所有代币,攻击者利用此特性,一个签名即可清空钱包中所有已授权代币。
  • 盲签名(eth_sign)钓鱼:攻击者构造任意哈希让用户签名,由于 eth_sign 不显示签名内容,用户完全不知道签了什么。主流钱包已对 eth_sign 加入强风险警告。

前端为什么防不住

前端环境本质上是不可信的,原因有三:

  1. JavaScript 可被注入:任何 XSS 漏洞或供应链攻击都可以 Hook window.ethereum,拦截签名请求并替换交易内容。攻击者注入一行代码即可将用户看到的"授权 1 USDT"替换为"授权所有 USDT"。
  2. 域名验证无实际意义:很多教程建议前端检查 window.location.hostname,但攻击者根本不需要在你的域名上运行——他们搭建 your-app.xyz(而非 your-app.com),用户根本注意不到区别。
  3. IPFS 托管风险:dApp 前端常部署在 IPFS 上,如果 IPFS 网关或 DNS 被劫持,用户访问的可能是被篡改的前端代码,且无法验证内容完整性。

防御方案

钱包端:交易模拟与风险扫描

钱包是最后一道防线,也是唯一能在签名前拦截攻击的环节:

  • 交易模拟(Transaction Simulation):MetaMask、Rabby 等钱包在签名前模拟执行交易,展示资产变化预览。如果模拟结果显示"你将失去所有 USDT",用户可以直接拒绝。
  • 风险扫描插件:Scam Sniffer、Wallet Guard 等浏览器插件在签名弹窗出现时实时分析交易内容,标注风险等级。2025年数据显示,安装风险扫描插件的用户钓鱼损失降低 78%。
  • 禁用危险方法:imToken、OneKey 等钱包已默认禁用 eth_sign,或对 signTypedData 添加域名绑定校验。

合约端:限制授权粒度

合约设计层面可以缩小攻击面:

  • 使用 Permit2 替代传统 approve:Permit2 支持 nonce 和过期时间,避免无限授权。但要注意 Permit2 本身也是钓鱼目标,需配合钱包端扫描使用。
  • 时间锁与金额上限:对大额操作添加时间锁(如 24 小时延迟),或设置单次授权金额上限,即使签名被骗也限制损失范围。
  • EIP-1271 智能合约钱包:将签名验证逻辑放入合约,可实现多签、每日限额等策略,单次签名无法直接转账。

前端端:减少攻击面

前端能做的有限,但仍需落实基础防护:

  • CSP + SRI 双保险:通过 Content-Security-Policy 限制脚本来源,Subresource Integrity 确保第三方脚本未被篡改:
http
Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-abc123' https://trusted-cdn.com;
  • 实时监控前端完整性:部署后对前端文件计算哈希,定期或实时比对线上文件与构建产物是否一致,检测供应链攻击。
  • DNSSEC 防劫持:启用 DNSSEC 防止域名被劫持到恶意 IP,这是目前被忽视但高性价比的防护手段。

用户端:认知防线

技术方案再完善,用户点击"确认"的那一刻仍然是最脆弱的环节:

  • 域名核验习惯:收藏常用 dApp 地址,避免通过搜索引擎或社交媒体链接访问。2025年钓鱼攻击中,67% 通过 X(Twitter)仿冒评论引流。
  • 小额钱包隔离:日常交互使用资金量小的热钱包,大额资产存入硬件钱包或多签钱包,不参与链上交互。
  • 签名前阅读弹窗内容:钱包弹窗会显示签名类型和授权内容,花 10 秒钟阅读可避免 90% 的低级钓鱼。

真实攻击案例分析

案例:2024 年 Ledger Connect Kit 供应链攻击

攻击者通过 npm 供应链投毒,在 @ledgerhq/connect-kit 包中注入恶意代码。任何集成了该包的 dApp 前端自动加载恶意脚本,将用户的钱包连接重定向到攻击者地址。该攻击在 2 小时内影响了数百个 dApp,损失约 60 万美元。

教训:前端依赖的任何第三方包都是潜在攻击面。使用 SRI 锁定第三方脚本版本、定期审计依赖树、启用 npm provenance 验证,是降低供应链风险的关键措施。

案例:2025 年 Permit2 钓鱼集群

攻击者批量部署钓鱼网站,伪装成知名 NFT 项目的"免费铸造"页面。用户连接钱包后,页面触发 Permit2 签名请求,一次签名即可授权攻击者转走钱包中所有 ERC-20 代币。由于 Permit2 签名是离线的,链上无任何交易记录,用户往往在资产被转走后才发现。

教训:Permit2 的便利性也是其危险性。钱包端的交易模拟和风险扫描是当前最有效的拦截手段。

标签:Web3