2022 年6 月9 日消息,據Optimism 與加密貨幣做市商Wintermute 透露,2000 萬個Optimism 代幣被黑客盜取。 6 月9 日,Optimism 基金會向Wintermute 授予了2000 萬枚OP 代幣。
交易發送完成後,Wintermute 發現無法訪問這些代幣,因為提供的地址是他們尚未部署到Optimism/L2 的Ethereum/L1 多簽地址。該Optimism/L2 多簽地址由黑客部署,2000 枚OP 代幣也被黑客盜取。
一、事件分析
5 月27 日,Optimism 基金會通過多簽合約分兩次向Wintermute 的多簽合約地址轉賬2000 萬OP 代幣,並且在26 日轉賬1 枚OP 代幣,3 筆交易如下:
根據交易時間以及交易中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
注意到,該合約部署時間是6 月5 日,其中Wintermute/OP Exploiter 是黑客的一個地址,簡記為0 x60 b2。
該交易是如何準確生成0 x4 f3 a 合約地址的呢?
黑客重放了3 筆交易,尤其是最後的Gnosis Safe: Proxy Factory 1.1.1 合約創建的交易,如下所示:
(1)Ethereum/L1 上的交易如下:
(2)Optimism/L2上的交易:
通過重放交易,黑客在Optimism/L2 上面創建了跟Ethereum/L1 上完全相同(地址與合約代碼相同)的Gnosis Safe: Proxy Factory 1.1.1 合約,其中創建代理合約函數如下:
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 的合約。在該交易中創建過程如下所示:
另外,合約0xe714的部署是在6月1日的以下交易中完成的:
txHash: 0x69ee67800307ef7cb30ffa42d9f052290e81b3df6d3b7c29303007e33cd1c240
發起交易地址是0x8bcfe4f1358e50a1db10025d731c8b3b17f04dbb(簡記為0x8bcf),這也是黑客所持有的地址。同時,這筆交易也是0x8bcf發起的第一筆交易,資金來源於Tornado:
整個過程從時間上看,
(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。
(5)6月9日,合約0x4f3a將其中的100萬OP轉賬給了賬戶地址0xd8da,
其他的1800萬OP仍然在合約0x4f3a中。
二、安全建議
引發本次安全事件的根本原因是交易重放、Solidity舊版本漏洞以及主鍊和側鏈交易簽名驗證等綜合因素,並不是因為項目方合約代碼存在漏洞。
另外,針對本次事件,項目方反應不及時、對合約管理不嚴格等也給了黑客可乘之機;從攻擊時間線和攻擊準備上看,也不排除OP內部有內鬼串通作案的可能。