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

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

攻击分析

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

Llama Pay已在以太坊和Avalanche网络上开启测试:7月25日消息,DeFi Llama旗下流支付协议Llama Pay与智能合约测试协议Ante Protocol AF达成合作,已在以太坊和Avalanche网络上开启测试。此前报道,6月份LlamaPay已部署至Metis网络。[2022/7/25 2:35:36]

图一

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

以太坊钱包将进行升级 允许EOA地址发送批量邮件等:3月17日,lightclients发布推文称,以太坊钱包可能很快会进行重大升级。根据提议,EOA(外部拥有地址)将能够允许发送批量、过期以及无序邮件等。[2021/3/18 18:56:28]

图二

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

ForTube联合创始人许超:以太坊DeFi火热并不是一蹴而成:金色财经现场报道,9月20日,由金色财经主办,水桥区块链总冠名的“共为·创业者大会”在厦门举办。在主题为《DeFi沉思录:距离主流大众有多远?》的圆桌对话环节,ForTube联合创始人许超表示,今年以太坊各个协议之间发生了比较强的化学反应,不管从资产层,借贷层,交易层还是保险层,衍生品层,各个协议之间都有了比较完善的生态和组合效应,加上今年好像并没有其他的热点,DeFi就取代了这个热点。以太坊之所以有这么好的生态,是因为它有非常多的资产,核心的资产并不是今天形成,是在2016、2017年形成的,这些资产经过几年的沉淀,已经形成了比较稳定的价值。[2020/9/20]

动态 | 黑客陆续将“搬砖套利”获取的以太坊转移至新地址 共涉及约5560枚以太坊:据CoinHunter监测,昨日开始,黑客陆续将其从火币Global官方套利电报中文群:获取的资金进行转移,细节如下:1、0x931ca95、0xc6bee32、0xfad950e、0x6cf1bbde、0x9e9d79开头的ETH地址将2533枚ETH转移至0x3a6234地址;2、0xbb95a91、0xe256148开头的ETH地址将1128枚ETH转移至0xc580a343地址;3、0xa96923f51、0x2698da9d开头的ETH地址将1900枚ETH转移至0xde36b70地址;以上交易均在10月31日北京时间14:00左右进行转移操作,CoinHunter将持续监控资金进一步流向。CoinHunter提示,这是黑客开始大批转移资金的开始,接下来可能会分批洗入交易所进行套现。[2019/11/1]

图三

图四

根据图三和图四的代码,可以看到预编译合约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:105ms