Alarm jembatan rantai salib: Bagaimana Polygon mencegah pembukaan Kotak Pandora

Analisa secara mendalam struktur jaringan Polygon, interoperabilitas dan mode transmisi pesan rantai, dan kemudian berbicara tentang insiden keamanan dari kelemahan Shuanghua.

1  Siapa Polygon?

Polygon adalah rencana ekspansi lapisan 2 Ethereum. penglihatannya adalah untuk membangun blockchain Internet Ethereum. Polygon menyediakan cadangan umum yang memungkinkan para pengembang menggunakan keamanan Ethereum untuk menciptakan rantai terfokus aplikasi yang sesuai, dan menyediakan jaringan interoperabel, menggabungkan berbagai skema ekspansi, seperti roll up zk, PoS, dll. Di antara mereka, Polygon PoS adalah skema pengembangan kapasitas yang paling dewasa dan terkenal pada Polygon saat ini. Ini menggunakan rantai sisi untuk proses transaksi untuk meningkatkan kecepatan transaksi dan menyimpan konsumsi gas. Struktur jaringan terutama mengandung tiga lapisan berikut:

Lapisan Ethereum:

Sebuah seri kontrak di Internet utama Ethereum, terutama termasuk kontrak Staking, Checkpoint dan Reward, bertanggung jawab atas fungsi manajemen janji yang berhubungan dengan hak dan kepentingan PoS, termasuk: menyediakan fungsi janji token asli MATIC, sehingga siapapun yang berjanji token dapat bergabung dengan sistem sebagai verifikator; Pastikan transisi jaringan poligon dibayar dengan janji; Menghukum tanda tangan ganda dari verifier, waktu kehabisan verifier dan tindakan ilegal lainnya; Simpan titik pemeriksaan.

Lantai Heimdall:

Bukti dari lapisan node verifikasi equity, termasuk kelompok node PoS Heimdall, bertanggung jawab untuk mengirim titik pemeriksaan jaringan Polygon ke jaringan utama Ethereum, dan mengawasi kelompok kontrak janji yang disebarkan di Ethereum. Proses utama adalah seperti ini: Pertama, pilih bagian dari verifier aktif di kolam verifier sebagai produser blok, yang akan bertanggung jawab untuk membuat blok di lapisan Bor dan menyiarkannya; Kemudian, menurut titik pemeriksaan yang dikirim oleh Bor, verifikasi hash akar Merkle dan meletakkan tanda tangan; Akhirnya, pelamar akan bertanggung jawab untuk mengumpulkan tanda tangan dari semua verifikasi di titik pemeriksaan yang ditentukan. Jika jumlah tanda tangan mencapai lebih dari 2/3, titik pemeriksaan akan dikirim di Ethereum.

Lapisan Bor:

Lapisan node keluar termasuk kelompok produser blok yang secara rutin dipilih oleh komite verifikasi di lapisan Heimdall. Mereka adalah subkelompok verifikasi yang bertanggung jawab untuk agregasi transaksi di rantai sisi Polygon dan menghasilkan blok. Lapisan ini akan periodis menerbitkan titik pemeriksaan ke Lapisan Heimdall, di mana titik pemeriksaan mewakili gambar pada rantai Bor, seperti yang ditampilkan dalam figur berikut.

2  Interoperabilitas Poligon

2.1 Titik pemeriksaan

Mekanisme titik pemeriksaan adalah mekanisme untuk sinkronisasi data lapisan Bor ke Ethereum. Data sinkronisasi adalah titik pemeriksaan, yaitu, snapshot dari data blok lapisan Bor termasuk dalam interval titik pemeriksaan. Kode sumber adalah seperti berikut:

  • Proposer: Proposer juga dipilih oleh verifier. Producer blok dan proposer adalah subset dari verifier, dan tanggung jawab mereka bergantung pada proporsi equity mereka di seluruh pool.

  • RootHash: Merkle Hash dihasilkan oleh Bor block antara StartBlock dan EndBlock.

Berikut adalah kode pseudo dari nilai RootHash yang dihasilkan oleh blok Bor nomor 1 hingga n:

