5

重入攻击 + 管理漏洞:2000 万枚 OP 被盗事件分析

 1 year ago
source link: https://www.ccvalue.cn/article/1398659.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
据 Optimism 与加密货币做市商 Wintermute 透露,2000 万个 Optimism 代币被黑客盗取。

2022 年 6 月 9 日消息,据 Optimism 与加密货币做市商 Wintermute 透露,2000 万个 Optimism 代币被黑客盗取。6 月 9 日,Optimism 基金会向 Wintermute 授予了 2000 万枚 OP 代币。

10edbee15eddc8005efdb7f20eae1e0a.png

交易发送完成后,Wintermute 发现无法访问这些代币,因为提供的地址是他们尚未部署到 Optimism/L2 的 Ethereum/L1 多签地址。该 Optimism/L2 多签地址由黑客部署,2000 枚 OP 代币也被黑客盗取。

26a8fbfc1c9431c2f46e681a0a7e79e6.png

一、事件分析

5 月 27 日,Optimism 基金会通过多签合约分两次向 Wintermute 的多签合约地址转账 2000 万 OP 代币,并且在 26 日转账 1 枚 OP 代币,3 笔交易如下:

b52d3d4dd2855ce4ac610b33349b3745.png

根据交易时间以及交易中 OP 代币数量,我们分析,在 26 日,Optimism 基金会向 Wintermute 多签合约地址转账 1 枚 OP 代币作为测试,Optimism 基金会在 Wintermute 确认收到代币后将 2000 万枚 OP 代币通过连续的两笔交易发送给 Wintermute 多签合约地址。接收地址是 Wintermute 在 Ethereum/L1 上已部署的多签合约地址,因此 Wintermute 仅仅验证是否接收到了代币,但并没有验证该地址在 Optimism/L2 上的所有权,而此时在 Optimism/L2 上并没有实际部署多签合约,这才给了黑客可乘之机。

以上转账交易中的相关地址如下:

(1)Optimism 基金会在 Optimism/L2 上的多签合约地址:

0x2501c477d0a35545a387aa4a3eee4292a9a8b3f0(简记为0x2501)

(2)Wintermute 在 Ethereum/L1 上的多签合约地址(Wintermute Exploiter Multisig):

0x4f3a120E72C76c22ae802D129F599BFDbc31cb81(简记为0x4f3a)

同时,Optimism/L2 上的 0 x4 f3 a 也是黑客部署的多签合约地址。

接下来,我们将从链上交易的角度详细分析一下黑客的攻击行为以及原理。

首先,我们看一下 Optimism/L2 上的 0 x4 f3 a 合约部署交易:

txHash是0x00a3da68f0f6a69cb067f09c3f7e741a01636cbc27a84c603b468f65271d415b

bdb7fe8b143a43736aaeb19d12f56257.png

注意到,该合约部署时间是 6 月 5 日,其中 Wintermute/OP Exploiter 是黑客的一个地址,简记为 0 x60 b2。

该交易是如何准确生成 0 x4 f3 a 合约地址的呢?

黑客重放了 3 笔交易,尤其是最后的 Gnosis Safe: Proxy Factory 1.1.1 合约创建的交易,如下所示:

(1)Ethereum/L1 上的交易如下:

583351972d391a1b269e5f5053c8a1c3.png

(2)Optimism/L2上的交易:

c6cc8f66aa6e8dd239239e31560b7506.png

通过重放交易,黑客在 Optimism/L2 上面创建了跟 Ethereum/L1 上完全相同(地址与合约代码相同)的 Gnosis Safe: Proxy Factory 1.1.1 合约,其中创建代理合约函数如下:

65be467ff81194e98856819a04d5a993.png

Gnosis Safe: Proxy Factory 1.1.1 合约使用的是 0.5 版本的 Solidity,使用 new 来创建合约时使用的是 create 命令,而不是 create2。使用 create 命令创建合约,合约地址是 msg.sender 以及 nonce 来计算的。在 Ethereum/L1 上面,创建多签合约 0 x4 f3 a 的 msg.sender 就是 Gnosis Safe: Proxy Factory 1.1.1 的地址,黑客在 Optimism/L2 通过重放交易来创建于 Gnosis Safe: Proxy Factory 1.1.1 合约的主要目的就是为了保证在 Optimism/L2 上创建合约 0x4f3 a 的 msg.sender 与在 Ethereum/L1 上一致,那么黑客可以很方便的通过智能合约(合约 0 xe714)调用 createProxy 函数来创建出地址是 0 x4 f3 a 的合约。在该交易中创建过程如下所示:

136a36e2e5313dbe351c66566f7e3c10.png

另外,合约0xe714的部署是在6月1日的以下交易中完成的:

txHash: 0x69ee67800307ef7cb30ffa42d9f052290e81b3df6d3b7c29303007e33cd1c240

997c3966cbcb68243135b808b954a961.png

发起交易地址是0x8bcfe4f1358e50a1db10025d731c8b3b17f04dbb(简记为0x8bcf),这也是黑客所持有的地址。同时,这笔交易也是0x8bcf发起的第一笔交易,资金来源于Tornado:

8f08cc6f37b3a4b2aabfedaa5bbd129e.png

整个过程从时间上看,

(1)5 月 27 日,Optimism 地址 0 x2501 向 Optimism/L2 上的 0 x4 f3 a 地址转账 2000 万 OP,0 x4 f3 a 地址在 Ethereum/L1 上是 Wintermute 的多签合约地址,但此时在 Optimism/L2 上面并没有部署合约;

(2)6 月 1 日,黑客地址 0 x8 bcf 部署合约 0 xe714。

(3)6 月 5 日,黑客通过重放 Ethereum/L1 上的交易创建了 Gnosis Safe: Proxy Factory 1.1.1 合约,其地址与 Ethereum/L1 上一样;然后地址 0x60b2 通过合约 0 xe714 部署了多签合约 0 x4 f3 a,合约所有权归黑客所有,因此 5 月 27 日转入的 2000 万 OP 被黑客盗取。

(4)6 月 5 日,多签合约 0 x4 f3 a 在接收到 2000 万 OP 后,将 100 万 OP 转账给黑客地址 0 x60 b2,然后将 100 万 OP 兑换成了 720.7 Ether。

2ee790369195debd77043f9783452a42.png

251fe848c369f61cedf2517a705a8381.png

c5624d8de3d7c8d792639ed9959e48da.png

(5)6月9日,合约0x4f3a将其中的100万OP转账给了账户地址0xd8da,

bc48b1d6439195c291cf630af82dc797.png

其他的1800万OP仍然在合约0x4f3a中。

c9b942512533bf4667a72fe5c8e90117.png

二、安全建议

引发本次安全事件的根本原因是交易重放、Solidity旧版本漏洞以及主链和侧链交易签名验证等综合因素,并不是因为项目方合约代码存在漏洞。

另外,针对本次事件,项目方反应不及时、对合约管理不严格等也给了黑客可乘之机;从攻击时间线和攻击准备上看,也不排除OP内部有内鬼串通作案的可能。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK