How to replay a transaction?
By:Kong@慢霧安全團隊
背景
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 獲取原始交易:
2000 萬OP 代幣被盜關鍵:交易重放
然後直接通過Optimistic 的eth_sendRawTransaction [RPC] (https://eth.wiki/json-rpc/API) 接口進行發送即可。
若無法直接獲取到原始交易內容,我們可以先通過eth_getTransactionByHash [RPC](https://eth.wiki/json-rpc/API) 接口獲取交易內容。
2000 萬OP 代幣被盜關鍵:交易重放
再對交易內容進行RLP 編碼後得到原始交易內容:
2000 萬OP 代幣被盜關鍵:交易重放
然後再通過Optimistic 的eth_sendRawTransaction [RPC] (https://eth.wiki/json-rpc/API) 接口進行發送即可。
2000 萬OP 代幣被盜關鍵:交易重放
2000 萬OP 代幣被盜關鍵:交易重放
參考:
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
展開全文打開碳鏈價值APP 查看更多精彩資訊