Oleh BlockSec

Pada tanggal 08 November 2022, kami mendeteksi bahwa beberapa serangan berhasil menguras aset dari kumpulan yang dibangun di atas kontrak resmi KashiPairMediumRiskV1 Sushi (atau beberapa kontrak yang merupakan cabang dari kontrak tersebut). Setelah diselidiki, kami menemukan bahwa akar masalahnya disebabkan oleh bug logika yang menyebabkan kesalahan perhitungan harga token.

Kami segera menghubungi tim keamanan Sushi, dan mereka mengkonfirmasi temuan kami. Hal baiknya adalah mereka mengambil tindakan untuk melindungi beberapa kumpulan yang berharga namun rentan agar tidak diserang. Selain itu, mereka juga menyediakan prosedur untuk memberi kompensasi kepada mereka yang kehilangan dana akibat eksploitasi tersebut. Oleh karena itu, kami kini yakin bahwa sudah aman untuk mengungkapkan rincian tentang kerentanan dan serangan tersebut. Dalam laporan ini, kami ingin memberikan analisis mendetail.

Analisis Kerentanan

Setelah menganalisis kode sumber kontrak KashiPairMediumRiskV1, kami menyimpulkan bahwa bug ini terletak pada fungsi peminjaman, yang menggunakan exchangeRate yang sudah tidak berlaku lagi untuk memverifikasi bagian yang dipinjam dalam pengubah pelarut. Secara khusus, verifikasi akan dilakukan berdasarkan nilai exchangeRate saat ini dalam fungsi _isSolvent.

Saat berada dalam fungsi liquidate, fungsi updateExchangeRate dipanggil di awal. Oleh karena itu, verifikasi dan perhitungan akan dilakukan berdasarkan nilai yang diperbarui.

Jelas, bug ini dapat dimanfaatkan untuk menyebabkan perbedaan harga (yang besar).

Analisis Serangan

Kami mengamati dua serangan:

  1. https://etherscan.io/tx/0xcf8f242ea83100b6d43e659f7f53a698d304fc6ac2ca6fe79e3e07ee05fefe58: korban menggunakan kontrak KashiPairMediumRiskV1, dan kerugiannya sekitar 9.466 USDC.

  2. https://etherscan.io/tx/0x3d163bfbec5686d428a6d43e45e2626a220cc4fcfac7620c620b82c1f2537c78: korbannya adalah kontrak strategi yang menggunakan CauldronMediumRiskV1 (cabang dari KashiPairMediumRiskV1), dan kerugiannya sekitar 110.911 MIM.

Perlu dicatat, transaksi serangan pertama diluncurkan oleh bot yang menjalankan terlebih dahulu transaksi serangan asli: https://etherscan.io/tx/0x7a845d8d2af7919f5b9e22dd5571305cb5347d17986a8402715c1463d515fc18, dan alamat penyerang asli adalah 0xb7ea0f0f8c6df7a61bf024db21bbe85ac5688005.

Di sini kita mengambil transaksi serangan pertama sebagai contoh, yang terdiri dari langkah-langkah berikut:

  1. Meminjam flashloan sebesar 40.900 BADGER dan 121.904 USDC dari Balancer.

  2. Menyetorkan 40.900 BADGER dan 113.599 USDC ke BentoBox.

  3. Memanggil fungsi addCollateral kmBADGER/USDC-LINK untuk menyetorkan 40.900.000.000.000.000.000.000.000 saham BADGER.

  4. Memanggil fungsi addAsset kmBADGER/USDC-LINK untuk menyetorkan 112.529.000.000 saham USDC.

  5. Memanggil fungsi pinjam untuk meminjam 120.755.095.093 saham USDC.

  6. Memanggil fungsi UpdateExchangeRate.

  7. Memanggil fungsi liquidate untuk melikuidasi dirinya sendiri.

  8. Tarik 40.899 BADGER dan 123.006 USDC dari BentoBox.

  9. Membayar kembali pinjaman kilat dan memperoleh keuntungan sekitar 9466 USDC.

Perhatikan bahwa langkah 6 tidak diperlukan, karena fungsi pinjam akan memanggil fungsi UpdateExchangeRate.

Langkah-langkah utamanya adalah sebagai berikut:Tidak sulit untuk mengetahui bahwa nilai exchangeRate yang digunakan dalam fungsi pinjam berbeda dari nilai yang digunakan dalam fungsi likuidasi:

  • Dalam fungsi pinjam: 250.997.938.545.109.237.740.214.705.193

  • Dalam fungsi likuidasi: 328.266.883.541.864.569.505.752.156.794

Dampak

Ada lusinan pool (baik di Ethereum maupun BSC) yang mungkin terpengaruh oleh bug ini. Metode sementara untuk mengurangi masalah ini adalah mengurangi atau menghilangkan penyimpangan dengan memanggil fungsi UpdateExchangeRate sesekali (atau secara berkala). Metode ini telah diadopsi oleh banyak proyek yang terpengaruh dan transaksi terkait dapat diamati secara langsung.