Jason chen

Posted on Jun 10, 2022Read on Mirror.xyz

关于Optimism事件文章的错误更正与补充信息

作为web3信仰者,我遵循web3不可篡改的精神,所以我就不修改上文中的错误了,而是重新发了一篇更正补充文章。

————————————————————————————————————————

今天gnosis safe官方发出了其对于Optimism事件的详细说明,链接如下:https://gnosis-safe.notion.site/The-Loss-of-20M-OP-An-Analysis-36aca234f4254940b3dd995a0f04b765

经过与读者的交流反馈,与结合gnosis safe的说明,昨日发出的深度解析Optimism被盗2000万来龙去脉!真tm精彩!中提到黑客在Optimism中部署了与被打款一样地址的合约从而获得该地址的控制权,在具体“如何部署一样地址”这一段的描述中存在错误,proxy factory地址并不是传入的,而是使用了重放攻击,当时在这里没有研究清楚,这个确实是我的失误,研究深度和知识面还不够广,所以再单独发一篇补充文更正信息,对于产生了误导的读者非常抱歉。

这里也分享一下Cobo安全团队的文章,在该部分描述的更加详细专业:https://www.techflow520.com/news/920

结合各位读者以及其他安全团队的内容,对于黑客生成同样地址合约的手法进行更正如下:

所有的Gnosis Safe钱包合约需要由proxy factory合约完成部署,所以黑客如果想要在Optimism生成一个对应地址的钱包合约,需要在Optimism调用proxy factory进行部署。

这里我在文章中漏了很重要的一步,黑客需要先完成一个proxy factory合约的部署。

这里黑客使用到了重放攻击,重放攻击即攻击者在将别人的交易数据拦截后再次原封不动的自己再发送一遍从而获得某种收益的情况,比如有的饭店是你先去前台点单,然后给你打印一个小票,你拿着小票去窗口给打菜师傅,师傅拿到小票后给你打菜,并把小票撕掉,但是如果你捡到了别人已经用过的小票,然后恰好这家饭店没有每次打完菜都撕掉小票,这时候你拿着别人的小票去窗口还可以再免费打一份,于是你每天都拿着这张小票来白嫖一顿饭,这个过程就是饭店遭受了重放攻击,在之前的文章中深度解析:NBA的16进制合约漏洞是怎么被科学家薅秃噜皮的?也属于一种重放攻击。

所以首先黑客要在以太坊找到proxy factory合约,地址为:0x76E2cFc1F5Fa8F6a5b3fC4c8F4788F0116861F9B

因为该版本的合约没有使用eip155防止重放攻击,也就是相当于没把每次打饭的小票撕毁,所以意味着黑客使用当时交易的原始数据再搞一个同样地址。

把该合约交易记录翻到第一条可以看到在912天之前进行了合约创建。

我们点击进入交易详情拉到最下面,可以看到是0x1a这个地址创建了该合约,以及最下方有当时这个交易的原始数据,我们再切换到Optimism网络中可以看到proxy factory合约也是0x1a创建的,并且两次交易的原始数据一摸一样。

所以黑客拿着当时的交易又在Optimism重新部署了proxy factory合约,然后除了sender还有第二个参数nonce,接下来不断调用该合约的创建钱包合约最终直至nonce到达了可以生成存着2000万OP的地址。

以上就是对于黑客具体如何实现了一样的地址的更正与补充,这是我研究不够深入导致的,在此向读者表示歉意,也很感谢提出反馈指出错误的朋友们,互相交流学习才可以不断的精进,我虽然是web3从业者,但并不是从事安全领域的专业人员,业余时间研究区块链安全并进行科普,在专业度上还是存在不足,以后继续努力提高自己的姿势水平,和大家一起学习进步。

Optimism