ikon_instal_ios_web ikon_instal_ios_web ikon_instal_android_web

Analisis Serangan Pencurian Yearn $9M

Analisis5 bulan yang lalu发布 Wyatt
26,164 0

Kata Pengantar

Serangan ini menggunakan pinjaman kilat sebagai leverage pendanaan awal dan menerobos pertahanan protokol lapis demi lapis melalui beberapa langkah. Proses serangan inti dapat dibagi menjadi empat tahap utama: persiapan pendanaan, manipulasi keadaan, pencetakan tak terbatas, dan pengambilan keuntungan. Setiap tahap saling berhubungan dan secara tepat mengeksploitasi kerentanan logis dalam desain protokol.

Serangan terhadap Tencent : https://etherscan.io/tx/0x53fe7ef190c34d810c50fb66f0fc65a1ceedc10309cf4b4013d64042a0331156

Analisis Teknis

Pertama, kami meminjam wstETH, rETH, WETH dan 0xa35b_ETHx, rETH, wstETH, cbETH masing-masing dari Balancer dan Aave melalui dua kali pinjaman kilat.

Analisis Serangan Pencurian Yearn M

Analisis Serangan Pencurian Yearn M

Dalam fungsi flash loan callback, ETH yang dipinjam disimpan ke dalam Tornado.Cash: 100 ETH untuk dicampurkan dengan 1100 ETH. Kemudian, fungsi Tornado.Cash: 100 ETHwithdraw digunakan untuk menarik 100 ETH ke kontrak berbahaya 0x3e8e7533dcf69c698Cf806C3DB22f7f10B9B0b97 dan memicu fungsi fallback.

Analisis Serangan Pencurian Yearn M

Analisis Serangan Pencurian Yearn M

Pada fungsi fallack, kita dapat melihat bahwa pertukaran terakhir pada gambar di bawah ini sama dengan nilai remove_liquiditas pada langkah berikutnya. Dapat disimpulkan bahwa langkah-langkah sebelumnya adalah untuk menukar aset yang diperoleh dari flash loan menjadi sejumlah besar token LP pool stableswap berbobot yETH melalui operasi seperti pertukaran, sebagai persiapan untuk serangan berikutnya.

Analisis Serangan Pencurian Yearn M

Pada titik ini, proses serangan inti secara resmi dimulai.

1. Pertama, semua token LP yang diperoleh dari pertukaran di atas dihancurkan dan dikonversi menjadi 8 aset dasar dalam pool sesuai dengan alokasi saham melalui fungsi remove_liquiditas dari pool stableswap tertimbang yETH.

Logika fungsi remove_liquiditas dapat dipahami sebagai berikut: dengan asumsi ada total 10.000 token LP di dalam pool, dan Anda menghancurkan 416,37 token LP, maka proporsinya adalah: 416,37 / 10.000 = 4,16%.

Kemudian, untuk setiap aset, dengan asumsi ada 1.000 wstETH (saldo virtual prev_vb) di dalam pool, saldo virtual yang dapat Anda tarik adalah: dvb = 1.000 * 416,37 / 10.000 = 41,637 wstETH, yang kemudian dibagi dengan nilai tukar untuk dikonversi ke jumlah token yang sebenarnya.

2. Kedua, dengan berulang kali memanggil `add_liquiditas`, sebuah pool satu sisi akan diinjeksikan. Ada total 8 parameter `_amount`, masing-masing sesuai dengan jumlah aset berbeda yang akan disuntikkan. Terlihat bahwa pada loop sebelumnya, index3 [token rETH], index6 [token wOETH], dan index7 [token mETH] semuanya dimasukkan sebagai 0, yang berarti bahwa ketiga token ini tidak ditambahkan setiap kali likuiditas ditambahkan.

Analisis Serangan Pencurian Yearn M

Dengan menyuntikkan aset sepihak dan menarik token dari pool dengan cara yang dijelaskan di atas, kesenjangan kuantitas antara rETH, w0 ETH, mETH, dan token lain dalam pool diperlebar secara artifisial.

3. Selanjutnya, sejumlah besar token rETH disuntikkan secara sepihak, diikuti dengan langkah penting untuk menghapus_liquiditas, tetapi dengan _amount=0.

Analisis Serangan Pencurian Yearn M

Mengapa 0 token tidak bisa ditarik? Hal ini disebabkan oleh implementasi internal dari hapus_kecairan .

Analisis Serangan Pencurian Yearn M

