Oleh: Kong @ Tim Keamanan Kabut Lambat
latar belakang
Pada tanggal 9 Juni, Optimism dan Wintermute mengeluarkan pengumuman, mengungkapkan kepada komunitas sebuah insiden di mana 20 juta token OP hilang. Optimisme menugaskan Wintermute untuk menyediakan layanan likuiditas untuk OP di pasar sekunder, dan akan memberikan 20 juta token OP ke Wintermute. Untuk menerima token ini, Wintermute memberi Optimisme alamat multi-tanda tangan Setelah Optimisme mengirim dua transaksi dalam pengujian dan Wintermute mengonfirmasi bahwa itu benar, Optimisme mentransfer 20 juta OP ke alamat ini. Setelah Optimisme mentransfer token, Wintermute menemukan bahwa mereka tidak memiliki cara untuk mengontrol token ini, karena alamat multi-tanda tangan yang mereka berikan hanya diterapkan di mainnet Ethereum untuk saat ini, dan belum diterapkan ke jaringan Optimisme. Wintermute segera meluncurkan operasi perbaikan, tetapi seorang penyerang telah menyadari kerentanan ini dan menyebarkan multi-signature ke alamat jaringan Optimism sebelum Wintermute berhasil mengendalikan 20 juta token. Jadi pertanyaannya adalah, mengapa ada celah seperti itu?
Pra-pengetahuan
Pertama-tama, perlu untuk menentukan apakah tanda tangan transaksi sesuai dengan standar [EIP155]. Tanda tangan yang sesuai dengan standar [EIP155] akan mem-hash 9 elemen pengkodean RLP (nonce, gasprice, gas, to, value, data, chainid , 0, 0), di mana Chainid disertakan, sehingga nilai v dari tanda tangan yang sesuai [EIP155] adalah {0,1} + chainid * 2 + 35. Untuk tanda tangan yang tidak sesuai dengan standar [EIP155], hanya mencirikan 6 elemen (nonce, gasprice, gas, to, value, data), sehingga nilai v setelah penandatanganan adalah {0,1} + 27. Rantai yang berbeda akan menentukan chainid yang berbeda, dan chainid yang berbeda akan mendapatkan nilai v yang berbeda. Menurut ECDSA, kita mengetahui bahwa ketika nilai v berbeda, meskipun nilai r dan s sama, kunci publik yang dikembalikan oleh tanda tangan juga berbeda. Oleh karena itu, transaksi yang memenuhi standar [EIP155] tidak dapat diputar ulang dengan sukses di rantai lain.
Perlu disebutkan bahwa [EIP2718] memperkenalkan format transaksi baru 0x02 || RLP([chain_id, nonce, max_priority_fee_per_gas, max_fee_per_gas, gas_limit, tujuan, jumlah, data, daftar_akses, signature_y_parity, signature_r, signature_s]), chainid dikodekan secara terpisah dan tidak termasuk dalam nilai signature v. Nilai signature v hanya digunakan sebagai parity bit sederhana, sehingga nilai v yang didapat dari signature transaksi yang sedang berjalan menjadi 0 atau 1.
ulang transaksi
Setelah kita memahami struktur tanda tangan transaksi di atas, kita dapat mengetahui dengan jelas bahwa nilai tanda tangan v 27 atau 28 dapat diputar ulang pada rantai yang berbeda. Jadi bagaimana cara memutar ulang pada rantai yang berbeda? Ini tidak berbeda dengan mengirim transaksi, kami hanya perlu mengirimkan konten transaksi asli di jaringan lain.
Ambil pencurian 20 juta token OP di Wintermute sebagai contoh, di mana penyerang memutar ulang transaksi di mana Gnosis Safe menerapkan kontrak Pabrik. Di sini kami mencoba memutar ulang transaksi Gnosis Safe Deployer 3 dengan angka 3.
Metode yang lebih sederhana adalah dengan terlebih dahulu mendapatkan transaksi asli melalui Etherscan:
![](http://lianxiangfiles.oss-cn-beijing.aliyuncs.com:/article/kf664mx3ix1654859836131.png)
Kemudian langsung melalui eth_sendRawTransaction [RPC] Optimis
(https://eth.wiki/json-rpc/API) untuk mengirim.
Jika konten transaksi asli tidak dapat diperoleh secara langsung, kita dapat melewati eth_getTransactionByHash terlebih dahulu
Antarmuka [RPC](https://eth.wiki/json-rpc/API) untuk mendapatkan konten transaksi.
![](http://lianxiangfiles.oss-cn-beijing.aliyuncs.com:/article/z8e4xo5un61654859855957.png)
Kemudian RLP mengkodekan konten transaksi untuk mendapatkan konten transaksi asli:
![](http://lianxiangfiles.oss-cn-beijing.aliyuncs.com:/article/b84nc4z8va1654859871216.png)
Kemudian berikan eth_sendRawTransaction [RPC] Optimistis
(https://eth.wiki/json-rpc/API) untuk mengirim.
![](http://lianxiangfiles.oss-cn-beijing.aliyuncs.com:/article/g1h8bsq37n1654859906798.png)
![](http://lianxiangfiles.oss-cn-beijing.aliyuncs.com:/article/1dtzi7v9xm1654859920835.png)
Referensi :
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