返回论坛

2000万OP代币被盗事件深度解析:交易重放攻击的技术原理

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

查找币安全研究院

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

查看研究院 研究报告中心
## 背景概述 2022年6月9日,Optimism与Wintermute联合发布公告,披露了一起涉及2000万枚OP代币的安全事件。Optimism委托Wintermute为其原生代币OP在二级市场提供流动性服务,并计划向Wintermute提供2000万枚OP代币作为流动性支持。Wintermute向Optimism提供了一个多签地址用于接收这批代币。在Optimism进行两笔测试交易并确认无误后,正式将2000万OP转移至该地址。 然而,当Optimism完成转账后,Wintermute却发现自己无法控制这些代币。原因在于:Wintermute提供的多签地址仅部署在以太坊主网上,尚未在Optimism网络上完成部署。Wintermute立即启动补救措施,但已有攻击者察觉此漏洞,抢在Wintermute之前将多签合约部署到Optimism网络上的该地址,成功控制了这2000万枚代币。 **核心问题:为什么会出现这种漏洞?** --- ## 技术深度分析:交易签名机制 ### EIP-155标准签名机制 要理解交易重放攻击,首先需要了解以太坊交易的签名标准。 根据[EIP-155](https://eips.ethereum.org/EIPS/eip-155)标准,交易签名需要对9个RLP编码元素进行哈希: - nonce(交易序号) - gasprice(燃料价格) - gas(燃料上限) - to(目标地址) - value(转账金额) - data(附加数据) - chainid(链ID) - 0(占位) - 0(占位) 其中**chainid**是关键参数。符合EIP-155标准的签名,其v值计算公式为: ``` v = {0, 1} + chainid * 2 + 35 ``` 而对于**不符合EIP-155标准**的签名,仅对6个元素进行哈希(nonce, gasprice, gas, to, value, data),其v值计算公式为: ``` v = {0, 1} + 27 ``` ### 链ID与签名唯一性 不同区块链具有不同的chainid: - 以太坊主网:chainid = 1 - Optimism:chainid = 10 - BSC:chainid = 56 根据ECDSA(椭圆曲线数字签名算法)原理,**v值不同**会导致签名还原出的公钥不同。因此,符合EIP-155标准的交易**无法**在其他链上成功重放——因为签名校验会因chainid不一致而失败。 ### EIP-2718新交易格式 以太坊伦敦升级实施的[EIP-2718](https://eips.ethereum.org/EIPS/eip-2718)引入了新的交易格式: ``` 0x02 || RLP([chain_id, nonce, max_priority_fee_per_gas, max_fee_per_gas, gas_limit, destination, amount, data, access_list, signature_y_parity, signature_r, signature_s]) ``` 在此格式中,chainid作为单独字段编码,不再包含在签名v值中。签名v值仅作为奇偶校验位,取值为0或1。这种设计进一步强化了链间交易的隔离性。 --- ## 交易重放攻击原理 ### 攻击条件 交易重放攻击的核心条件是:**签名v值为27或28**(即不符合EIP-155标准的交易)。这类交易可以在不同链上被成功重放,因为其签名不包含chainid信息。 ### 攻击流程 以Wintermute事件为例,攻击者重放了Gnosis Safe部署Factory合约的交易。具体操作步骤如下: #### 方法一:直接获取原始交易 1. 通过Etherscan获取目标交易(如Gnosis Safe Deployer 3的nonce=3交易)的原始数据 2. 直接调用Optimism网络的`eth_sendRawTransaction` RPC接口发送该原始交易 #### 方法二:重构交易数据 若无法直接获取原始交易内容,可通过以下步骤: 1. 调用`eth_getTransactionByHash` RPC接口获取交易详细内容 2. 对交易内容进行RLP编码,生成原始交易数据 3. 通过Optimism网络的`eth_sendRawTransaction` RPC接口发送 **关键点**:攻击者只需将原始交易数据在目标链上重新提交,无需任何签名操作——因为交易本身已经过签名验证。 ### 攻击成功原因 Wintermute事件中,攻击者成功的原因在于: 1. Gnosis Safe部署合约的交易使用了**不符合EIP-155标准**的签名(v=27或28) 2. 该交易在以太坊主网上的签名不包含chainid信息 3. 攻击者将同一笔交易在Optimism网络上重放,成功部署了多签合约 4. 由于Wintermute尚未在Optimism上部署该地址,攻击者抢占了控制权 --- ## 安全启示与防御建议 ### 对项目方的建议 1. **跨链部署必须验证**:在不同链上部署合约前,务必确认目标链上是否已存在相同地址的合约 2. **使用EIP-155标准签名**:所有跨链交易应使用符合EIP-155标准的签名,包含chainid信息 3. **部署与转账分离**:先完成合约部署,确认控制权后再进行资产转账 4. **监控异常交易**:部署监控系统,及时发现并阻止未授权的合约部署 ### 对开发者的建议 1. **理解交易重放风险**:在开发跨链应用时,必须考虑交易重放攻击的可能性 2. **使用链ID签名**:确保所有交易签名包含chainid,防止签名被跨链复用 3. **安全审计**:对涉及多签、跨链操作的合约进行专业安全审计 --- ## 技术总结 本次2000万OP代币被盗事件的核心原因可归纳为: | 关键要素 | 说明 | |---------|------| | **签名标准** | 使用了不符合EIP-155标准的签名(v=27/28) | | **跨链复用** | 同一笔交易可在不同链上重放 | | **部署滞后** | 合约部署与资产转账未同步 | | **攻击窗口** | 攻击者抢在Wintermute之前完成部署 | **根本原因**:交易签名缺乏链ID验证,导致签名可在不同链间复用。 --- ## 参考资料 - [EIP-155: Simple replay attack protection](https://eips.ethereum.org/EIPS/eip-155) - [EIP-2718: Typed Transaction Envelope](https://eips.ethereum.org/EIPS/eip-2718) - [ECDSA - Wikipedia](https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm) - [Go-Ethereum Transaction Signing](https://github.com/ethereum/go-ethereum/blob/master/core/types/transaction_signing.go) --- ## 往期安全研究回顾 - 查找币 AML 与 Go+ Security 达成合作,为反洗钱再增力量 - 查找币:NFT 项目 verb 钓鱼网站分析 - 查找币:29 枚 Moonbirds NFT 被盗事件溯源分析 - 智能合约安全审计入门篇 —— delegatecall (1) - 区块链黑暗森林自救手册官网&英文版正式发布 --- **本文由查找币安全团队整理发布** *查找币安全团队持续关注区块链安全领域,为用户提供专业的安全分析与防护建议。如需了解更多安全资讯,请访问查找币官网或关注我们的社交媒体平台。*
在论坛中查看和回复