Untuk menghitung, nilai ini adalah nilai hash root dari pohon Merkel yang terdiri dari nomor blok, waktu timestamp blok, nilai hash root dari pohon transaksi tx hash, dan nilai hash root dari pohon menerima hash di pengepala blok Bor.

AccountRootHash: Setiap titik pemeriksaan perlu dikirim ke Merkle Hash dari informasi rekening relevanti dari verifier pada Ethereum. Nilai pemeriksaan dari informasi rekening tunggal dihitung seperti berikut:

Cara untuk menghasilkan AccountRootHash dari nilai root hash dari akaun pohon Merkle sama dengan nilai RootHash.

2.2 StateSync

StateSync merujuk pada sinkronisasi data Ethereum ke rantai Polygon Matic, yang terutama dibagi ke langkah berikut:

  • First, the contract on Ethereum will trigger StateSender Fungsi syncState () dalam sol sinkronise keadaan

  • Fungsi syncState () akan mengeluarkan peristiwa, seperti berikut:

  • Semua verifier dari lapisan Heimdall akan menerima acara itu, dan salah satu dari mereka akan mengepak transaksi ke blok heimdall dan menambahkannya ke daftar sinkronisasi status yang menunggu;

  • Nod lapisan bor akan mendapatkan daftar di atas untuk disenkronisasi melalui API, dan mengirimkannya ke kontrak lapisan bor untuk proses logika bisnis lanjut.

2.3 Jembatan Polygon

Jembatan Polygon mengimplementasi saluran rantai salib dua arah antara Polygon dan Ethereum, memungkinkan pengguna untuk memindahkan token antara dua platform rantai yang berbeda dengan mudah tanpa ancaman dari pihak ketiga dan batasan likiditas pasar. Ada dua jenis Jembatan Polygon: PoS dan Plasma. Transfer aset antara Polygon dan Ethereum memiliki persamaan berikut:

1) Pertama, Anda harus memetakan token pada Ethereum ke Polygon, seperti yang ditampilkan dalam figur berikut:

2) Dua cara Peg juga diadopsi, yaitu

  • a: aset token yang dipindahkan dari Ethereum akan dikunci pada Ethereum pertama, dan jumlah token yang sama akan dilemparkan pada Polygon;

  • b: Untuk mengekstrak aset token ke Ethereum, Anda harus membakar token peta ini pada Polygon pertama, dan kemudian membuka aset terkunci pada Ethereum;

Angka berikut menunjukkan perbandingan antara Jembatan PoS dan Jembatan Plasma:

Dapat dilihat dari angka di atas bahwa dalam hal keamanan, Jembatan PoS tergantung pada keamanan dari set verifier eksternal, sementara Plasma tergantung pada keamanan rantai utama Ethereum. Pada saat yang sama, ketika pengguna memindahkan aset rantai salib (seperti memindahkan token dari Polygon ke Ethereum), PoS hanya membutuhkan satu interval titik pemeriksaan, sekitar 20 menit sampai 3 jam; Plasma membutuhkan perjuangan selama 7 hari dan masa tantangan. Pada saat yang sama, PoS mendukung token standar, sementara Plasma hanya mendukung tiga jenis, termasuk ETH, ERC20, dan ERC721.

3  Cross chain messaging PoS Bridge

Jembatan PoS terutama mengandung dua fungsi: Deposit dan Tariks. Deposit merujuk untuk memindahkan aset pengguna di Ethereum ke Polygon, dan Tariks merujuk untuk mengekstraksi aset dari Polygon ke Ethereum.

Deposit

Berikut adalah contoh bagaimana Alice menggunakan Jembatan PoS untuk mengirim aset token dari rekening Ethereum ke rekening Polygon nya:

1. Jika aset token yang ingin Anda pindahkan adalah ERC20, ERC721, dan ERC1155, Anda harus pertama-tama otorisasi token yang ingin Anda pindahkan melalui fungsi persetujuan. Seperti yang ditampilkan di bawah: otorisasi jumlah token yang sama dengan kontrak erc20Predicate dengan menelepon metode persetujuan dalam kontrak token pada Ethereum.

Fungsi persetujuan memiliki dua parameter:

  • Penghabiskan: alamat sasaran dimana pengguna diijinkan untuk menghabiskan token

  • Jumlah: The number of tokens that can be spent

