5月28日 00:16
Web3 如何防止前端签名钓鱼攻击?
签名钓鱼攻击的本质
前端签名钓鱼攻击的核心是:攻击者不需要破解区块链本身,只需要操控用户看到的界面,诱导用户主动签署恶意交易。用户在钱包弹窗中点击"确认"的那一刻,攻击就完成了——因为链上无法区分"用户主动签名"和"用户被欺骗后签名"。
主流攻击类型分为三种:
- Permit 离线签名钓鱼:攻击者构造 ERC-20 Permit 消息,用户签名后无需 gas 费即可被授权转账。这是目前最猖獗的类型,Scam Sniffer 2024年报告显示 Permit 类钓鱼占所有签名钓鱼的 43%。
- Permit2 通用签名钓鱼:Uniswap 的 Permit2 合约允许一次性授权所有代币,攻击者利用此特性,一个签名即可清空钱包中所有已授权代币。
- 盲签名(eth_sign)钓鱼:攻击者构造任意哈希让用户签名,由于
eth_sign不显示签名内容,用户完全不知道签了什么。主流钱包已对eth_sign加入强风险警告。
前端为什么防不住
前端环境本质上是不可信的,原因有三:
- JavaScript 可被注入:任何 XSS 漏洞或供应链攻击都可以 Hook
window.ethereum,拦截签名请求并替换交易内容。攻击者注入一行代码即可将用户看到的"授权 1 USDT"替换为"授权所有 USDT"。 - 域名验证无实际意义:很多教程建议前端检查
window.location.hostname,但攻击者根本不需要在你的域名上运行——他们搭建your-app.xyz(而非your-app.com),用户根本注意不到区别。 - 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 确保第三方脚本未被篡改:
httpContent-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 的便利性也是其危险性。钱包端的交易模拟和风险扫描是当前最有效的拦截手段。