為何會出現交易重放?

作者: [email protected]慢霧安全團隊

背景

6 月 9 日,Optimism 與 Wintermute 雙雙發佈公告,向社區披露了一起 2000 萬 OP 代幣丟失的事件。Optimism 委託了 Wintermute 來為 OP 在二級市場上提供流動性服務,同時將向 Wintermute 提供 2000 萬枚 OP 代幣。為了接收這筆代幣,Wintermute 給了 Optimism 一個多簽地址,在 Optimism 測試發送了兩筆交易且 Wintermute 確認無誤後,Optimism 將 2000 萬 OP 轉移到了該地址。在 Optimism 轉完幣之後,Wintermute 卻發現自己沒辦法控制這些代幣,因為他們所提供的多簽地址暫時只部署在了以太坊主網上,尚未向 Optimism 網絡部署。Wintermute 立即啟動了補救操作,但已有攻擊者察覺到了這一漏洞,並搶在 Wintermute 之前將多簽部署到了 Optimism 網絡的該地址之上,成功控制了這 2000 萬代幣。那麼問題來了,為什麼會出現這種漏洞?

前置知識

首先需要確定交易簽名是否符合 [EIP155] 標準,符合 [EIP155] 標準的簽名會對 9 個 RLP 編碼元素 (nonce, gasprice, gas, to, value, data, chainid, 0, 0) 進行哈希,其中包含了 chainid,因此符合 [EIP155] 標準的簽名 v 值就為 {0,1} + chainid * 2 + 35。而對不符合 [EIP155] 標準的簽名,其只對 6 個元素進行哈希 (nonce, gasprice, gas, to, value, data),因此簽名後 v 值為 {0,1} + 27。而不同的鏈會定義有不同的 chainid,不同的 chainid 會得到不同的 v 值。根據 ECDSA 我們知道在 v 值不同的情況下,就算 r 與 s 值相同,簽名所還原出的公鑰也是不同的。因此對於符合 [EIP155] 標準的交易是無法在其他鏈上成功進行重放的。

值得一提的是在以太坊倫敦升級時實施的 [EIP2718] 引入了新的交易格式 0x02 || RLP([chain_id, nonce, max_priority_fee_per_gas, max_fee_per_gas, gas_limit, destination, amount, data, access_list, signature_y_parity, signature_r, signature_s]),chainid 是單獨編碼的,而不包含在簽名 v 值中了,簽名 v 值只是作為一個簡單的奇偶校驗位,因此當前交易簽名得到的 v 值變為 0 或 1。

交易重放

在我們了解完以上交易簽名構造後我們就可以很清晰的知道簽名 v 值為 27 或 28 是可以在不同鏈上被重放的。那麼該如何在不同鏈上進行重放呢?這與我們發送交易並無不同,只需要將原始交易內容再其他鏈上進行發送即可。

以 Wintermute 2000 萬個 OP 代幣被竊取事件為例,攻擊者在此次事件中重放了 Gnosis Safe 部署 Factory 合約的交易。我們在這裡嘗試重放 Gnosis Safe Deployer 3 的 nonce 為 3 的交易。

一種較為簡單的方法是先通過 Etherscan 獲取原始交易:

圖片

然後直接通過 Optimistic 的 eth_sendRawTransaction [RPC]

(https://eth.wiki/json-rpc/API) 接口進行發送即可。

若無法直接獲取到原始交易內容,我們可以先通過 eth_getTransactionByHash

[RPC](https://eth.wiki/json-rpc/API) 接口獲取交易內容。

圖片

再對交易內容進行 RLP 編碼後得到原始交易內容:

圖片

然後再通過 Optimistic 的 eth_sendRawTransaction [RPC]

(https://eth.wiki/json-rpc/API) 接口進行發送即可。

圖片
圖片

參考

https://eips.ethereum.org/EIPS/eip-155

https://eips.ethereum.org/EIPS/eip-2718

https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm

https://github.com/ethereum/go-ethereum/blob/master/core/types/transaction_signing.go

免責聲明:作為區塊鏈信息平台,本站所發布文章僅代表作者及嘉賓個人觀點,與 Web3Caff 立場無關。本文內容僅用於信息分享,均不構成任何投資建議及要約,並請您遵守所在國家或地區的相關法律法規。