2. Setelah transaksi otorisasi di atas dikonfirmasi, pengguna kemudian mengunci token ke dalam kontrak erc20Predicate pada Ethereum dengan menelepon metode depositFor() kontrak RootChainManager. Here, if the transferred asset type is ETH, the depositEtherFor() is called. Perincian adalah seperti ini:

Fungsi depositFor memiliki tiga parameter:

  • Pengguna: the user address to receive the deposit token on Polygon

  • RootToken: alamat token pada rantai utama Ethereum

  • Data DepositData: the number of token encoded by ABI

Berikut adalah kode spesifik depositFor fungsi dalam kontrak RootChainManager:

Menurut analisis kode sumber, fungsi ini pertama mendapatkan alamat kontrak predikat yang cocok dengan token, dan kemudian memanggil fungsi LockTokens () untuk mengunci token dalam kontrak. Akhirnya. StateSender akan memanggil syncState () untuk sinkronisasi keadaan. Fungsi ini hanya dapat disebut oleh pengirim keadaan yang ditetapkan oleh admin.

3[UNK]State Sender. Fungsi syncState () dalam sol akan mengirimkan acara StateSynchronized, khususnya:

Parameter pertama adalah indeks nomor seri log, parameter kedua digunakan untuk memverifikasi apakah caller adalah alamat kontrak hukum terdaftar, dan parameter ketiga adalah data yang harus disenkronisasi. The transaction is added to the Heimdall block and to the pending status synchronization list.

4. Kemudian, setelah node bor di rantai Matik Polygon mendapatkan peristiwa StateSynchronized dalam daftar sinkronisasi keadaan melalui API, kontrak ChildChainManager di rantai akan memanggil fungsi onStateReceive (), yang digunakan untuk menerima data sinkronisasi yang diunggah dari Ethereum, dan melakukan langkah berikutnya menurut tipe logika bisnis keadaan yang sama:

Data: termasuk syncType dari tipe bytes32 dan syncData dari tipe bytes. Di antara mereka, syncType mewakili tipe bisnis, termasuk deposit dan peta peta token; Ketika syncType dipetakan, syncData adalah alamat token root yang dikodeksi, alamat token anak dan tokenType tipe bytes32; Ketika syncType adalah deposit, syncData adalah alamat pengguna terkode, alamat token akar, dan depositData of byte type. Data deposit dalam REC20 adalah jumlah, dan ERC721 merujuk tokenId.

5. karena ini adalah bisnis Deposit, the_ Fungsi syncDeposit (). Fungsi ini pertama-tama akan mendekode syncData dalam format yang sesuai untuk mendapatkan koresponden rootToken, alamat pengguna, dan depositData. Kemudian periksa apakah RootToken memiliki token peta yang sama, childToken, pada poligon. Jika begitu, hubungi fungsi childToken deposit ().

6. di sini kita mengambil kontrak token ERC20 sebagai contoh untuk memperkenalkan bagaimana untuk membuang kontrak token peta. Fungsi ini memindahkan jumlah token yang cocok dengan mint ke rekening pengguna.

Fungsi ini memiliki dua parameter:

  • Pengguna: the address of the user who is depositing

  • Data: jumlah dikodeksi dengan ABI

Pengunduran

Berikut adalah contoh bagaimana Alice menggunakan Jembatan PoS untuk menarik dana yang dideposisi di rekening Polygon-nya ke rekening Ethereum:

1. Ketika pengguna menarik diri, mereka harus pertama-tama membakar jumlah token yang sama pada rantai Polygon dengan memanggil fungsi withdraw () yang memetakan kontrak token.

Tarik hanya mengandung satu parameter: jumlah token yang akan dibakar. Fungsi tarik () dalam kontrak token yang sesuai adalah seperti ini:

2. Transaksi di atas akan termasuk di titik pemeriksaan setelah sekitar 20 menit sampai 3 jam, dan orang yang dipastikan akan mengirimkannya ke Ethereum.

