北京时间2021年8月27日20点50分左右,以太坊突然出现分叉。我们通过分析Geth的代码版本修改和这笔造成分叉的交易厘清了以太坊分叉的根本原因:Geth旧版本在处理预编译合约调用时,并未考虑特殊情况下参数值的处理,从而引发重叠拷贝,导致返回值异常。该漏洞已提交Geth官方,目前尚未披露细节,但攻击者已经利用漏洞实施了攻击。我们认为及时的分析和披露是必要的,也希望我们的分析能够为社区提供必要的理解和帮助。
攻击分析
运用我们的在线分析工具,可以看出:
数据:以太坊网络单日交易笔数续刷历史新高:据Eherscan数据显示,以太坊网络单日交易笔数在4月22日续刷历史新高,达到超157万笔,24日和25日的单日交易笔数均约为140万笔,处于峰值附近。此前以太坊网络于4月22日左右提升了区块的GasLimit,从约1250万Gwei提升至1500万Gwei,提升幅度约为20%。自上周六(4月24日)以来,以太坊Gas价格维持在低于100Gwei的水平,目前接近50Gwei左右。[2021/4/26 20:59:05]
图一
这笔交易执行了一个精心构造的STATICCALL,攻击者将addr设为0x04,inOffset为0,inSize为32,retOffset为7,retSize为32。
以太坊未确认交易为124,191笔:金色财经消息,据OKLink数据显示,以太坊未确认交易124,191笔,当前全网算力为335.08TH/s,全网难度为4.46P,当前持币地址为53,886,717个,同比增加189,085个,24h链上交易量为2,611,089.71ETH,当前平均出块时间为13s。[2021/1/31 18:32:55]
以太坊期权交易量在上月创下历史新高:据The Block Research 数据,2020年12月 以太坊期权交易量创历史新高。11月的期权价值为18.3亿美元,而12月的期权价值为22.4亿美元,增长22.4%。
据悉,Deribit 拥有以太坊期权交易量的83.4%。其次是OKEx,占交易量的13.9%,位居第三的是bit.com,为1.72%。
2020年 12月创下各种历史新高,包括稳定币的总发行量和现货交易所的合法交易量。[2021/1/10 15:47:24]
图二
由于STATICCALL的目标地址是预编译合约,所以会执行图二中的RunPrecompiledContract。
Tether向以太坊网络新增发1.5亿枚USDT:据DAppTotal.com稳定币专题页面数据显示:11月04日02时28分 ,USDT发行方Tether向以太坊网络新增发1笔价值1亿5,000万美元的USDT, 块高度为:11185771,交易哈希值为:0xeeeb50a0224a7df31e1118a5411cb254fe824766d5ca9d5927c67f89163d8fa6 。截至目前,Tether在以太坊网络上的ERC20 USDT总发行量已达11,078,669,486枚。[2020/11/4 11:34:58]
图三
图四
根据图三和图四的代码,可以看到预编译合约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等公链的基础,因此该漏洞影响范围甚广。目前各公链也先后推出了升级和补丁,我们也呼吁各相关节点尽早升级打上补丁,以确保基础设施的安全。
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。