ikon_instal_ios_web ikon_instal_ios_web ikon_instal_android_web

Analisis Serangan Pencurian Yearn $9M

Analisis2 bulan yang lalu发布 Wyatt
12,105 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:

Ketika prev_supply ≈ 0, rumus iteratif untuk _calc_supply akan gagal ketika berhadapan dengan nilai yang sangat kecil (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

Ketika sedang memilah-milah pasar prediksi Web3 baru-baru ini, saya tiba-tiba menemukan Augur. Setelah melakukan riset, saya menemukan bahwa Augur mengumumkan peluncuran kembali pada bulan Maret tahun ini, tetapi saya tidak tahu kapan mereka berhenti beroperasi. Sentimen ini berasal dari fakta bahwa Augur adalah subjek artikel pertama yang saya terjemahkan setelah memasuki industri ini. Artikel itu diterbitkan pada 19 Maret 2019. Saya sangat ingat bahwa saya harus menambahkan interpretasi saya sendiri ke dalam terjemahan tersebut. Saya juga ingat menggunakan poster dari film “The Butterfly Effect” sebagai sampul untuk artikel yang diterbitkan di akun resmi WeChat saya, karena saya secara pribadi percaya bahwa pasar prediksi memiliki kekuatan untuk mengubah masa depan. Saya tidak tahu apakah pendapat yang tiba-tiba muncul lebih dari enam tahun yang lalu ...

 

© 版权声明

相关文章