以太坊遭到攻击而导致分叉事件的技术分析_以太坊:secretnetwork币总量

北京时间2021年8月27日20点50分左右,以太坊突然出现分叉。我们通过分析Geth的代码版本修改和这笔造成分叉的交易厘清了以太坊分叉的根本原因:Geth旧版本在处理预编译合约调用时,并未考虑特殊情况下参数值的处理,从而引发重叠拷贝,导致返回值异常。该漏洞已提交Geth官方,目前尚未披露细节,但攻击者已经利用漏洞实施了攻击。我们认为及时的分析和披露是必要的,也希望我们的分析能够为社区提供必要的理解和帮助。

攻击分析

运用我们的在线分析工具,可以看出:

欧易OKX更新以太坊合并升级处理方案,若以太坊分叉将按比例空投分叉币:9月14日消息,据欧易OKX公告显示,针对预计将在9月15日10:00完成以太坊合并计划,欧易预计为9月14日23:00(HKT)暂停ETH及其它ERC-20网络代币的充值、提现。若以太坊合并升级后未产生新代币,欧易将在确认以太坊主网稳定后开放ETH及其他代币的充值、提现及跨链桥相关业务;若以太坊升级产生新链,欧易将视采用PoS的以太坊网络代币为ETH,采用PoW的以太坊网络代币为分叉币。欧易将于以太坊完成升级时对用户的交易账户、资金账户、金融业务内ETH权益进行快照,按照1:1的比例空投分叉币给用户。此外,欧易将在以太坊完成合并升级前暂停ETH的资金划转操作,待快照结束后开启,预计暂停十分钟。

另外,如用户在以太坊分叉前,创建欧易Web3钱包并存入以太坊资产或导入已有以太坊资产的钱包,在以太坊分叉后,获得ETHW分叉资产地址,还将额外获得等额 10,000 次OKC 交易Gas的OKT 空投;OKC将全面支持所有可能产生的以太坊分叉资产,如用户已在 OKC 上持有 ETH,即能获得等量的 ETHW 资产。[2022/9/14 13:28:52]

图一

36.16万枚ETH在近一周被质押至以太坊2.0合约:据欧科云链OKLink数据显示,截至上午10时,以太坊2.0存款合约地址已收到520.22万ETH,近一周新增361632 ETH,单周质押数量环比上升59.05%;当前已有27097个地址进行ETH2.0的质押,近一周新增5801个。[2021/5/31 22:57:53]

这笔交易执行了一个精心构造的STATICCALL,攻击者将addr设为0x04,inOffset为0,inSize为32,retOffset为7,retSize为32。

数据:上周以太坊在BitMEX、ByBit和Deribit交易所的融资利率有所下降:3月29日消息,Skew数据显示,以太坊在BitMEX,ByBit和Deribit三个交易所上观察到“融资利率”有所下降。上周六,以太坊的现货价格在不到6小时的时间内下跌了9%以上,跌了下来。这导致上述交易所的融资利率下降到负数。这种下跌可能是由于BitMEX上大量ETH期货合约到期。截至3月28日,共有15,000份ETH合同在两小时内到期。价值200万美元的ETH期货在BitMEX到期。(AMBcrypto)[2020/3/30]

图二

由于STATICCALL的目标地址是预编译合约,所以会执行图二中的RunPrecompiledContract。

360安全团队发现某种以太坊ERC-20智能合约存在漏洞,随时可能受到黑客攻击:昨晚360安全团队发现某种以太坊ERC-20智能合约存在漏洞,随时可能受到黑客攻击。在发现漏洞不久,360安全团队通过自研的监控平台发现有人欲通过智能合约的批量转账方式无限生成代币,经过与相关方的及时沟通现漏洞已修复,也提醒投资人投资有风险,应对投资标的保持清醒认知。360作为全球最大互联网安全企业,致力于提供区块链相关安全解决方案,为区块链行业客户及互联网用户提供安全保障。[2018/5/19]

图三

图四

根据图三和图四的代码,可以看到预编译合约0x04真正执行的逻辑只是简单地把in返回。

图五

图六

图五是STATICCALL的执行过程,753行是执行预编译合约的入口,751行的args指向EVM的Memory中inOffset~inOffset+inSize这篇区域的指针,也就是说args指向Mem。

根据图六以及前文对预编译合约0x04的分析,我们可以知道753行的返回值ret是与args完全相同的指针,也指向Mem。

在1.10.7版本的Geth中:762行将ret指向的值赋给EVM的Memory中retOffset~retOffset+retOffset这篇区域,也就是将Mem的值赋给Mem,而由于ret是一个指向Mem的指针,这次Memory.Set修改了Mem的值,也就修改了ret所指的值。所以在第771行返回的ret已经不是预编译合约执行结束时的ret了。在1.10.8版本的Geth中:增加了766行:ret=common.CopyBytes,将Mem中的值做了一次深拷贝赋给ret,那么在767行执行的Memory.Set只会修改Memory而不会修改ret,在771行返回的ret就是正确的ret。总结

通过对整个攻击流程的梳理和Geth源代码的分析,我们认为根本原因在于Geth旧版本在处理预编译合约的调用时并未考虑异常值的处理,导致攻击者利用该漏洞实施了重叠拷贝,影响了返回值,最终导致分叉的出现。由于Geth是BSC、HECO、Polygon等公链的基础,因此该漏洞影响范围甚广。目前各公链也先后推出了升级和补丁,我们也呼吁各相关节点尽早升级打上补丁,以确保基础设施的安全。

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

水星链

[0:0ms0-1:65ms