Fungsi remove_liquiditas tidak melakukan pemrosesan hubung singkat untuk transaksi bernilai 0; fungsi ini masih menjalankan loop kalkulasi vb_prod yang lengkap, dan menghitung serta memperbarui status packed_pool_vb global berdasarkan perbedaan kuantitas token dalam pool yang dibuat secara artifisial yang disebutkan di atas.

4. Kemudian panggil fungsi update_rates untuk memperbarui hanya rasio pool dari index6[wOETH], dan terakhir panggil remove_liquidity untuk mengekstrak token dari pool. Pada titik ini, jumlah W0 ETH di dalam pool hampir habis.

Analisis Serangan Pencurian Yearn M

5. Demikian pula, hapus bagian dari index6 [w0 ETH] dan index7 [mETH] di dalam pool dengan cara yang sama. Perhatikan bahwa setelah memperbarui index6 untuk dua kali pertama, remove_liquiditas digunakan untuk menarik token, sedangkan index7[mETH] hanya diperbarui dan belum ditarik.

Analisis Serangan Pencurian Yearn M

Dengan menambahkan sejumlah besar token ke pool satu sisi dan terus mengekstraksi token dari semua pool, rasio W0 ETH ke mETH di pool sekarang telah mencapai hampir nol.

Pada titik ini, kontrak berbahaya baru 0xADbE952eBB9b3e247261d2E3b96835f00f721f8E dibuat, dan semua token ditransfer ke kontrak ini. Perhatikan bahwa token LP yang diperoleh dengan menambahkan rETH secara sepihak pada langkah sebelumnya tidak dikonversi menjadi token yang mendasarinya, tetapi juga ditransfer ke kontrak jahat yang baru.

Analisis Serangan Pencurian Yearn M

Operasi serangan sebelumnya memperbarui index7[mETH] di update_rates, tetapi token yang tidak ditarik akan ditarik di sini dengan memanggil remove_liquidity. Pada saat ini, bagian dari index6 [w0 ETH] di dalam pool sangat kecil, dan bagian dari index7 [mETH] bahkan lebih kecil lagi.

Analisis Serangan Pencurian Yearn M

Pada titik ini, rasio token di dalam pool sangat tidak seimbang. Penyerang memanggil add_liquiditas lagi untuk menambah likuiditas, memperoleh sejumlah besar token LP dengan rasio [1, 1, 1, 1, 1, 1, 1, 9].

Analisis Serangan Pencurian Yearn M

Pada titik ini, para penyerang telah mendapatkan token LP dalam jumlah besar. Mereka kemudian menggunakan metode seperti menukar dan menebus untuk mendapatkan keuntungan dan membayar biaya pinjaman kilat.

Analisis Serangan Pencurian Yearn M

Ulasan Serangan

Serangan ini merupakan serangan gabungan multi-tahap yang kompleks di mana para penyerang mengeksploitasi tiga kerentanan inti dalam kontrak pool.vy: Kehilangan Presisi, Pengupasan Hasil, dan Inisialisasi Pasokan Nol.

Tahap Pertama: Menciptakan Ketidakseimbangan Ekstrem

  • Operasi: Penyerang berulang kali memanggil add_liquiditas, tetapi dengan sengaja menghindari indeks 3 (rETH), indeks 6 (wOETH), dan indeks 7 (mETH).
  • Tujuan: Untuk menciptakan ketidakseimbangan dalam rasio aset di dalam pool.
  • Langkah kunci: Kemudian menyuntikkan rETH dalam jumlah besar secara sepihak.
  • Konsekuensi: Hal ini secara drastis memperlebar kesenjangan kuantitatif antara rETH dan aset lainnya (terutama wOETH dan mETH), menciptakan kondisi matematis yang menyebabkan hilangnya presisi.

Tahap Kedua: Memicu dan Mengunci Kesalahan

  • Operasi: Panggil hapus_likuiditas(_jumlah=0).
  • prinsip:

`hapus_kecairan` tidak melakukan hubungan arus pendek untuk jumlah 0.

Bahkan tanpa mentransfer dana, kontrak masih menjalankan loop perhitungan lengkap vb_prod.

Di bawah ketidakseimbangan bobot yang ekstrem, fungsi _pow_down menghasilkan kesalahan pembulatan ke bawah yang signifikan.

Kontrak menulis nilai kesalahan yang lebih kecil dari vb_prod ke dalam status global packed_pool_vb.

  • Pada dasarnya, ini adalah serangan status “zero-cost”, di mana penyerang berhasil mengubah nilai buku pool tanpa mengeluarkan biaya apa pun.

