Penulis: Victory & Lisa
Latar belakang
22 Mei, menurut berita komunitas, penyedia likuiditas Cetus di ekosistem SUI diduga diserang, kedalaman kolam likuiditas turun drastis, beberapa pasangan token di Cetus mengalami penurunan, diperkirakan kerugian melebihi 230 juta dolar AS. Setelah itu, Cetus mengeluarkan pengumuman yang menyatakan: “Kami mendeteksi sebuah kejadian di protokol kami, untuk keamanan, kontrak pintar telah dihentikan sementara. Saat ini, tim sedang menyelidiki kejadian tersebut. Kami akan segera merilis pernyataan penyelidikan lebih lanjut.”
Setelah kejadian, tim keamanan SlowMist segera terlibat dalam analisis dan mengeluarkan peringatan keamanan. Berikut adalah analisis rinci tentang teknik serangan dan situasi pemindahan dana.

(https://x.com/CetusProtocol/status/1925515662346404024)
Informasi terkait
Salah satu transaksi serangan:
https://suiscan.xyz/mainnet/tx/DVMG3B2kocLEnVMDuQzTYRgjwuuFSfciawPvXXheB3x
Alamat penyerang:
0xe28b50cef1d633ea43d3296a3f6b67ff0312a5f1a99f0af753c85b8b5de8ff06
Alamat kolam yang diserang:
0x871d8a227114f375170f149f7e9d45be822dd003eba225e83c05ac80828596bc
Token yang terlibat:
haSUI / SUI
Analisis serangan
Inti dari kejadian ini adalah penyerang dengan hati-hati menyusun parameter sehingga overflow terjadi tetapi dapat menghindari deteksi, akhirnya dengan jumlah Token yang sangat kecil dapat menukar aset likuiditas yang sangat besar, berikut adalah analisis langkah-langkah konkret:

1. Penyerang pertama-tama meminjam 10.024.321,28 haSUI melalui pinjaman kilat, menyebabkan harga kolam jatuh dari 18.956.530.795.606.879.104 hingga 18.425.720.184762886, penurunan harga mencapai 99,90%.

2. Penyerang dengan hati-hati memilih rentang harga yang sangat sempit untuk membuka posisi likuiditas:
Batas bawah Tick: 300000 (harga: 60.257.519.765.924.248.467.716.150)
Batas atas Tick: 300200 (harga: 60.863.087.478.126.617.965.993.239)
Lebar rentang harga: hanya 1,00496621%
3. Kemudian adalah inti dari serangan ini, penyerang menyatakan ingin menambahkan likuiditas besar sebesar 10.365.647.984.364.446.732.462.244.378.333.008 unit, tetapi karena adanya celah, sistem hanya mengenakan 1 token A.

Mari kita analisis mengapa penyerang dapat menukar 1 Token untuk likuiditas yang sangat besar. Penyebab inti adalah adanya celah bypass deteksi overflow pada checked_shlw di fungsi get_delta_a. Penyerang memanfaatkan hal ini, menyebabkan sistem mengalami deviasi serius saat menghitung berapa banyak haSUI yang sebenarnya diperlukan untuk ditambahkan. Karena overflow tidak terdeteksi, sistem salah menilai jumlah haSUI yang diperlukan, menyebabkan penyerang hanya perlu sedikit Token untuk menukarkan sejumlah besar aset likuiditas, sehingga melakukan serangan.
Ketika sistem menghitung berapa banyak haSUI yang diperlukan untuk menambahkan likuiditas yang begitu besar:

Kunci di sini adalah bahwa implementasi fungsi checked_shlw memiliki cacat serius. Faktanya, setiap nilai input yang kurang dari 0xffffffffffffffff << 192 akan menghindari deteksi overflow. Namun, ketika nilai-nilai ini digeser ke kiri 64 bit, hasilnya akan melebihi rentang representasi u256, pada saat itu data tinggi terpotong, menghasilkan hasil yang jauh lebih kecil dari nilai teoritis. Dengan cara ini, sistem akan meremehkan jumlah haSUI yang diperlukan dalam perhitungan selanjutnya.

Mask yang salah: 0xffffffffffffffff << 192= nilai yang sangat besar (sekitar 2^256-2^192)
Hampir semua input lebih kecil dari mask ini, menghindari deteksi overflow
Masalah sebenarnya: ketika n >= 2^192, n << 64 akan melebihi rentang u256 dan terpotong
Nilai tengah yang dibangun oleh penyerang liquidity * sqrt_price_diff = 6277101735386680763835789423207666908085499738337898853712:
Lebih kecil dari mask yang salah, menghindari deteksi overflow
Tetapi setelah pergeseran kiri 64 bit akan melebihi nilai maksimum u256, menyebabkan bagian yang terlampaui terpotong
Menyebabkan hasil perhitungan akhir kurang dari 1, tetapi karena pembulatan ke atas, hasil bagi yang dihitung sama dengan 1

4. Akhirnya penyerang menghapus likuiditas, memperoleh keuntungan token yang besar:
Penghapusan pertama: memperoleh 10.024.321,28 haSUI
Penghapusan kedua: memperoleh 1 haSUI
Penghapusan ketiga: memperoleh 10.024.321,28 haSUI

5. Penyerang mengembalikan pinjaman kilat, dengan keuntungan bersih sekitar 10.024.321,28 haSUI dan 5.765.124,79 SUI, serangan selesai.
Situasi perbaikan pihak proyek
Setelah serangan terjadi, Cetus mengeluarkan patch perbaikan. Kode perbaikan spesifik dapat dilihat di: https://github.com/CetusProtocol/integer-mate/pull/7/files#diff-c04eb6ebebbabb80342cd953bc63925e1c1cdc7ae1fb572f4aad240288a69409.
Fungsi checked_shlw yang telah diperbaiki adalah sebagai berikut:

Keterangan perbaikan:
Perbaiki mask yang salah 0xffffffffffffffff << 192 menjadi ambang batas yang benar 1 << 192
Perbaiki kondisi dari n > mask menjadi n >= mask
Pastikan saat pergeseran kiri 64 bit mungkin menyebabkan overflow, dapat mendeteksi dan mengembalikan tanda overflow dengan benar
Analisis MistTrack
Menurut analisis, penyerang 0xe28b50cef1d633ea43d3296a3f6b67ff0312a5f1a99f0af753c85b8b5de8ff06 memperoleh keuntungan sekitar 230 juta dolar AS, termasuk berbagai aset SUI, vSUI, USDC, dll.

Kami menemukan bahwa penyerang telah mempersiapkan Gas Fee dua hari yang lalu, dan melakukan percobaan sebelum serangan, tetapi gagal:

Setelah memperoleh keuntungan, penyerang mentransfer sebagian dana seperti
USDC, SOL, suiETH melalui jembatan lintas rantai seperti Sui Bridge, Circle, Wormhole, Mayan lintas rantai ke alamat EVM 0x89012a55cd6b88e407c9d4ae9b3425f55924919b:

Di mana, 5.2341 WBNB lintas rantai ke alamat BSC 0x89012a55cd6b88e407c9d4ae9b3425f55924919b:

Kemudian, penyerang mentransfer nilai
10 juta dolar AS aset disimpan di Suilend:

Penyerang juga mentransfer 24.022.896 SUI ke alamat baru 0xcd8962dad278d8b50fa0f9eb0186bfa4cbdecc6d59377214, saat ini belum ditransfer:

Beruntung, menurut Cetus, dengan kerjasama Yayasan SUI dan anggota ekosistem lainnya, saat ini telah berhasil membekukan dana yang dicuri sebesar 162 juta dolar AS di SUI.

(https://x.com/CetusProtocol/status/1925567348586815622)
Selanjutnya, kami menggunakan alat analisis anti-pencucian uang dan pelacakan MistTrack untuk menganalisis alamat 0x89012a55cd6b88e407c9d4ae9b3425f55924919b yang menerima dana lintas rantai di EVM.
Alamat tersebut di BSC menerima 5.2319 BNB, belum ditransfer:

Alamat tersebut di Ethereum menerima 3.000 USDT, 40.880.000 USDC, 1.771 SOL dan 8.130,4 ETH.
Di mana, USDT, USDC, dan SOL ditukar menjadi ETH melalui CoW Swap, ParaSwap, dll:


Kemudian, alamat tersebut mentransfer 20.000 ETH ke alamat 0x0251536bfcf144b88e1afa8fe60184ffdb4caf16, belum ditransfer:

Saat ini alamat tersebut memiliki saldo 3.244 ETH di Ethereum:

MistTrack telah menambahkan alamat terkait di atas ke dalam database alamat jahat, dan kami akan terus memantau saldo alamat tersebut.
Kesimpulan
Serangan ini menunjukkan kekuatan kerentanan overflow matematika. Penyerang memilih parameter tertentu dengan perhitungan yang tepat, memanfaatkan cacat fungsi checked_shlw, sehingga dengan biaya 1 token dapat memperoleh likuiditas senilai miliaran. Ini adalah serangan matematika yang sangat cermat, tim keamanan SlowMist menyarankan para pengembang untuk secara ketat memverifikasi semua kondisi batas fungsi matematika dalam pengembangan kontrak pintar.
