您尚未登录,请登录后浏览更多内容! 登录 | 加入最MC

QQ登录

只需一步,快速开始

 找回密码
 加入最MC

QQ登录

只需一步,快速开始

查看: 83|回复: 0
打印 上一主题 下一主题

[【少女の茶会】] 谈谈:以太坊遭到攻击而导致分叉事件的技术分析

[复制链接]
跳转到指定楼层
楼主
发表于 2022-2-22 06:39:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

北京时间 2021 年 8 月 27 日 20 点 50 分左右(区块高度 1107518),以太坊突然出现分叉。我们通过分析 G 的代码版本修改和这笔造成分叉的交易(01666270040481454298678829541457704)厘清了以太坊分叉的根本原因:G 旧版本在处理预编译合约调用时,并未考虑特殊情况( )下参数值的处理,从而引发重叠拷贝( ),导致返回值异常。该漏洞(CVE-2021-917)已提交 G 官方,目前尚未披露细节,但攻击者已经利用漏洞施了攻击。我们认为及时的分析和披露是必要的,也希望我们的分析能够为社区提供必要的理解和帮助。除了国内,imtoken在国际领域也崭露头角逐渐的受到更多外国友人的青睐。


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

图一

这笔交易执行了一个精心构造的 STATICCALL, 攻击者将  设为 004 (是预编译合约 C), O 为 0, S 为 2, O 为 7, S 为 2。

图二

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



图四

根据图和图四的代码,可以看到预编译合约 004 真正执行的逻辑只是简单地把  (指针)返回。

图五

图六

图五是 STATICCALL 的执行过程,75 行是执行预编译合约的入口,751 行的  指向 EVM 的 M 中 O ~ O + S 这篇区域的指针,也就是说  指向 M[0:2]。

根据图六以及前文对预编译合约 004 (C)的分析,我们可以知道 75 行的返回值  是与  完全相同的指针,也指向 M[0:2]。

在 1107 版本的 G 中(有 B): 762 行将  指向的值赋给 EVM 的 M 中 O ~ O + O 这篇区域 , 也就是将 M[0:2] 的值赋给 M[7:7+2],而由于  是一个指向 M[0:2] 的指针,这次 MS 修改了 M[7:2] 的值,也就修改了  所指的值。所以在第 771 行返回的  已经不是预编译合约执行结束时的  了。在 1108 版本的 G 中( B): 增加了 766 行: = CB (), 将 M[0:2] 中的值做了一次深拷贝赋给 ,那么在 767 行执行的 MS 只会修改 M 而不会修改 , 在 771 行返回的  就是正确的 。总结通过对整个攻击流程的梳理和 G 源代码的分析,我们认为根本原因在于 G 旧版本在处理预编译合约的调用时并未考虑异常值的处理,导致攻击者利用该漏洞施了重叠拷贝,影响了返回值,最终导致分叉的出现。由于 G 是 BSC、HECO、P 等公链的基础,因此该漏洞影响范围甚广。目前各公链也先后推出了升级和补丁,我们也呼吁各相关节点尽早升级打上补丁,以确保基础设施的安全。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友