Tahap Tiga: Pengupasan Pendapatan dan Pasar Ekstraksi Saham

  • beroperasi:

update_rates([6]) (memperbarui nilai tukar wOETH).

hapus_likuiditas (Hapus Aset).

update_rates([7]) (memperbarui nilai tukar mETH).

  • prinsip:

`update_rates` akan memicu `_update_supply`. Karena `vb_prod` sebelumnya ditekan secara jahat, sistem secara keliru menilai bahwa nilai pool telah menyusut, dan dengan demikian menghancurkan token LP yang dipegang oleh kontrak staking untuk menyeimbangkan akun.

Penyerang mengeksploitasi remove_liquiditas untuk melakukan arbitrase sebelum dan sesudah pembaruan nilai tukar, secara bertahap menguras kumpulan wOETH dan mETH.

  • Hasil: Sejumlah besar kontrak staking dihancurkan, bagian LP penyerang secara pasif ditingkatkan, dan Total Pasokan pool didorong ke 0.

Fase Empat: Pasokan Nol, Pencetakan Tanpa Batas

  • Kondisi yang sudah ada sebelumnya: Setelah operasi di atas, pool telah dikosongkan, Total Supply mendekati 0, dan saldo wOETH dan mETH sangat rendah.
  • Operasi: add_liquiditas, parameternya adalah _jumlah = [1, 1, 1, 1, 1, 1, 1, 9].
  • prinsip:

When prev_supply ≈ 0, the iterative formula for _calc_supply fails when dealing with extremely small values (1 wei, 9 wei).

Kontrak tersebut salah menghitung jumlah token LP yang akan dicetak.

  • Hasil: Penyerang memperoleh 235,443 ... token LP YETH dari udara.

Meringkaskan

Serangan Yearn mengekspos beberapa kekurangan dalam protokol DeFi terkait verifikasi logika dalam skenario edge, kontrol presisi dalam penghitungan numerik, dan pencegahan risiko terhadap berbagai kombinasi kerentanan. Pola serangan penyerang, menggunakan pinjaman kilat sebagai alat, eksploitasi kombinasi kerentanan sebagai inti, dan pengaburan dana sebagai kedok, menyoroti tren profesionalisasi dan kompleksitas saat ini dalam serangan DeFi. Pelajaran utama yang dapat dipetik dari serangan ini meliputi: Pertama, protokol perlu memperkuat verifikasi logika untuk skenario edge seperti “jumlah nol” dan “ketidakseimbangan ekstrim” untuk menghindari risiko perusakan status karena kurangnya penanganan hubung singkat; kedua, kehilangan presisi di bawah rasio ekstrim perlu diatasi dalam perhitungan numerik, dan logika kalkulasi fungsi-fungsi utama seperti `_pow_down` perlu dioptimalkan. Protokol Balancer sebelumnya mengalami insiden keamanan karena kehilangan presisi, yang berfungsi sebagai kisah peringatan; ketiga, sistem pemantauan risiko multi-dimensi harus dibuat untuk mengeluarkan peringatan untuk operasi yang mencurigakan seperti suntikan likuiditas satu sisi dengan frekuensi tinggi dan pembaruan nilai tukar yang tidak normal. Untuk seluruh industri DeFi, insiden ini sekali lagi membuktikan bahwa keamanan protokol tidak hanya membutuhkan perbaikan kerentanan individu tetapi juga mencegah serangan yang menggabungkan beberapa kerentanan dari perspektif proses penuh, sambil memperkuat pelacakan dan pencegatan aliran dana penyerang untuk meningkatkan kemampuan perlindungan keamanan industri secara keseluruhan.

Artikel ini bersumber dari internet: Analisis Serangan Pencurian Yearn $9M

 

Terkait: Trivia: DApp pertama di Ethereum adalah pasar prediksi

While sorting through Web3 prediction markets recently, I suddenly came across Augur. After some research, I discovered that Augur announced a relaunch in March of this year, but I have no idea when it ceased operations. This sentiment stems from the fact that Augur was the subject of the first article I translated after entering the industry. The article was published on March 19, 2019. I particularly remember the requirement to add my own interpretation to the translation. I also remember using the poster from the movie “The Butterfly Effect” as the cover for the article published on my WeChat official account, as I personally believe that prediction markets have the power to change the future. I don’t know if the opinion that suddenly emerged more than six years ago…

 

© 版权声明

相关文章