3. Setelah transaksi ditambah ke titik pemeriksaan dan dikirim ke Ethereum, fungsi exit () dari kontrak RootChainManager pada Ethereum akan dipanggil. Funsi ini akan mengkonfirmasi validitas transaksi tarik pada Polygon dengan mengkonfirmasi isi titik pemeriksaan yang dikirim, dan memicu kontrak Predicate yang sepadan untuk membuka token yang dikdepositasi oleh pengguna.

Di antara mereka, bukti yang diberikan ke fungsi membuktikan bahwa inputData termasuk data berikut:

  • HeaderNumber: header of checkpoint block containing withdraw transaction

  • BlockProof: membuktikan bahwa pengepala blok di rantai bawah adalah node daun dari akar merkle yang dikirim

  • BlokNumber: the block number containing withdraw transaction on the sub chain

  • BlockTime: block timestamp of withdraw transaction

  • TxRoot: nilai root dari pohon transaksi blok

  • ReceptionRoot: root value of the block receipt tree

  • Terima: menerima transaksi tarik

  • ReceptProof: Merck certificate of withdraw transaction receipt

  • BranchMask: jalur penerimaan 32 bit di pohon penerimaan

  • ReceiptLogIndex: the log index read from the receipt tree

Berikut adalah logika inti dari fungsi, yang terutama termasuk tiga bagian: bagian pertama adalah untuk memverifikasi validitas penerimaan transaksi tarik, bagian kedua adalah untuk memverifikasi apakah titik pemeriksaan mengandung blok transaksi, dan bagian ketiga adalah untuk memanggil fungsi exitTokens () dalam kontrak predikat untuk mengirim token terkunci kepada pengguna.

4. Ambil kontrak ERC20Predicate sebagai contoh, yaitu, setelah menyatukan jumlah token untuk penerima, pengirim dan pengirim dari log, jumlah token yang diberikan akan dikirim kepada pengguna.

Menurut analisis kode sumber dari proses pesan rantai salib PoS Bridge, panggilan fungsi dari seluruh proses hanya dapat disebut oleh peran yang disebut oleh verifikasi, jadi keamanan rantai salib hanya dijamin oleh PoS (notari).

4  Cross chain messaging - Plasma Bridge

Jembatan Plasma juga termasuk dua fungsi: Deposit and Tariks. Proses spesifik ditampilkan dalam figur berikut:

Polygon Plasma sedikit berbeda dari implementasi Bitcoin Plasma MVP yang diperkenalkan dalam artikel pertama dari seri jembatan rantai salib kami, yang terutama menggunakan Plasma MoreVP berdasarkan model rekening. dibandingkan dengan Plasma, algoritma ini terutama diperbaiki dalam bagian tarik.

Karena transmisi token ERC20 dan ERC721 direalisasikan melalui log peristiwa yang mirip dengan UTXO Bitcoin, mari kita pertama memperkenalkan peristiwa ini:

  • Input1: bilangan rekening pengirim sebelum transfer

  • Input2: bilangan rekening penerima sebelum transfer

  • Output1: bilangan rekening pengirim setelah transfer

  • Output2: bilangan rekening penerima setelah transfer

Kedua, karena blok MVP Plasma asli dihasilkan oleh satu operator atau beberapa produser blok, ada dua skenario serangan pada Polygon:

Operator melakukan kejahatan:

Artikel sebelumnya(《Revisi keselamatan jaringan melintasi: Apa inspirasi yang diberikan Nomad perampokan decentralis kepada kita?\12299;) Disebutkan bahwa ketika transaksi pengguna dipaket sebagai blok Plasma oleh Operator, ada masalah ketidaktersedia data rantai luar. Oleh karena itu, jika pengguna keluar dari transaksi lama selama transaksi keluar, operator dapat menggunakan transaksi terbaru untuk menantang pengguna, dan tantangan akan berhasil. Pada saat yang sama, karena mekanisme titik pemeriksaan PoS digunakan di Plasma, jika operator berkumpul dengan verifier untuk melakukan kejahatan, bahkan dapat memalsukan beberapa transisi negara dan mengirimkannya ke Ethereum.

Pengguna melakukan kejahatan:

Setelah pengguna memulai transaksi keluar, dia terus menghabiskan token pada Polygon, mirip dengan bunga ganda rantai salib.

