文章详细介绍了Optimism协议中的一个关键漏洞,该漏洞使攻击者能够通过自毁合约(selfdestruct)无限制地复制OETH(Optimism的ETH表示)。作者讨论了漏洞的原因、影响及其修复过程,强调了安全意识在区块链项目中的重要性。文章结构清晰,包括对L2解决方案的简介、漏洞分析及修复等内容,适合对区块链技术感兴趣的读者。
在2月2日,白帽黑客Jay Freeman(Saurik,以开发Cydia而闻名)报告了Optimism协议中的一个关键漏洞。Optimism是一种以太坊的二层(L2)扩展解决方案。这个漏洞本身允许攻击者利用在OVM 2.0中发现的漏洞,在任何链上持续复制资金。
为了这一披露,该项目支付了在Immunefi的Optimism漏洞悬赏页面上列出的全额危急金额:$2,000,042!
OVM相当于以太坊虚拟机(EVM)规范。这意味着Optimism与以太坊几乎相同,共享相同的账户和状态结构。换句话说,所有操作在Optimism和以太坊上都以相同的方式工作,只有一些小的例外。
这个漏洞是在EVM执行逻辑的一部分实现中发现的,即一个操作码,它允许潜在攻击者打印无限数量的OETH。这个OETH随后可以用来清空DEX并从Optimism桥接资产到以太坊,允许黑客窃取大量资金。在提交时,Optimism的TVL为322.5万美元,存在潜在风险。
金融影响显然是关键的——因此Optimism进行了全额支付。团队在收到报告后迅速发布了修复程序,并负责任地将漏洞披露给所有分叉的Optimism,包括Immunefi上的Metis。
这个漏洞相当复杂,理解起来很难,漏洞被利用的可能性较低。但是,如果在Saurik负责任地披露漏洞之前,有人发现了这个漏洞,影响将是巨大的。
这就是为什么对项目和协议拥有安全导向的思维方式是重要的。即使经过审计的代码也可能存在漏洞。漏洞悬赏程序是防止黑客活动的最后一道防线,通过提供丰厚的悬赏来鼓励他们负责地披露漏洞,而不是利用它们。
为了更好地理解这个漏洞,以及它为何可被利用,我们首先需要解释什么是L2以及OVM 2.0。
当前版本的以太坊具有低交易吞吐量和高延迟。这意味着交易很慢,并且由于需求高,相对网络可以在任何给定时间承载的负载而变得昂贵。
针对上述问题提出了两种类型的扩展解决方案:
链上(On-chain)扩展是指对区块链进行的任何直接修改,如数据分片和以太坊2.0即将推出的执行分片。
链下(Off-chain)扩展是指在区块链之外的任何创新,即交易字节码的执行在外部发生,而不是在以太坊上。这些解决方案被称为L2,因为二层(Layer 2)在一层(Layer 1)(以太坊)之上工作,以优化和加速处理。Optimism是一个众所周知的L2扩展解决方案示例。
我们决定不在以太坊上执行和存储所有数据,而是仅存储L2状态的一个摘要在以太坊上。这意味着所有实际的计算和合同及数据的存储都是在L2上完成的。通过这种方式,rollups可以继承以太坊的安全保证,同时仍然充当有效的扩展解决方案。
乐观 Rollup(Optimistic rollups)将链下交易批量(roll)在一起,但不包含额外的证明以保证其有效性。这些汇总“乐观”地假设所有交易都是有效的。当L2状态的断言被发布到链上时,汇总的验证者可以在他们认为有人发布了不正确或恶意状态时挑战该断言。这称为“欺诈检测”。该系统的安全性依赖于验证者在发布其状态时进行担保,如果挑战者能够证明状态不正确,则这笔担保将被没收。
Optimism是基于乐观 Rollup概念的扩展解决方案,这意味着它在以太坊上存储所有L2交易的摘要。Optimism依赖于“故障证明(fault proofs)”,这是一种检测被验证交易是否不正确的方法。Optimism使用OVM 2.0来处理故障证明。
在深入了解OVM 2.0之前,重要的是要理解执行和证明之间的区别。
执行意味着通过在虚拟机中运行交易来推进区块链的状态。EVM具有基于栈的架构。我们可以通过使用操作码,如ADD, SSTORE, MLOAD
等来控制堆栈。当智能合约接收到消息时,其EVM字节码会被运行,从而允许它们更新其状态或甚至向其他合约发送进一步的消息。
“证明(Proving)”只是说服L1合约所产生状态正确的行为。一些基于EVM L1的系统依赖于在L1上重新执行争议的代码段并比较结果。
Optimism对此的处理不同于其他L2扩展解决方案。在这里,执行和证明是一起进行的。
如果Alice和Bob之间存在争议,相关的交易将在L1链上重新执行(重放)。但是,这引入了一些潜在问题,因为我们不能依赖某些操作码在L1链和L2链上返回相同的值。例如,BLOCKNUMBER
之类的某些值不会生成相同的值,因为它们依赖于区块链元数据或证明时的信息(而不是执行时的信息)。
解决方案是引入一种机制,以在L1验证时保留在L2上争议交易的上下文。Optimism虚拟机(OVM 2.0)用OVM对应项替换了所有依赖于上下文的操作码,如ovmBLOCKNUMBER
。
正如我们所知,Optimism创建OVM 2.0以实现与以太坊的EVM等效。在这方面,在Optimism上执行交易类似于在以太坊上执行交易:Optimism加载状态,将交易应用于该状态,并记录状态变化。数据交易层为每个新块建立索引,并重复此过程。
OVM 1.0决定将ETH作为ERC-20代币而存储。这为Optimism造成了一些问题,因为网络需要支持在以太坊上运行的所有内容,但由于此问题受到了影响,如Gas代币。当OVM 2.0推出时,OVM 2.0停止支持这一特性,但仍然在ERC-20合约的存储状态中存储用户账户的所有余额。Optimism修改了Geth,这是以太坊协议的原始三个实现之一,以对StateDB
进行补丁,以在ERC-20代币存储状态中存储本地余额。
这意味着ETH仍然在地址0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000
内部作为ERC-20代币表示。该合约也被称为OVM_ETH
。因此,用户余额在状态树中将始终为零(这是以太坊存储余额的地方),而用户的实际余额将存储在前述代币的存储中。
UsingOVM
标志设置为USING_OVM
环境变量。当该标志被激活时,对StateDB
的影响账户余额的操作将从基础stateObject
(表示单个账户)重定向到OVM_ETH
合约中的存储状态。
如果你想深入了解Optimism在底层是如何工作的,请参考Optimism的官方文档。该概述还解释了区块生成和交易的工作原理。这值得一读!
在详细了解漏洞之前,我们需要理解最后一件事情:SELFDESTRUCT
操作码。
此命令使合约自毁,删除其账户对象。此命令的主要优势在于,它允许轻松地从区块链的活动集中删除大量的“过时”状态。
selfdestruct(address)
方法,之前名为suicide(address)
,会销毁调用合约地址的所有字节码并将持有的所有以太转移到目标地址。如果目标地址也是合同,则不会调用任何功能(包括回退)。
这里需要注意的是,合约(对象)在交易的结束时被销毁,这意味着在调用selfdestruct
函数后,我们仍然可以对该合约执行操作,仅在确实在同一交易中。
在执行selfdestruct
后,存储在该地址剩余的以太将发送到指定的目标,然后状态中的存储和代码将从状态中删除。以上所有内容都由Optimism客户端处理,这是Geth的一个分叉。在Optimism Geth实现中,我们可以找到一段代码导致了整个漏洞。
问题在于在执行selfdestruct
后将账户的余额设置为0。
stateObject.data.Balance = new(big.Int)
问题在于Optimism客户端直接在stateObject
上将余额设置为零,而不是检查UsingOVM
并将余额修改重定向到OVM_ETH
合约!
由于此漏洞,当合约被selfdestruct
时,它将调用合约的余额转移到目标地址以及仍保持原始余额。我们在修改stateObject
的余额,而不更新ERC20代币存储状态(OVM_ETH
合约)中的本地余额。
攻击者可以利用该漏洞通过反复执行selfdestruct
使持有以太的合约的余额膨胀。经过多次迭代后,攻击者可以“兑现”膨胀的以太余额,从而凭空创造资金。
以下是此操作的逐步指南:
selfdestruct
的函数,另一个是将合约余额转移给调用者的函数。包含selfdestruct
的函数将合约的余额发送到其自身。由于Optimism的Geth实现中的漏洞,这将导致余额的膨胀。selfdestruct
函数。我们强烈建议阅读Saurik的博客文章,他详细探讨了他发现漏洞的过程,并深入分析了Optimism的漏洞历史。他还展示了这个漏洞的一个利用案例。
Optimism在以下Github PR中修复了该漏洞。要理解此修复的理由以及为何采用这种特定的方法进行实施,请参考Saurik的博客文章。
我们感谢Saurik所做出的出色工作,并负责任地披露了如此重要的漏洞。也要感谢Optimism团队迅速响应报告并修补漏洞所做的出色工作。
如果你想开始寻找漏洞,我们为你提供帮助。请查看Web3安全库,并开始在Immunefi上获得奖励——这是web3领先的漏洞悬赏平台,拥有世界上最大的悬赏。
如果你对自己的技能很有信心,并想看看自己是否能找到geohot本人编写的代码中的漏洞,请查看Optimism的新漏洞悬赏计划。
- 原文链接: medium.com/immunefi/opti...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!