以太坊遭到攻击而导致分叉事件的技术分析_MEM:OFF

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

攻击分析

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

数据:11月以太坊链上ETH销毁量超5万枚:金色财经报道,11月以太坊链上ETH销毁量超过5万枚,约为53,155 枚,价值为6,860万美元。此外,自2021年8月上旬实施EIP-1559以来,以太坊网络一共销毁了275万枚ETH,约合87.3亿美元。在以太坊链上NFT方面,11月以太坊链上NFT市场交易额进一步下降0.9%,下跌至3.814亿美元。[2022/12/2 21:17:36]

图一

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

Kelly ETFs向美国SEC提交以太坊期货ETF申请:11月30日,ETF发行公司Kelly ETFs已经申请了美国以太坊期货ETF。该公司向美国SEC提交了一份N-1A表格。N1-A被寻求组建开放式共同基金的投资公司使用,并根据1933年的证券法和1940年的投资公司法注册产品。Kelly Ethereum Ether Strategy ETF将持有在联邦监管交易平台交易的以太坊期货合约。目前,这意味着只有CME以太坊期货。该基金不会直接提供ETH敞口,其结构类似于经批准的比特币期货ETF。目前,它是SEC需要处理的唯一ETF期货申请。在SEC不采取任何行动的情况下,该申请将在75天后生效。彭博ETF分析师EricBalchunas和JamesSeyffart表示,该ETF申请获批的可能性大约为20%。[2021/11/30 12:40:34]

动态 | Parity Technologies获得以太坊基金会五百万元投资:据ethnews报道,以太坊基金会近日宣布向Parity Technologies投资五百万美元,并称后者是以太坊项目的主要技术贡献者 。[2019/1/8]

图二

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

图三

图四

根据图三和图四的代码,可以看到预编译合约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等公链的基础,因此该漏洞影响范围甚广。目前各公链也先后推出了升级和补丁,我们也呼吁各相关节点尽早升级打上补丁,以确保基础设施的安全。

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

金宝趣谈

XRPGavin Wood: XCM 第二部分- 版本控制和兼容性

在关于XCM的第一篇文章中,介绍了它的基本架构、目标以及如何将其用于一些简单的用例。在这里,我们将继续深入检查XCM的一个有趣方面:有一个共同的语言可以解决很多交互的问题.

[0:0ms0-7:879ms