Untuk menghitung, algoritma Plasma MoreVp Polygon menggunakan algoritma lain untuk menghitung prioritas keluar, yaitu, keluar dari transaksi terbaru. Metode ini menggunakan peristiwa LogTransfer yang mirip dengan UTXO. Selama transaksi sah pengguna menggunakan input dan input yang tepat1 dan input2, meskipun beberapa transaksi jahat Operator dibungkus sebelum transaksi pengguna, transaksi pengguna dapat diproses dengan benar karena hanya berasal dari input yang sah. Kode pseudo yang relevan adalah seperti ini:

Deposit

Berikut adalah contoh bagaimana Alice menggunakan Jembatan Plasma untuk mengirim aset token dari rekening Ethereum ke rekening Polygon nya:

1. Pertama, pengguna juga perlu mengijinkan aset token untuk dipindahkan ke kontrak Polygon depositManager pada rantai utama (Ethereum) melalui fungsi persetujuan.

2. Setelah transaksi otorisasi dikonfirmasi, pengguna menelepon erc20token Fungsi deposit () memicu fungsi depositERC20ForUser () dari kontrak depositManager dan menyimpan aset token ERC20 dari pengguna.

3. Ketika jaringan utama Ethereum mengkonfirmasi transaksi deposit, ia akan kemudian menciptakan blok yang hanya mengandung transaksi ini, dan mengirimkannya ke kontrak childChain pada jaringan Polygon menggunakan mekanisme sinkronisasi negara. Mint jumlah uang yang sama dipetakan dan deposit pada rekening pengguna pada Polygon.

Perhatian: Menurut analisis kode sumber kontrak childChain, Plasma hanya mendukung tiga jenis, termasuk ETH, ERC20 dan ERC721.

Tarik

Ketika pengguna ingin menggunakan jembatan Plasma untuk mengekstrak aset dari Polygon ke Ethereum, mereka akan melalui langkah-langkah berikut:

1. Pengguna dapat membakar aset token yang dipetakan di rantai Polygon dengan memanggil fungsi tarik () koin yang dipetakan pada Polygon:

Anda juga dapat memanggil implementasi antarmuka withdrawStart () dari Klien Plasma pada Polygon.

2. Pengguna dapat memanggil fungsi startExitWithBurntTokens () dalam kontrak ERC20Predicate, yang pertama memanggil TarikManager VerifyInclusion () mengkonfirmasi apakah titik pemeriksaan mengandung transaksi tarik dan penerimaan yang sesuai. Kode adalah seperti berikut:

Setelah verifikasi lulus, Pengendali Tarik akan disebut AddExitToQueue() inserts them into the message queue by priority:

Akhirnya, addExitToQueue () panggilan_ AddExitToQueue () melemparkan NFT sebagai jaminan pembayaran:

3. 7 hari masa tantangan bagi pengguna

4. Setelah periode tantangan selesai, Anda dapat menelepon Pengurus Tarik Fungsi prosesExits () mengirim token ke pengguna.

Fungsi ini terutama dibagi menjadi dua langkah: pertama, konfirmasi apakah transaksi tarik dalam baris pesan telah melewati periode tantangan 7 hari. Jika telah melewati periode tantangan, hapus transaksi dari baris:

Selanjutnya, menilai apakah surat pembayaran NFT telah dihapus selama periode tantangan. Jika tidak, hancurkan NFT dan kembalikan aset yang sesuai kepada pengguna:

5  Polygon Plasma Bridge Double Flower Vulnerability

Pada 5 Oktober 2021, Gerhard Wagner, topi putih, mengajukan kelemahan Polygon, yang mungkin menyebabkan serangan bunga ganda, yang melibatkan jumlah 850 juta dolar.

