Topik trending
#
Bonk Eco continues to show strength amid $USELESS rally
#
Pump.fun to raise $1B token sale, traders speculating on airdrop
#
Boop.Fun leading the way with a new launchpad on Solana.
Selamat datang kembali di Sorotan Kerentanan Sherlock, di mana kami menyoroti kerentanan berdampak yang terungkap selama audit Sherlock.
Minggu ini, kami memeriksa perhitungan tingkat agunan yang salah yang ditemukan dalam kontes @plaza_finance oleh @0xadrii, @KupiaSecurity, @f,
@farman1094_, dan @0xnovaman33.

Ringkasan Kerentanan:
Di getRedeemAmount(...), kontrak menghitung tingkat agunan untuk penebusan BOND menggunakan status pasca-perdagangan:
Kode saat ini (rentan)
jaminanLevel =
((tvl - (depositAmount * BOND_TARGET_PRICE)) * PRECISION)
/ ((obligasi - depositAmount) * BOND_TARGET_PRICE);
Karena penetapan harga penebusan kemudian menggunakan perkiraan collateralLevel ini untuk memutuskan apakah akan membayar harga maksimum ($100), penyerang dapat membeli BOND dengan tingkat pembuatan campuran (terkadang diskonto) hingga level jaminan (saat ini) turun ≤ 1,2, dan kemudian menebus semua BOND pada batas $100—menghitung dengan depositAmount yang dibuat yang mendorong perkiraan level agunan kembali ke atas 1,2. Ini memungkinkan penyerang mengekstrak ETH ("spread bebas risiko") hingga level jaminan pool saat ini mencapai ambang batas.
Langkah Serangan:
1) Fase Pengaturan
Parameter contoh kumpulan:
- poolReserve = 120 ETH, bondSupply = 3000, levSupply = 200, harga ETH = $3075
Aturan harga:
Buat (beli) OBLIGASI:
- Jika jaminanLevel ≤ 1.2: creationRate = tvl * 0.8 / bondSupply
- Else: creationRate = $100
Menebus (menjual) OBLIGASI:
- Jika perkiraan aguranLevel ≤ 1,2: redeemRate = tvl * 0,8 / bondSupply
- Else: redeemRate = $100
2) Fase A – Beli BOND dengan kurs campuran/diskon
- Beli BOND sambil memantau agunan (saat ini)Level = tvl / (bondSupply * 100).
- Pembelian pertama terjadi saat jaminanLevel > 1,2 → mencetak mendekati $100 per BOND.
- Pembelian berikutnya mendorong collateralLevel saat ini di bawah 1,2 → mencetak pada tingkat penciptaan diskon (misalnya, ~$94,07 in), mengakumulasi saldo BOND yang besar dengan murah.
3) Fase B – Tukarkan semua BOND dengan harga maksimal
- Nebus panggilan (BOND, depositAmount = attackerBondBalance, ...)
- Kontrak menghitung perkiraan tingkat agunan menggunakan status pasca-penebusan (bondSupply - depositAmount) dan (tvl - depositAmount * 100) dan (dalam contoh) mendapatkan nilai > 1,2
- Karena perkiraan nilai tersebut melebihi ambang batas, redeemRate ditetapkan ke maksimum $100, memungkinkan penyerang untuk mencairkan semua akumulasi BOND seharga $100
4) Realisasi Keuntungan
- Selisih antara pembelian diskon dan penjualan $100 menghasilkan laba ETH bersih.
- Dalam angka PoC: menghabiskan 60 ETH dalam dua pembelian mengembalikan ~61,89 ETH untuk penebusan → ~1,89 keuntungan ETH.
- Penyerang dapat melakukan iterasi hingga level agunan pool saat ini turun ke ~1,2, mengekstrak kira-kira: USD yang dapat diekstraksi ≈ ethPrice × poolReserve − 120 × bondSupply
Apa Dampaknya?
Ekstraksi dana langsung / kebocoran nilai: Penyerang mencetak dengan tarif diskon dan menebus seharga $100, menyedot ETH dari pool.
Tidak terbatas hingga ambang batas: Dapat berlanjut hingga tingkat jaminan kumpulan saat ini menyusut menjadi ≈ 1,2.
Inkonsistensi penetapan harga sistemik: Menciptakan arbitrase yang dibayar pengguna yang jujur melalui cadangan/hasil kumpulan yang lebih buruk.
Akar penyebabnya:
Penggunaan status pasca-perdagangan untuk penebusan harga
Kode menghitung collateralLevel seolah-olah penebusan sudah terjadi:
kegunaan (tvl - depositAmount*100) dan (bondSupply - depositAmount)
jaminanLevel =
((tvl - (depositAmount * BOND_TARGET_PRICE)) * PRECISION)
/ ((obligasi - depositAmount) * BOND_TARGET_PRICE);
1. Ini memungkinkan penyerang memilih depositAmount sehingga perkiraan level melewati ambang batas (> 1.2), membuka kunci redeemRate $100, bahkan ketika status pool saat ini tidak akan membenarkannya.
2. Ambang batas pada metrik yang dimanipulasi
Keputusan batas $100 tergantung pada tingkat perkiraan agunan yang dapat dimanipulasi ini daripada tingkat (pra-perdagangan) saat ini, memungkinkan permainan harga.
Mitigasi:
Hitung harga penukaran dari status kumpulan saat ini, bukan perkiraan saldo pasca-penebusan. Perbaikan yang disarankan proyek adalah benar:
- collateralLevel = ((tvl - (depositAmount * BOND_TARGET_PRICE)) * PRECISION)
- / ((obligSupply - depositAmount) * BOND_TARGET_PRICE);
+ collateralLevel = (tvl * PRECISION) / (bondSupply * BOND_TARGET_PRICE);
Pengerasan tambahan (disarankan):
1. Harga monoton: Pastikan harga redeem tidak meningkat seiring dengan peningkatan depositAmount (tidak ada "jual lebih banyak, dapatkan harga satuan yang lebih baik").
2. Penetapan harga berbasis invarian: Turunkan buat/tukarkan dari satu invarian sehingga simetri beli/jual mencegah arbitrase sepihak.
3. Pemeriksaan slippage: Memerlukan tarif min/maksimum yang disediakan pengguna untuk membuat dan menukarkan.
4. Cap & throttle: Batas penukaran per-tx dan per-blok untuk membatasi kerusakan jika ambang batas didekati.
5. Konsistensi di seluruh jalur: Sejajarkan jalur buat dan redeem untuk menggunakan definisi tingkat jaminan yang sama (hanya status saat ini).
Kami bangga telah membantu mengamankan @plaza_finance melalui penemuan ini.
Ketika benar-benar perlu aman, Sherlock adalah pilihan yang tepat.
3,28K
Teratas
Peringkat
Favorit

