返回论坛

新型钓鱼签名手法:Permit2 授权漏洞与多链资产保护的链上证据分析

Web3安全 区块链安全 钱包安全 链上风控 深度分析 数字签名 密码学 身份验证 安全认证 新型钓鱼签名手法:普通用户资产保护 近期信号 链上证据与风险判断 MatrixSecurity 区块链 安全

查找币安全研究院

钱包恢复评估 | 链上取证分析 | Web3 事件响应
以合法授权、证据保全、隐私保护和可复核流程为前提,不要求用户在线提交完整私钥或助记词。

查看研究院 研究报告中心
# 新型钓鱼签名手法:Permit2 授权漏洞与多链资产保护的链上证据分析 ## 一、主题背景:当签名不再是“确认”那么简单 2024年初,多个主流钱包用户报告在未主动授权的情况下,钱包内ERC20代币被批量转出。调查发现,攻击者利用的是Uniswap的Permit2合约——一个本应提升用户体验的签名授权标准,却成为新型钓鱼签名的核心载体。普通用户面对“签名确认”弹窗时,往往默认其安全,但Permit2钓鱼签名利用的是“离线授权”机制,无需链上交易即可完成授权,使得资产在用户毫无感知的情况下被转移。 **本文解决的问题**:帮助Web3用户、开发者和项目方识别Permit2钓鱼签名的技术原理、链上证据特征,并提供从预防到应急处理的全流程防护方案。 ## 二、核心机制:Permit2如何成为钓鱼签名的“完美猎物” ### 2.1 Permit2标准的技术边界 Permit2是Uniswap提出的ERC20授权改进方案,核心创新在于: - **离线签名授权**:用户通过签名(而非链上交易)授权合约转移代币 - **批量授权**:一次签名可授权多个代币或多个合约 - **时间限制**:支持设置授权有效期(如24小时) 技术边界:Permit2本身是合法且经过审计的标准,但其设计特性恰好为钓鱼签名提供了便利——攻击者只需要诱导用户签署一个看似无害的“签名”,即可获得用户代币的转移权限。 ### 2.2 钓鱼签名的本质变化 传统钓鱼签名需要用户签署链上交易(如approve),其风险在于用户可能签署了错误的合约地址。而Permit2钓鱼签名则完全不同: | 特征 | 传统approve钓鱼 | Permit2钓鱼 | |------|----------------|-------------| | 链上痕迹 | 有(需要gas) | 无(仅签名) | | 用户感知 | 需确认交易 | 仅需签名确认 | | 攻击成本 | 需部署合约 | 可直接利用现有合约 | | 检测难度 | 较低 | 极高 | ### 2.3 核心漏洞点:签名内容可伪造 Permit2钓鱼签名的核心机制在于:攻击者构造一个看似合法的签名请求,诱导用户签署后,攻击者即可在任意时间、任意链上提交该签名,完成代币授权。 **关键概念**: - **EIP-2612**:允许离线签名的代币标准 - **Permit2域分离**:通过域名分离防止跨链重放 - **签名参数**:包括owner、spender、value、deadline、v、r、s 技术边界:Permit2签名本身具有“抗重放保护”,但攻击者可以通过构造不同的签名参数(如修改spender为攻击者合约)实现攻击。 ## 三、常见风险与真实案例类型 ### 3.1 钓鱼签名攻击类型 **类型一:伪装授权签名** 攻击者伪装成DApp请求用户签署“登录签名”或“投票签名”,实际内容是Permit2授权签名。用户签署后,攻击者获得用户所有代币的转移权限。 **类型二:批量授权伪造** 攻击者构造包含多个代币的批量授权签名,诱导用户一次性签署,从而获得多个资产的转移权限。 **类型三:跨链重放攻击** 虽然Permit2有域分离保护,但攻击者可以通过构造不同的链ID参数,实现跨链授权。 ### 3.2 真实案例链上证据分析 以2024年3月发生的某大型钓鱼事件为例,攻击者通过以下方式实施攻击: **攻击流程**: 1. 部署恶意合约0x1234...,伪装成流行的NFT交易平台 2. 通过社交媒体发送钓鱼链接,诱导用户“领取空投” 3. 用户点击后,钱包弹出签名确认框,显示“登录确认” 4. 实际签名内容为Permit2授权,spender为攻击者合约 5. 攻击者提交签名,获得用户USDC的转移权限 6. 立即将用户USDC转移至攻击者地址 **链上证据特征**: - 签名提交交易中,calldata包含完整的Permit2签名参数 - 签名提交交易通常来自新创建地址(非合约) - 攻击者地址在短时间内发起大量签名提交交易 - 签名提交交易gas较低(仅需执行签名验证) ### 3.3 成因分析 **技术成因**: - 钱包对签名内容解析不透明:用户无法直观看到签名具体授权了什么 - 签名确认界面缺乏标准化:不同钱包对签名内容的展示方式差异巨大 - 缺少签名风险评分机制:无法提前识别高风险签名内容 **用户成因**: - 对“签名”和“交易”的区别认知不足 - 习惯性点击确认,未仔细检查签名内容 - 缺乏对签署对象(域名、合约地址)的验证习惯 ## 四、检查清单:不同角色的防护措施 ### 4.1 普通用户检查清单 **签署前检查**: - [ ] 检查签名请求的来源域名是否与DApp一致 - [ ] 使用“模拟签名”功能(如Rabby Wallet的“签名预览”) - [ ] 确认签名内容中的spender地址是否为已知合约 - [ ] 检查授权的代币数量和类型是否合理 - [ ] 查看签名的有效期,警惕永久授权 **日常防护**: - [ ] 定期使用Etherscan或Revoke.cash检查授权列表 - [ ] 为不同用途创建独立钱包(如交易钱包、持有钱包) - [ ] 使用硬件钱包签署重要签名 - [ ] 安装安全插件(如Wallet Guard、Blockaid) ### 4.2 开发者检查清单 **智能合约开发**: - [ ] 实现签名验证时,使用OpenZeppelin的EIP712标准 - [ ] 添加签名有效期检查,限制授权时间 - [ ] 实现签名撤销机制(如Permit2的nonce管理) - [ ] 对签名参数进行完整性校验 **前端开发**: - [ ] 清晰展示签名内容,使用人类可读格式 - [ ] 在签名请求中标注风险等级 - [ ] 实现签名前模拟执行功能 ### 4.3 项目方检查清单 **安全审计**: - [ ] 审计中增加Permit2签名验证测试用例 - [ ] 检查是否有未授权的Permit2签名提交漏洞 - [ ] 测试签名参数篡改攻击 **用户教育**: - [ ] 在官方文档中解释签名授权机制 - [ ] 添加安全提示弹窗 - [ ] 定期发布安全公告 ## 五、可落地的监控与应急流程 ### 5.1 链上监控方案 **监控指标**: 1. **签名提交频率异常**:检测同一地址在短时间内提交大量Permit2签名 2. **新地址签名提交**:检测新创建地址提交的签名交易 3. **签名内容异常**:检测spender地址为已知恶意合约的签名提交 4. **跨链签名提交**:检测同一签名在不同链上的重复提交 **工具推荐**: - **Dune Analytics**:创建自定义查询监控Permit2签名提交 - **Forta Network**:部署检测机器人监控签名异常 - **Chainalysis**:链上分析工具追踪恶意地址 ### 5.2 应急响应流程 **用户发现资产被盗**: 1. 立即停止所有签名操作,断开钱包连接 2. 使用Revoke.cash或Etherscan撤销所有授权 3. 转移剩余资产到新生成的钱包地址 4. 记录攻击者地址和交易哈希,向安全团队报告 **开发者在合约中发现漏洞**: 1. 暂停合约功能,防止进一步损失 2. 分析漏洞原因,修复签名验证逻辑 3. 部署新合约,迁移用户资产 4. 发布安全公告,告知用户应对措施 ### 5.3 审计检查新增项 在智能合约审计中,应增加以下检查项: | 检查项 | 描述 | 风险等级 | |--------|------|----------| | Permit2签名验证 | 检查签名验证逻辑是否完整 | 高 | | 签名参数校验 | 检查是否对spender、value等参数进行校验 | 高 | | 签名有效期检查 | 检查是否设置了合理的签名有效期 | 中 | | 签名撤销机制 | 检查是否支持签名撤销 | 中 | | 跨链保护 | 检查是否有跨链重放保护 | 高 | ## 六、后续趋势与治理建议 ### 6.1 技术趋势 - **EIP-712改进**:社区正在讨论改进签名显示的标准化方案 - **AI辅助检测**:利用机器学习模型自动识别钓鱼签名模式 - **账户抽象**:ERC-4337等账户抽象方案可能从根本上改变签名机制 ### 6.2 治理建议 **行业层面**: - 推动钱包签名确认界面的标准化 - 建立钓鱼签名数据库,供安全工具调用 - 完善Permit2签名审计标准 **个人层面**: - 养成“签名即交易”的安全意识 - 使用多签钱包管理大额资产 - 定期参加安全培训,了解新型攻击手法 ### 6.3 延伸阅读方向 1. **Permit2白皮书**:理解标准设计细节 2. **EIP-2612和EIP-712**:掌握离线签名标准 3. **OpenZeppelin的EIP712实现**:学习正确的签名验证实现 4. **Web3安全攻防案例**:了解最新钓鱼手法 5. **钱包安全最佳实践**:提升个人防护能力 ## 行动建议 **立即执行**: 1. 使用Revoke.cash检查并撤销不必要的授权 2. 为不同用途创建独立钱包 3. 安装安全插件(Wallet Guard、Blockaid) 4. 设置钱包签名确认延时(如MetaMask的“高级确认”) **长期规划**: 1. 定期参加Web3安全培训 2. 关注安全团队(如SlowMist、PeckShield)的公告 3. 参与社区安全审计项目 4. 建立个人资产安全审计清单 **开发者行动**: 1. 在项目中集成签名风险评分系统 2. 实现签名前模拟执行功能 3. 添加用户教育模块 4. 参与安全审计标准制定 面对日益复杂的钓鱼签名攻击,没有“一劳永逸”的解决方案。只有通过技术防护、用户教育和行业协作的多管齐下,才能有效保护Web3资产安全。记住:**每次签名都是一次交易,每次确认都是一次授权**。
在论坛中查看和回复