Dalam perkenalan Jembatan Plasma di atas, kita tahu bahwa proses transaksi tarik lengkap adalah:

  1. Pengguna memulai transaksi tarik pada Polygon, yang akan membakar token pengguna dalam Polygon;

  2. Setelah interval titik pemeriksaan (sekitar 30 menit), tunggu transaksi penarikan akan termasuk di titik pemeriksaan;

  3. Lebih dari 2/3 dari verifier menandatangani nama mereka dan mengirimkannya ke Ethereum. Pada saat ini, pengguna memanggil startExitWithBurntTokens () dalam kontrak ERC20PredicateBurnOnly untuk verifikasi apakah titik pemeriksaan berisi transaksi membakar;

  4. Jika verifikasi lulus, surat kembalian NFT akan dipalsukan dan dikirim kepada pengguna

  5. Pengguna menunggu waktu tantangan 7 hari

  6. Panggilan Pengurus Pengunduran ProcessExits () menghancurkan NFT dan mengembalikannya kepada pengguna

Perhatian: Untuk mencegah transaksi ulang (serangan bunga ganda), Polygon menggunakan NFT sebagai jaminan pembayaran untuk mengidentifikasi transaksi tarik unik. Namun, karena kesalahan generasi ID dari NFT, penyerang dapat membuat parameter untuk menghasilkan beberapa NFT dengan ID yang berbeda dengan menggunakan transaksi tarik yang sama, dan kemudian menggunakan NFT ini untuk transaksi kembalian, sehingga menyadari "serangan bunga ganda".

Bagaimana menghasilkan NFT diterangkan secara rinci di bawah:

1. Dari analisis kode sumber di atas, addExitToQueue () akan memanggil_ AddExitToQueue () melempar NFT:

Ini dapat dilihat dari analisis transfer parameter yang exitid=prioritas, kemudian ID NFT dihasilkan dengan memindahkan prioritas usia yang tersisa satu bit di Jembatan Plasma.

2. Menurut analisis kode sumber di atas, usia adalah TarikManager Nilai kembalian dari fungsi verifyInclusion (). Fungsi ini akan pertama-tama verifikasi validitas transaksi tarik. Jika verifikasi lulus, usia yang sesuai akan dihasilkan. Dalam logika verifikasi, cabang nilai MaskBytes dikodeksi dari data parameter yang dapat dikendalikan digunakan:

Nilai ini juga digunakan ketika menghasilkan usia:

3. MerklePatriciaProof yang melacak panggilan dalam logika validasi transaksi Fungsi verifikasi () ditemukan untuk memanggil_ GetNibbleArray () transkode branchMaskBytes:

4. Lanjutkan melacak fungsi dekoding. Fungsi membuang beberapa nilai ketika mengkoding branchMaskBytes. Cara ini untuk kehilangan nilai akan menyebabkan nilai yang berbeda untuk mengkoding untuk mendapatkan nilai dekoding yang sama. Khususnya, jika bit heksadesimal pertama (setengah byte) dari nilai hp terkode masuk b adalah 1 atau 3, bit heksadesimal kedua akan diuji. Jika tidak, byte pertama diabaikan.

Jika penyerang membangun parameter cabang MaskBytes sehingga bit heksadesimal pertama tidak sama dengan 1 dan 3, ada 14 * 16=224 cara untuk mendapatkan nilai transkode yang sama.

Proses serangan spesifik adalah seperti ini:

  • Deposit sejumlah besar ETH/token ke Polygon melalui Plasma Polygon

  • Lanjutkan transaksi tarik pada Polygon dan tunggu waktu tantangan 7 hari

  • Modify the first byte of the branchMaskBytes parameter in the withdraw transaction (the same valid transaction can be resubmitted for up to 223 times), and initiate the Tarik transaction repeatedly

Sejujurnya, kelemahan ini terutama disebabkan masalah dalam desain algoritma ID NFT yang menghasilkan voucher kembalian untuk mencegah kembali, yang menyebabkan NFT yang berbeda yang dihasilkan dari transaksi kembalian yang sama, yang menyebabkan serangan bunga ganda. Dibuktikan bahwa byte pertama dari topeng cabang terkode harus selalu 0x00. Pembetulan adalah untuk memeriksa apakah byte pertama dari topeng cabang terkode adalah 0x00 dan tidak memperlakukan sebagai topeng yang salah.

Titel asli: Penelitian tentang Keselamatan Jembatan Rantai (III) [UNK] Polygon Warrior Polygon Safety Dialysis, How to Prevent the Opening of Pandora's Box

Ditulis oleh: Chengdu Lian'an

Sumber: Foresight News