返回文章库

项目方上线前的钓鱼签名自查指南:新型Permit2授权攻击的链上证据与风险排查流程

Web3安全 区块链安全 钱包安全 链上风控 深度分析 数字签名 密码学 身份验证 安全认证 新型钓鱼签名手法:项目方上线前自查 近期信号 链上证据与风险判断 MatrixSecurity 区块链 安全
项目方上线前的钓鱼签名自查指南:新型Permit2授权攻击的链上证据与风险排查流程

查找币安全研究院

链上取证分析 | Web3 风险核验 | Web3 事件响应
以合法授权、证据保全、隐私保护和可复核流程为前提,不要求用户在线提交敏感凭证或非公开材料。

查看研究院 研究报告中心
# 项目方上线前的钓鱼签名自查指南:新型Permit2授权攻击的链上证据与风险排查流程 ## 一、背景与痛点:为什么上线前必须排查钓鱼签名风险 在2024年以来的Web3安全事件中,基于Permit2、EIP-2612、DaiPermit等离线授权机制的钓鱼签名攻击占比显著上升。与传统的“交易签名”不同,钓鱼签名攻击利用用户对“签名不等于转账”的认知盲区,通过伪造前端或诱导用户签署看似无害的离线消息,实现后续的任意代币转移。对于项目方而言,上线前未排查此类风险可能导致: - 合约上线即被复用钓鱼签名模块攻击 - 用户因授权签名被窃取代币后归责于项目方 - 链上监控系统无法区分正常授权与恶意授权 本文聚焦项目方在代币合约、DApp前端、授权合约部署前的自查流程,结合链上证据分析新型钓鱼签名手法的技术边界,并提供可落地的检查清单。 ## 二、核心机制:Permit2钓鱼签名的技术边界 ### 2.1 离线授权机制原理 Permit2是Uniswap推出的标准化代币授权合约,允许用户通过离线签名(而非链上交易)完成授权。其核心流程为: ``` 用户签署离线消息(包含spender地址、amount、deadline等参数) → 第三方合约调用permit()函数提交签名 → Permit2合约验证签名有效性后更新授权额度 ``` 关键风险点在于:签名消息本身不触发任何资产转移,但一旦被恶意合约提交,即可获得用户代币的转移权限。 ### 2.2 钓鱼签名与常规授权的区别 | 维度 | 常规授权(approve) | 钓鱼签名(Permit2) | |------|---------------------|---------------------| | 触发方式 | 链上交易 | 离线签名+链上调用 | | 用户感知 | 明确弹出授权界面 | 可能隐藏于“登录”“验证”等操作 | | 授权对象 | 单一合约地址 | 可通过签名参数指定任意spender | | 时效性 | 永久有效(除非手动撤销) | 可设置deadline,但用户常忽略 | | 链上证据 | 明确的approve交易 | 仅显示permit调用,无用户签名记录 | ### 2.3 新型变种:嵌套签名与批量授权 近期出现的攻击手法包括: - **嵌套Permit签名**:将Permit2签名作为参数嵌入另一个合约调用,用户签署的看似是普通交易,实则包含离线授权 - **批量签名授权**:通过`permitBatch`函数一次签署多个代币的授权,用户难以逐项审查 - **跨链Permit**:利用LayerZero等跨链桥,将签名提交到不同链上的Permit2合约 ## 三、真实案例类型与链上证据分析 ### 3.1 案例类型一:伪造前端钓鱼 **手法**:攻击者部署与知名DApp界面一致的前端,引导用户签署“领取空投”或“验证身份”的签名消息。该签名实际为Permit2授权,授权对象为攻击者控制的合约。 **链上证据**: - 目标代币的Permit2合约中出现异常的`spender`地址(非项目方白名单地址) - 攻击合约调用`permit()`的时间点与用户访问钓鱼网站的时间吻合 - 被授权代币在短时间内被批量转移 **风险判断**:若项目方未将Permit2合约地址列入白名单,或未限制`spender`参数范围,攻击者可任意指定授权对象。 ### 3.2 案例类型二:合约漏洞利用 **手法**:项目方合约中存在未验证的`permit`调用接口,攻击者通过构造恶意参数,诱导用户签署授权签名后,利用合约漏洞提交该签名。 **链上证据**: - 合约中存在`_permit(address token, address spender, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s)`等未限制参数的外部函数 - 攻击者通过该函数传入任意`spender`地址 - 被授权代币被转移至攻击者地址 **风险判断**:项目方需检查所有外部函数,确保`permit`调用中的`spender`参数被硬编码或限制在白名单内。 ### 3.3 案例类型三:跨链签名复用 **手法**:用户在A链签署了Permit2授权签名,攻击者通过跨链桥将该签名提交到B链的Permit2合约(若两链的Permit2合约地址相同且链ID验证缺失)。 **链上证据**: - 同一签名在两条链上均出现`permit`调用 - 链ID(chainId)参数在签名消息中缺失或未验证 - 攻击者利用不同链上的代币价格差异进行套利 ## 四、项目方、开发者和用户的检查清单 ### 4.1 项目方上线前自查清单 | 检查项 | 具体操作 | 风险等级 | |--------|----------|----------| | 代币合约是否支持Permit/EIP-2612 | 检查`permit`函数是否存在,确认参数是否可被外部调用 | 高 | | Permit2合约地址是否列入白名单 | 确认合约中`spender`参数是否被限制为已知地址 | 高 | | 签名消息是否包含链ID | 检查`domainSeparator`中是否包含`chainId` | 中 | | 签名deadline是否设置合理上限 | 确认`deadline`参数未被设为0或无限期 | 中 | | 批量授权函数是否存在 | 检查`permitBatch`或类似函数,确认参数验证逻辑 | 高 | | 前端是否展示完整签名内容 | 确认用户签署前可查看签名消息的完整JSON | 低 | | 是否部署了撤销授权合约 | 提供用户一键撤销所有授权的功能 | 低 | ### 4.2 开发者安全编码指南 1. **硬编码授权对象**:在合约中固定`spender`地址,而非从外部传入 2. **限制deadline范围**:设置`deadline`最大值为24小时,避免永久授权 3. **验证链ID**:在签名验证逻辑中强制要求`chainId`与当前链一致 4. **使用EIP-712结构化签名**:确保签名消息包含`domainSeparator`和`message`的完整结构 5. **实现签名撤销机制**:提供`nonce`递增或`permit`撤销函数 ### 4.3 普通用户安全操作清单 - 签署任何签名前,使用`eth_signTypedData_v4`检查签名内容 - 使用钱包的“模拟签名”功能查看签名实际效果 - 定期检查Permit2授权列表(如通过`revoke.cash`) - 对要求“签名验证身份”的操作保持警惕,尤其是非知名DApp - 使用硬件钱包时,确认签名内容与屏幕显示一致 ## 五、可落地的监控与防护流程 ### 5.1 链上监控系统配置 **监控指标**: - 目标代币Permit2合约的`permit`调用频率 - 新增`spender`地址的异常模式(如创建时间短、余额为0) - 同一签名在不同链上的提交记录 **告警规则**: - 单个地址在1小时内发起超过10次`permit`调用 - `spender`地址被标记为“钓鱼钱包”或“新创建地址” - 签名中的`deadline`设置为超过30天 ### 5.2 应急响应流程 1. **检测到异常授权**:立即暂停合约中所有依赖Permit2的功能 2. **分析签名内容**:提取被签名的`message`,确认`spender`和`amount` 3. **通知用户**:通过官方渠道发布安全公告,提供撤销授权链接 4. **部署补丁**:修复合约中未限制`spender`参数的外部函数 5. **追踪资金**:使用链上分析工具追踪被授权代币的流向 ### 5.3 审计检查要点 | 审计项 | 检查方法 | 通过标准 | |--------|----------|----------| | Permit函数参数验证 | 静态分析+模糊测试 | 所有外部参数被限制或硬编码 | | 签名重放保护 | 检查nonce机制 | 每个签名只能使用一次 | | 链ID验证 | 检查domainSeparator | 包含当前链的chainId | | deadline合理性 | 检查最大值设置 | 不超过24小时 | | 批量授权安全 | 检查permitBatch | 每个授权独立验证 | ## 六、后续趋势与治理建议 ### 6.1 技术趋势 - **ERC-7730**:正在讨论的标准化签名内容展示规范,要求钱包前端展示签名消息的可读版本 - **智能合约钱包**:通过账户抽象实现签名权限的细粒度控制,如限制单次签名金额 - **链上授权监控**:出现专门监控Permit2授权的链上服务,如`permit2.watch` ### 6.2 治理建议 - **行业标准**:推动EIP-712的强制实施,要求所有签名消息包含完整的`domainSeparator` - **钱包改进**:在签名界面增加“模拟授权”按钮,显示签名实际授权对象和金额 - **监管建议**:将钓鱼签名攻击纳入Web3安全事件报告框架,建立共享黑名单 ### 6.3 延伸阅读方向 1. Uniswap Permit2合约源码分析 2. EIP-2612与EIP-712的技术规范 3. 链上授权监控工具(revoke.cash、Etherscan的Token Approval Checker) 4. 跨链签名攻击案例分析 5. 账户抽象(ERC-4337)对签名安全的改进 --- **行动建议**: - 项目方:立即使用本文清单检查已上线合约,未上线项目在审计报告中增加Permit2安全专项 - 开发者:在合约开发中遵循“最小授权原则”,所有外部签名验证函数必须限制参数范围 - 用户:每周检查一次钱包授权列表,使用`revoke.cash`等工具清理不必要的授权 **最终提醒**:钓鱼签名攻击的本质是信息不对称——用户签署的“消息”与合约执行的“授权”之间存在认知鸿沟。项目方有责任通过技术手段缩小这一鸿沟,而非依赖用户的安全意识。
在文章库中查看和回复