Original Article Title: " Analisis Teknis Kerentanan Peretasan Balancer $120M"
Original Source: ExVul Security
Pada 3 November 2025, protokol Balancer diserang di beberapa chain termasuk Arbitrum dan Ethereum, yang mengakibatkan kerugian aset sebesar $120 juta. Serangan ini terutama disebabkan oleh kerentanan ganda yang melibatkan kehilangan presisi dan manipulasi Invariant.
Infrastruktur Chainlink telah lama mempertahankan standar tertinggi di ranah Web3, menjadikannya pilihan alami untuk X Layer, yang didedikasikan untuk menyediakan alat tingkat institusional bagi para pengembang.
Masalah utama dalam serangan ini terletak pada logika protokol dalam menangani transaksi kecil. Ketika pengguna melakukan pertukaran dengan jumlah kecil, protokol memanggil fungsi _upscaleArray, yang menggunakan mulDown untuk pembulatan ke bawah. Ketika saldo dalam transaksi dan jumlah input keduanya mencapai batas pembulatan tertentu (misalnya, kisaran 8-9 wei), terjadi kesalahan presisi relatif yang signifikan.
Kesalahan presisi ini diteruskan ke perhitungan nilai Invariant D protokol, menyebabkan pengurangan nilai D yang tidak normal. Fluktuasi nilai D secara langsung menurunkan harga Balancer Pool Token (BPT) dalam protokol Balancer. Peretas memanfaatkan harga BPT yang ditekan ini melalui jalur perdagangan yang telah direncanakan untuk melakukan arbitrase, yang pada akhirnya menyebabkan kerugian aset besar-besaran.
Transaksi yang Dieksploitasi:
https://etherscan.io/tx/0x6ed07db1a9fe5c0794d44cd36081d6a6df103fab868cdd75d581e3bd23bc9742
Transaksi Transfer Aset:
https://etherscan.io/tx/0xd155207261712c35fa3d472ed1e51bfcd816e616dd4f517fa5959836f5b48569
Titik masuk serangan adalah kontrak Balancer: Vault, dengan fungsi masuk yang sesuai adalah fungsi batchSwap, yang secara internal memanggil onSwap untuk pertukaran token.

Dari perspektif parameter dan pembatasan fungsi, beberapa informasi dapat diperoleh:
1. Penyerang harus memanggil fungsi ini melalui Vault dan tidak dapat memanggilnya secara langsung.
2. Fungsi ini secara internal akan memanggil _scalingFactors() untuk mendapatkan faktor skala untuk operasi penskalaan.
3. Operasi penskalaan terkonsentrasi di _swapGivenIn atau _swapGivenOut.
Dalam model stable pool Balancer, Harga BPT adalah titik referensi penting yang menentukan berapa banyak BPT yang diterima pengguna dan berapa banyak aset yang diterima setiap BPT.

Dalam perhitungan pertukaran pool:

Bagian yang berfungsi sebagai jangkar Harga BPT adalah nilai D yang tidak dapat diubah, yang berarti mengendalikan Harga BPT memerlukan pengendalian D. Mari kita analisis lebih lanjut proses perhitungan D:

Pada kode di atas, proses perhitungan D bergantung pada array saldo yang telah diskalakan. Ini berarti diperlukan operasi untuk mengubah presisi saldo-saldo ini, yang menyebabkan perhitungan D menjadi salah.

Operasi Penskalaan:

Seperti yang ditunjukkan di atas, saat melewati _upscaleArray, jika saldo sangat kecil (misalnya, 8-9 wei), pembulatan ke bawah pada mulDown akan menyebabkan kehilangan presisi yang signifikan.



Di atas, penyerang menggunakan Batch Swap untuk melakukan beberapa pertukaran dalam satu transaksi:
1. Pertukaran Pertama: BPT → cbETH (penyesuaian saldo)
2. Pertukaran Kedua: wstETH (8) → cbETH (memicu kehilangan presisi)
3. Pertukaran Ketiga: Aset Dasar → BPT (pengambilan keuntungan)
Semua pertukaran ini terjadi dalam transaksi batch swap yang sama, berbagi status saldo yang sama, namun setiap pertukaran memanggil _upscaleArray untuk memodifikasi array saldo.
Proses utama dimulai oleh Vault. Bagaimana ini menyebabkan akumulasi kehilangan presisi? Jawabannya terletak pada mekanisme pengoperan array saldo.

Melihat kode di atas, meskipun Vault membuat array currentBalances baru setiap kali onSwap dipanggil, dalam Batch Swap:
1. Setelah swap pertama, saldo diperbarui (tetapi karena kehilangan presisi, nilai yang diperbarui mungkin tidak akurat)
2. Swap kedua melanjutkan perhitungan berdasarkan hasil swap pertama
3. Kehilangan presisi terakumulasi, akhirnya menyebabkan nilai invariant D menurun secara signifikan

Serangan pada Balancer dapat dirangkum karena alasan berikut:
1. Fungsi Penskalaan Menggunakan Pembulatan ke Bawah: _upscaleArray menggunakan mulDown untuk penskalaan, yang menyebabkan kehilangan presisi relatif yang signifikan ketika saldo sangat kecil (misalnya, 8-9 wei).
2. Perhitungan Nilai Invariant Sangat Sensitif terhadap Presisi: Perhitungan nilai invariant D bergantung pada array saldo yang telah diskalakan, dan kehilangan presisi secara langsung mempengaruhi perhitungan D, menyebabkan D menurun.
3. Tidak Ada Validasi Perubahan Nilai Invariant: Selama proses swap, tidak ada validasi untuk memastikan bahwa perubahan nilai invariant D berada dalam rentang yang wajar, sehingga penyerang dapat berulang kali mengeksploitasi kehilangan presisi untuk menekan harga BPT.
4. Akumulasi Kehilangan Presisi dalam Batch Swap: Dalam batch swap yang sama, kehilangan presisi dari beberapa swap terakumulasi dan akhirnya menyebabkan kerugian finansial yang signifikan.
Kedua masalah ini—kehilangan presisi dan kurangnya validasi—dikombinasikan dengan desain kondisi batas yang cermat oleh penyerang, menyebabkan kerugian ini.