Pada tanggal 22 Agustus, Balancer secara resmi mengumumkan bahwa mereka telah menerima laporan kerentanan serius yang memengaruhi beberapa kumpulan V2 Boost. Hanya 1,4% dari TVL yang terpengaruh. Beberapa kumpulan telah ditangguhkan, dan pengguna diberitahu untuk menarik LP likuiditas sesegera mungkin. [1] [2]
Pada tanggal 27 Agustus, sistem SlowMist MistEye menemukan transaksi serangan yang diduga mengeksploitasi kerentanan Balancer. [3]
Karena pool tidak dapat ditangguhkan dan sejumlah dana masih terpengaruh oleh serangan tersebut, pejabat Balancer sekali lagi mengingatkan pengguna untuk mengambil LP di pool yang terkena dampak. [4] Selanjutnya, Balancer secara resmi merilis rincian kerentanan yang diungkapkan pada bulan Agustus di Medium. [5] , tim keamanan SlowMist mengulasnya, rinciannya sebagai berikut:
Perkenalan
Pejabat penyeimbang hanya menunjukkan dalam pengungkapannya bahwa masalahnya kali ini adalah pembulatan ke bawah dari kumpulan linier dan pasokan virtual dari kumpulan yang dapat digabungkan menyebabkan bptSupply menjadi 0. Pertama, mari kita pahami secara singkat isi protokol Balancer terkait kerentanan ini.
Gudang Penyeimbang V2
Penyeimbang V2 [6] Protokol ini adalah protokol pembuat pasar otomatis terdesentralisasi (AMM) berdasarkan Ethereum yang mewakili blok bangunan fleksibel untuk likuiditas yang dapat diprogram. Komponen intinya adalah kontrak Vault, yang menyimpan catatan semua kumpulan dan mengelola akuntansi dan transfer token, bahkan termasuk pengemasan dan pembongkaran ETH asli. Dengan kata lain, Vault diimplementasikan untuk memisahkan akuntansi dan pengelolaan token dari logika kumpulan.
Ada empat antarmuka di Vault, yaitu joinPool, exitPool, swap, dan batchSwap (bergabung, keluar, dan bertukar adalah panggilan terpisah, dan tidak ada kombinasi dalam satu panggilan). Salah satu fitur luar biasa adalah batchSwap, yang dapat mewujudkan beberapa pertukaran atom antara beberapa kumpulan dan menghubungkan output dari satu pertukaran kumpulan ke masukan dari kumpulan lain (GiveIn dan GiveOut). Sistem ini juga memperkenalkan pertukaran kilat [7] , mirip dengan pinjaman kilat internal.
Kolam LinierKolam Linier
Untuk meningkatkan efisiensi modal LP dan masalah overhead warp dan unwarp yang tinggi, Balancer meluncurkan kumpulan linier sebagai solusi di V2, sehingga memperkenalkan token BPT (ERC20 Balancer Pool Token).
kolam linier [8] Termasuk token utama (aset yang mendasari), token yang dibungkus (token yang dibungkus) dan token BPT, aset dan rekanan yang dibungkus dengan pengembalian dipertukarkan melalui nilai tukar yang diketahui. Semakin tinggi proporsi token yang dibungkus, semakin tinggi hasil dan efisiensi modal dari kumpulan tersebut. Selama proses warp, faktor penskalaan biasanya digunakan untuk memastikan bahwa token yang berbeda dihitung dengan akurasi yang sama.
Kolam KomposableKolam Komposable
Semua kumpulan Penyeimbang adalah kumpulan yang dapat disusun yang berisi token lain dan kumpulan itu sendiri juga memiliki tokennya sendiri. Diantaranya, mata uang BPT mengacu pada token kumpulan seimbang ERC20, yang merupakan dasar dari semua kumpulan. Pengguna dapat dengan bebas menggabungkan token BPT di kumpulan lain untuk penukaran. Penukaran selalu melibatkan kumpulan dan dua token: GiveIn dan GiveOut. In berarti mengirimkan token komponen dan menerima BPT, sedangkan Out berarti mengirimkan BPT dan menerima token komponen. Jika BPT sendiri merupakan token komponen maka dapat ditukarkan seperti token lainnya. Implementasi seperti ini merupakan jalur batchSwap sederhana antara aset dasar dan token di kumpulan eksternal. Pengguna dapat menggunakan BPT untuk menukar aset dasar dari kumpulan linier. Ini juga merupakan Kumpulan Peningkatan Penyeimbang. [9] Dasar.
Melalui kombinasi di atas, kumpulan gabungan Balancer terbentuk. Kumpulan stabil bb-a-USD yang dapat dikomposisi terdiri dari tiga kumpulan linier, sambil mengirimkan likuiditas menganggur ke protokol eksternal (Aave). Misalnya, bb-a-DAI adalah kumpulan linier yang berisi DAI dan waDAI (aDAI terbungkus). Saat pengguna perlu melakukan batchSwap (seperti mengubah USDT ke DAI), contoh jalur pertukarannya adalah sebagai berikut:
Di kumpulan linier USDT, tukarkan USDT dengan bb-a-USDT (masuk ke kumpulan linier USDT);
Dalam bb-a-USD, bb-a-USDT ditukar dengan bb-a-DAI (pertukaran antar BPT linier);
Pada pool linier DAI, bb-a-DAI ditukar dengan DAI (keluar dari pool linier DAI).
Setelah memahami secara singkat pengetahuan prasyarat di atas, kita masuk ke tautan analisis kerentanan.
analisis
Pada tanggal 27 Agustus, tim keamanan SlowMist menerima identifikasi dari sistem MistEye bahwa dugaan kerentanan Balancer telah dieksploitasi di alam liar. berdagang [3] sebagai berikut:
Penyerang pertama kali meminjam 300,000 USDC dari AAVE melalui pinjaman kilat. Kemudian operasi batchSwap Vault dipanggil untuk melakukan penghitungan pertukaran token BPT melalui kumpulan stabil gabungan kumpulan bb-a-USD. Terakhir, 94,508 USDC ditukar dengan 59,964 bb-a-USDC, 68,201 bb-a-DAI, dan 74,280 bb-a-USDT. Terakhir, token BPT yang diperoleh akan keluar dari pool melalui exitPool kontrak Vault dengan imbalan aset dasar, membayar kembali pinjaman kilat, dan meninggalkan pasar dengan keuntungan sekitar US$108.843,7.
Terlihat bahwa kunci serangan ini terletak pada batchSwap, dan apa sebenarnya yang terjadi di batchSwap? Mari kita lihat lebih dekat.
Selama seluruh proses batchSwap, penyerang pertama-tama menebus USDC di kumpulan bb-a-USDC, lalu menukar token BPT, menukar bb-a-USDC dengan bb-a-DAI, bb-a-USDT, dan USDC. Terakhir, token utama USDC ditukar dengan bb-a-USDT. Dengan kata lain, bb-a-USDC, sebagai token kunci BPT, berfungsi sebagai token komponen GiveOut dan GiveIn.
Pada langkah pertama, penyerang menukar token BPT dengan token utama USDC di kumpulan linier bb-a-USDC dengan faktor penskalaan tetap, dan jumlah yang meningkat dicatat dalam bptBalance di kumpulan tersebut. Namun setelah pertukaran onSwap kedua, kami menemukan bahwa nilai amountOut USDC yang ditukarkan adalah 0 selama proses pertukaran yang sama. Kenapa ini?
Menggali lebih dalam fungsi onSwap, kami menemukan bahwa dalam proses ini, akurasi akan diproses ke nominal dan faktor skala token terkait akan dihitung. Ketika fungsi _downscaleDown dipanggil berikutnya, jumlahOut dibulatkan ke bawah. Jika amountOut dan scalingFactors [indexOut] Perbedaan antara nilainya besar, dan nilai yang dihitung _downscaleDown adalah nol.
Artinya, saat kita menggunakan token BPT untuk menukarkan token utama, jika amountOut terlalu kecil, nilai yang dikembalikan akan dibulatkan ke bawah menjadi nol, dan nilai ini kurang dari 1e12 yang dihitung dengan scalingFactors. Namun, jumlah bb-a-USDC yang masuk dari amountIn akan tetap ditambahkan ke jumlah virtual bptBalance, dan operasi ini akan meningkatkan saldo di kumpulan bb-a-USDC, yang dapat dianggap sebagai penambahan sepihak dari bb -Likuiditas-USDC.
Kemudian, dengan menggunakan karakteristik kumpulan stabil yang dapat digabungkan, melalui konversi timbal balik antara token BPT, pertama-tama tukarkan bb-a-USDC dengan token BPT lainnya. Untuk mengikuti proses pertukaran ini, Anda dapat menggabungkan jalur panggilan berikut dari kumpulan stabil: bb-a-DAI onSwap -> _swapGivenIn -> _onSwapGivenIn. Pertama, ganti bb-a-USDC dengan bb-a-DAI dan bb- a-USDT secara berurutan. Tidak seperti kumpulan linier online, kumpulan stabil yang dapat disusun memerlukan pembaruan cache nilai tukar sebelum operasi onSwap. Dari kode tersebut, kita dapat melihat bahwa di kumpulan kombinasi, onSwap terlebih dahulu akan menentukan apakah nilai tukar token yang di-cache perlu diperbarui.
Setelah pertukaran sebelumnya, jumlah bb-a-USDC telah berubah, dan jumlah total sebenarnya setelah nominalisasi melalui _toNominal adalah totalBalance 994,010,000,000, dan pasokan virtual token BPT adalah 20,000,000,000. Dapat dihitung bahwa nilai tukar yang diperbarui hampir 45 kali lipat dari nilai tukar cache asli kumpulan linier sebelumnya sebesar 1.100.443.876.587.504.549, yaitu 49.700.500.000.000.000.000.
Selanjutnya, bb-a-USDC ditukar dengan USDC di kumpulan linier. Namun penukaran kali ini sama dengan penukaran kedua, lagi-lagi menyebabkan amountOut dibulatkan ke bawah menjadi 0, dan jalur penukaran sama seperti sebelumnya.
Pertukaran selanjutnya adalah membalikkan USDC menjadi bb-a-USDC, dan jalur pertukarannya adalah onSwap -> onSwapGivenIn -> _swapGivenMainIn. Selama proses ini, kami menemukan bahwa saat menghitung jumlahKeluar yang perlu ditebus, penghitungan pasokan virtual didasarkan pada selisih antara total pasokan token BPT yang ditebus dan jumlah sisa di kumpulan, yaitu 0.
Hal ini karena bptSupply adalah 0, dan fungsi _toNominal dipanggil langsung saat menghitung BPT Keluar, dan pemanggilan jalur ini membuat rasio pertukaran USDC ke bb-a-USDC mendekati 1:1.
Ringkasan
batchSwap menghubungkan keluaran pertukaran satu kumpulan ke masukan kumpulan lain (tokenIn dan tokenOut) melalui beberapa pertukaran atom antara beberapa kumpulan, dan mengubah USDC menjadi token BPT. Dalam batchSwap ini, tidak ada transfer token yang sebenarnya terjadi, namun jumlah pertukaran akhir dikonfirmasi dengan mencatat jumlah yang ditransfer masuk dan keluar. Dan karena kumpulan linier dipertukarkan melalui token aset dasar, metode pertukarannya adalah menghitung Nilai melalui pasokan virtual dan algoritma tetap. Oleh karena itu, ada dua lubang keamanan di batchSwap:
Yang pertama adalah masalah pembulatan ke bawah dari kumpulan linier.Penyerang secara sepihak menambahkan token utama ke kumpulan melalui pembulatan untuk meningkatkan rasio token yang di-cache, sehingga memanipulasi nilai tukar token di kumpulan yang dapat disusun;
Kedua, karena karakteristik pasokan virtual dari kumpulan yang dapat digabungkan, pasokan virtual dihitung dengan mengurangkan saldo dalam kumpulan dari token BPT. Jika GiveIn adalah token BPT pada saat penukaran, bagian ini akan dikurangi dari yang berikutnya supply. , penyerang hanya perlu menukar BPT sebagai GiveIn, dan memanipulasi supplynya menjadi 0 terlebih dahulu, kemudian melakukan reverse swap, yaitu BPT kemudian digunakan sebagai GiveOut. Pada saat ini, karena supply adalah 0, maka algoritma akan mendekati 1: Rasio 1 lebih rendah dari rasio penebusan kumpulan linier untuk penebusan aktual, yang membuat jumlah token BPT GiveOut dimanipulasi secara tidak langsung.
Kita dapat menemukan bahwa kerentanan satu meningkatkan nilai tukar, sedangkan kerentanan dua menurunkan nilai tukar dengan arah sebaliknya.Penyerang memanfaatkan buff ganda untuk mendapatkan keuntungan dan pergi.
Tautan referensi:
[1]
[2]
[3]
[4]
[5]
[6]
[7]
[8]
[9]
Lihat Asli
Halaman ini mungkin berisi konten pihak ketiga, yang disediakan untuk tujuan informasi saja (bukan pernyataan/jaminan) dan tidak boleh dianggap sebagai dukungan terhadap pandangannya oleh Gate, atau sebagai nasihat keuangan atau profesional. Lihat Penafian untuk detailnya.
Analisis kerentanan penyeimbang
latar belakang
Pada tanggal 22 Agustus, Balancer secara resmi mengumumkan bahwa mereka telah menerima laporan kerentanan serius yang memengaruhi beberapa kumpulan V2 Boost. Hanya 1,4% dari TVL yang terpengaruh. Beberapa kumpulan telah ditangguhkan, dan pengguna diberitahu untuk menarik LP likuiditas sesegera mungkin. [1] [2]
Pada tanggal 27 Agustus, sistem SlowMist MistEye menemukan transaksi serangan yang diduga mengeksploitasi kerentanan Balancer. [3]
Karena pool tidak dapat ditangguhkan dan sejumlah dana masih terpengaruh oleh serangan tersebut, pejabat Balancer sekali lagi mengingatkan pengguna untuk mengambil LP di pool yang terkena dampak. [4] Selanjutnya, Balancer secara resmi merilis rincian kerentanan yang diungkapkan pada bulan Agustus di Medium. [5] , tim keamanan SlowMist mengulasnya, rinciannya sebagai berikut:
Perkenalan
Pejabat penyeimbang hanya menunjukkan dalam pengungkapannya bahwa masalahnya kali ini adalah pembulatan ke bawah dari kumpulan linier dan pasokan virtual dari kumpulan yang dapat digabungkan menyebabkan bptSupply menjadi 0. Pertama, mari kita pahami secara singkat isi protokol Balancer terkait kerentanan ini.
Gudang Penyeimbang V2
Penyeimbang V2 [6] Protokol ini adalah protokol pembuat pasar otomatis terdesentralisasi (AMM) berdasarkan Ethereum yang mewakili blok bangunan fleksibel untuk likuiditas yang dapat diprogram. Komponen intinya adalah kontrak Vault, yang menyimpan catatan semua kumpulan dan mengelola akuntansi dan transfer token, bahkan termasuk pengemasan dan pembongkaran ETH asli. Dengan kata lain, Vault diimplementasikan untuk memisahkan akuntansi dan pengelolaan token dari logika kumpulan.
Ada empat antarmuka di Vault, yaitu joinPool, exitPool, swap, dan batchSwap (bergabung, keluar, dan bertukar adalah panggilan terpisah, dan tidak ada kombinasi dalam satu panggilan). Salah satu fitur luar biasa adalah batchSwap, yang dapat mewujudkan beberapa pertukaran atom antara beberapa kumpulan dan menghubungkan output dari satu pertukaran kumpulan ke masukan dari kumpulan lain (GiveIn dan GiveOut). Sistem ini juga memperkenalkan pertukaran kilat [7] , mirip dengan pinjaman kilat internal.
Kolam LinierKolam Linier
Untuk meningkatkan efisiensi modal LP dan masalah overhead warp dan unwarp yang tinggi, Balancer meluncurkan kumpulan linier sebagai solusi di V2, sehingga memperkenalkan token BPT (ERC20 Balancer Pool Token).
kolam linier [8] Termasuk token utama (aset yang mendasari), token yang dibungkus (token yang dibungkus) dan token BPT, aset dan rekanan yang dibungkus dengan pengembalian dipertukarkan melalui nilai tukar yang diketahui. Semakin tinggi proporsi token yang dibungkus, semakin tinggi hasil dan efisiensi modal dari kumpulan tersebut. Selama proses warp, faktor penskalaan biasanya digunakan untuk memastikan bahwa token yang berbeda dihitung dengan akurasi yang sama.
Kolam KomposableKolam Komposable
Semua kumpulan Penyeimbang adalah kumpulan yang dapat disusun yang berisi token lain dan kumpulan itu sendiri juga memiliki tokennya sendiri. Diantaranya, mata uang BPT mengacu pada token kumpulan seimbang ERC20, yang merupakan dasar dari semua kumpulan. Pengguna dapat dengan bebas menggabungkan token BPT di kumpulan lain untuk penukaran. Penukaran selalu melibatkan kumpulan dan dua token: GiveIn dan GiveOut. In berarti mengirimkan token komponen dan menerima BPT, sedangkan Out berarti mengirimkan BPT dan menerima token komponen. Jika BPT sendiri merupakan token komponen maka dapat ditukarkan seperti token lainnya. Implementasi seperti ini merupakan jalur batchSwap sederhana antara aset dasar dan token di kumpulan eksternal. Pengguna dapat menggunakan BPT untuk menukar aset dasar dari kumpulan linier. Ini juga merupakan Kumpulan Peningkatan Penyeimbang. [9] Dasar.
Melalui kombinasi di atas, kumpulan gabungan Balancer terbentuk. Kumpulan stabil bb-a-USD yang dapat dikomposisi terdiri dari tiga kumpulan linier, sambil mengirimkan likuiditas menganggur ke protokol eksternal (Aave). Misalnya, bb-a-DAI adalah kumpulan linier yang berisi DAI dan waDAI (aDAI terbungkus). Saat pengguna perlu melakukan batchSwap (seperti mengubah USDT ke DAI), contoh jalur pertukarannya adalah sebagai berikut:
Di kumpulan linier USDT, tukarkan USDT dengan bb-a-USDT (masuk ke kumpulan linier USDT);
Dalam bb-a-USD, bb-a-USDT ditukar dengan bb-a-DAI (pertukaran antar BPT linier);
Pada pool linier DAI, bb-a-DAI ditukar dengan DAI (keluar dari pool linier DAI).
Setelah memahami secara singkat pengetahuan prasyarat di atas, kita masuk ke tautan analisis kerentanan.
analisis
Pada tanggal 27 Agustus, tim keamanan SlowMist menerima identifikasi dari sistem MistEye bahwa dugaan kerentanan Balancer telah dieksploitasi di alam liar. berdagang [3] sebagai berikut:
Penyerang pertama kali meminjam 300,000 USDC dari AAVE melalui pinjaman kilat. Kemudian operasi batchSwap Vault dipanggil untuk melakukan penghitungan pertukaran token BPT melalui kumpulan stabil gabungan kumpulan bb-a-USD. Terakhir, 94,508 USDC ditukar dengan 59,964 bb-a-USDC, 68,201 bb-a-DAI, dan 74,280 bb-a-USDT. Terakhir, token BPT yang diperoleh akan keluar dari pool melalui exitPool kontrak Vault dengan imbalan aset dasar, membayar kembali pinjaman kilat, dan meninggalkan pasar dengan keuntungan sekitar US$108.843,7.
Terlihat bahwa kunci serangan ini terletak pada batchSwap, dan apa sebenarnya yang terjadi di batchSwap? Mari kita lihat lebih dekat.
Selama seluruh proses batchSwap, penyerang pertama-tama menebus USDC di kumpulan bb-a-USDC, lalu menukar token BPT, menukar bb-a-USDC dengan bb-a-DAI, bb-a-USDT, dan USDC. Terakhir, token utama USDC ditukar dengan bb-a-USDT. Dengan kata lain, bb-a-USDC, sebagai token kunci BPT, berfungsi sebagai token komponen GiveOut dan GiveIn.
Pada langkah pertama, penyerang menukar token BPT dengan token utama USDC di kumpulan linier bb-a-USDC dengan faktor penskalaan tetap, dan jumlah yang meningkat dicatat dalam bptBalance di kumpulan tersebut. Namun setelah pertukaran onSwap kedua, kami menemukan bahwa nilai amountOut USDC yang ditukarkan adalah 0 selama proses pertukaran yang sama. Kenapa ini?
Menggali lebih dalam fungsi onSwap, kami menemukan bahwa dalam proses ini, akurasi akan diproses ke nominal dan faktor skala token terkait akan dihitung. Ketika fungsi _downscaleDown dipanggil berikutnya, jumlahOut dibulatkan ke bawah. Jika amountOut dan scalingFactors [indexOut] Perbedaan antara nilainya besar, dan nilai yang dihitung _downscaleDown adalah nol.
Artinya, saat kita menggunakan token BPT untuk menukarkan token utama, jika amountOut terlalu kecil, nilai yang dikembalikan akan dibulatkan ke bawah menjadi nol, dan nilai ini kurang dari 1e12 yang dihitung dengan scalingFactors. Namun, jumlah bb-a-USDC yang masuk dari amountIn akan tetap ditambahkan ke jumlah virtual bptBalance, dan operasi ini akan meningkatkan saldo di kumpulan bb-a-USDC, yang dapat dianggap sebagai penambahan sepihak dari bb -Likuiditas-USDC.
Kemudian, dengan menggunakan karakteristik kumpulan stabil yang dapat digabungkan, melalui konversi timbal balik antara token BPT, pertama-tama tukarkan bb-a-USDC dengan token BPT lainnya. Untuk mengikuti proses pertukaran ini, Anda dapat menggabungkan jalur panggilan berikut dari kumpulan stabil: bb-a-DAI onSwap -> _swapGivenIn -> _onSwapGivenIn. Pertama, ganti bb-a-USDC dengan bb-a-DAI dan bb- a-USDT secara berurutan. Tidak seperti kumpulan linier online, kumpulan stabil yang dapat disusun memerlukan pembaruan cache nilai tukar sebelum operasi onSwap. Dari kode tersebut, kita dapat melihat bahwa di kumpulan kombinasi, onSwap terlebih dahulu akan menentukan apakah nilai tukar token yang di-cache perlu diperbarui.
Setelah pertukaran sebelumnya, jumlah bb-a-USDC telah berubah, dan jumlah total sebenarnya setelah nominalisasi melalui _toNominal adalah totalBalance 994,010,000,000, dan pasokan virtual token BPT adalah 20,000,000,000. Dapat dihitung bahwa nilai tukar yang diperbarui hampir 45 kali lipat dari nilai tukar cache asli kumpulan linier sebelumnya sebesar 1.100.443.876.587.504.549, yaitu 49.700.500.000.000.000.000.
Selanjutnya, bb-a-USDC ditukar dengan USDC di kumpulan linier. Namun penukaran kali ini sama dengan penukaran kedua, lagi-lagi menyebabkan amountOut dibulatkan ke bawah menjadi 0, dan jalur penukaran sama seperti sebelumnya.
Pertukaran selanjutnya adalah membalikkan USDC menjadi bb-a-USDC, dan jalur pertukarannya adalah onSwap -> onSwapGivenIn -> _swapGivenMainIn. Selama proses ini, kami menemukan bahwa saat menghitung jumlahKeluar yang perlu ditebus, penghitungan pasokan virtual didasarkan pada selisih antara total pasokan token BPT yang ditebus dan jumlah sisa di kumpulan, yaitu 0.
Hal ini karena bptSupply adalah 0, dan fungsi _toNominal dipanggil langsung saat menghitung BPT Keluar, dan pemanggilan jalur ini membuat rasio pertukaran USDC ke bb-a-USDC mendekati 1:1.
Ringkasan
batchSwap menghubungkan keluaran pertukaran satu kumpulan ke masukan kumpulan lain (tokenIn dan tokenOut) melalui beberapa pertukaran atom antara beberapa kumpulan, dan mengubah USDC menjadi token BPT. Dalam batchSwap ini, tidak ada transfer token yang sebenarnya terjadi, namun jumlah pertukaran akhir dikonfirmasi dengan mencatat jumlah yang ditransfer masuk dan keluar. Dan karena kumpulan linier dipertukarkan melalui token aset dasar, metode pertukarannya adalah menghitung Nilai melalui pasokan virtual dan algoritma tetap. Oleh karena itu, ada dua lubang keamanan di batchSwap:
Yang pertama adalah masalah pembulatan ke bawah dari kumpulan linier.Penyerang secara sepihak menambahkan token utama ke kumpulan melalui pembulatan untuk meningkatkan rasio token yang di-cache, sehingga memanipulasi nilai tukar token di kumpulan yang dapat disusun;
Kedua, karena karakteristik pasokan virtual dari kumpulan yang dapat digabungkan, pasokan virtual dihitung dengan mengurangkan saldo dalam kumpulan dari token BPT. Jika GiveIn adalah token BPT pada saat penukaran, bagian ini akan dikurangi dari yang berikutnya supply. , penyerang hanya perlu menukar BPT sebagai GiveIn, dan memanipulasi supplynya menjadi 0 terlebih dahulu, kemudian melakukan reverse swap, yaitu BPT kemudian digunakan sebagai GiveOut. Pada saat ini, karena supply adalah 0, maka algoritma akan mendekati 1: Rasio 1 lebih rendah dari rasio penebusan kumpulan linier untuk penebusan aktual, yang membuat jumlah token BPT GiveOut dimanipulasi secara tidak langsung.
Kita dapat menemukan bahwa kerentanan satu meningkatkan nilai tukar, sedangkan kerentanan dua menurunkan nilai tukar dengan arah sebaliknya.Penyerang memanfaatkan buff ganda untuk mendapatkan keuntungan dan pergi.
Tautan referensi:
[1]
[2]
[3]
[4]
[5]
[6]
[7]
[8]
[9]