返回论坛

链下签名暗藏杀机:深度解析 Permit 签名钓鱼攻击原理

查找币 学术研究 安全研究 Web3安全 区块链安全

查找币安全研究院

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

查看研究院 研究报告中心
## 背景 2023年5月11日,推特用户"pineapple.eth"公开披露了一起因误点钓鱼网站(syncswap[.]network)导致钱包被盗的事件,损失超过100美元。虽然金额不大,但这起事件揭示了一种隐蔽性极高的链下签名钓鱼攻击手法——攻击者利用用户对`permit`签名机制的不熟悉,在用户“看不见”签名风险的情况下,轻松盗走资产。 本文将深入剖析该攻击的技术原理,揭示`permit`函数如何被恶意利用,并提供专业防范建议。 ## 攻击过程还原 根据受害者的链上交易记录,两笔关键交易如下: - **交易1**:`0xc65093b52fcf395f23fb7195a6fd5758b9a3eb1ccd0e3572754690d3a2a2c27c` - **交易2**:`0xf4a288d6a5400d0fcfd06f052804ae7d40c05f623401bc003c162d67a08a22cb` 核心发现:合约调用者地址(`0x00002…d0000`)通过调用`transferFrom`函数,将受害者地址(`0xA4089…82C3`)上的34.87 USDC转移到`0x8256…D6B8`,将81.36 USDC转移到`0x5A69…1C17`。 `transferFrom`函数的本质是允许第三方将指定地址的代币转移到另一地址。但关键在于,受害者从未主动发起过任何授权交易(`approve`)。那么黑客是如何获得转账权限的呢? 深入分析发现,在受害者交易记录中,存在一笔未上链的`permit`操作。这正是攻击的核心。 ## Permit 机制深度解析 ### 什么是 Permit? `permit`函数由EIP-2612引入,是对传统ERC20授权机制的重大改进。传统ERC20中,用户必须发送链上交易调用`approve`函数来授权代币。而`permit`允许用户在链下签署授权消息,任何第三方都可以提交此签名上链,完成授权操作。 **核心差异对比:** | 特性 | `approve` | `permit` | |------|-----------|----------| | 调用者 | 必须是资产所有者(`msg.sender`) | 可以是任何地址 | | 签名方式 | 链上交易签名 | 链下消息签名 | | Gas消耗 | 由所有者承担 | 由提交者承担 | | 灵活性 | 需主动发起交易 | 可离线授权 | ### Permit 函数参数解析 `permit`函数签名如下: ```solidity function permit( address owner, // 被授权地址(资产所有者) address spender, // 授权给谁(黑客地址) uint256 value, // 授权代币数量 uint256 deadline, // 授权有效期时间戳 uint8 v, // 签名数据 bytes32 r, // 签名数据 bytes32 s // 签名数据 ) external; ``` **关键发现:** 在此次攻击中,`deadline`参数值为`1714509304969`,对应格林威治时间56300年8月22日,几乎是无限期授权。`value`值为`116239404`,即116.239404 USDC,与受害者被盗金额完全一致。 ## 攻击技术流程 1. **钓鱼诱导签名**:受害者访问钓鱼网站(syncswap[.]network),网站伪装成合法DApp,诱导用户签署`permit`消息(链下签名,无需Gas)。 2. **签名数据提取**:钓鱼网站获取用户签名的`v`、`r`、`s`值,这些数据包含授权信息。 3. **链上提交Permit**:黑客使用获取的签名数据,调用`permit`函数提交上链,完成授权操作。此过程Gas由黑客支付。 4. **资产转移**:授权生效后,黑客调用`transferFrom`函数,将受害者代币转移至自己控制的地址。 **技术要点:** - 链下签名不产生链上交易记录,用户难以察觉 - `permit`函数验证签名有效性时,会检查`owner`地址、`nonce`、`deadline`等参数 - 一旦签名验证通过,授权立即生效,无需用户再次确认 ## 风险扩展与现状 截至本文发布,以太坊主网上已有近67万个地址通过Permit2(Uniswap推出的增强版授权标准)进行过授权。这意味着大量用户面临潜在的链下签名钓鱼风险。 **攻击变种:** - **Permit2钓鱼**:利用Permit2的批量授权功能,一次性窃取多种代币 - **跨链签名钓鱼**:将签名用于不同链上的合约 - **伪装合法DApp**:盗用知名项目UI,诱导用户签署恶意签名 ## 安全防护建议 作为Web3安全团队,查找币建议用户采取以下措施: ### 1. 签名前必查清单 - **检查签名内容**:使用钱包的“签名预览”功能,确认签名参数(`spender`地址、`value`数量、`deadline`) - **识别钓鱼网站**:核实域名、SSL证书、项目官方社交媒体信息 - **使用安全工具**:安装MetaMask等钱包的安全插件,自动检测恶意签名 ### 2. 授权管理 - **定期检查授权**:使用授权管理工具如[RevokeCash](https://revoke.cash)查看异常授权 - **针对Permit2**:可使用专门工具如[ScamSniffer Permit2 Manager](https://app.scamsniffer.io/permit2)进行管理 - **最小化授权**:仅授权所需最小数量,设置合理`deadline` ### 3. 安全习惯 - **不随意签名**:对任何要求签名的操作保持警惕,尤其是来自不明网站的 - **使用硬件钱包**:硬件钱包可提供更安全的签名环境 - **了解签名类型**:区分`eth_sign`、`personal_sign`、`typed_sign`等不同签名方式的风险 ### 4. 应急处理 - **发现异常授权**:立即取消授权(使用`approve`设置为0) - **监控钱包活动**:使用钱包监控工具,及时发现未授权的`permit`调用 - **资产隔离**:将大额资产与日常交互地址分离 ## 总结 本文以实际钓鱼案例为切入点,深入分析了`permit`链下签名机制的安全风险。攻击者通过诱导用户签署链下签名,在不产生任何链上交易记录的情况下完成授权,进而盗取资产。这种攻击方式隐蔽性强、技术门槛低,已成为当前Web3生态中最常见的钓鱼手段之一。 查找币安全团队提醒用户:**签名即授权,链下签名同样具有法律效力**。在与任何DApp交互时,务必检查签名内容,控制授权数量,并定期管理授权。更多安全知识可查阅查找币出品的《区块链黑暗森林自救手册》([GitHub链接](https://github.com/查找币/Blockchain-dark-forest-selfguard-handbook/blob/main/README_CN.md))。 --- **参考链接:** - [EIP-2612: Permit Extension](https://eips.ethereum.org/EIPS/eip-2612) - [Uniswap Permit2 文档](https://docs.uniswap.org/contracts/v2/reference/smart-contracts/permit2) --- 本文由查找币安全团队整理发布
在论坛中查看和回复