Oleh: 九九

latar belakang

Pada tanggal 5 Desember 2023, platform pengembangan dasar Web3 thirdweb menyatakan bahwa masalah keamanan ditemukan dalam kontrak pintar yang dibuat sebelumnya, dan semua token ERC20, ERC721, dan ERC1155 yang disebarkan menggunakan kontrak pintar yang dibuat sebelumnya terpengaruh. (Untuk versi kode kontrak tertentu yang terpengaruh, silakan merujuk ke: https://blog.thirdweb.com/security-vulnerability/)

Menurut intelijen dari tim keamanan SlowMist, pada tanggal 7 Desember 2023, token Time di mainnet ETH diserang justru karena kerentanan ini, dan penyerang memperoleh keuntungan sekitar US$190,000. Masih banyak kontrak token dengan kerentanan yang diserang. Tim keamanan SlowMist segera melakukan intervensi dalam analisis dan membagikan hasilnya sebagai berikut:

pengetahuan prasyarat

1. ERC-2771 adalah standar untuk transaksi meta. Pengguna dapat mendelegasikan pelaksanaan transaksi kepada Forwarder pihak ketiga, yang sering disebut relay atau forwarder.

Biasanya alamat penelepon langsung dalam kontrak diperoleh menggunakan msg.sender, tetapi dalam kasus menggunakan ERC-2771, jika msg.sender adalah peran penerus, data panggilan masuk akan terpotong dan 20 kata terakhir akan diperoleh. .bagian sebagai alamat pemanggil langsung transaksi.

2. Multicall adalah pustaka kontrak pintar yang memungkinkan beberapa panggilan fungsi dijalankan secara batch, sehingga mengurangi biaya transaksi. Pustaka ini sering digunakan untuk mengoptimalkan kinerja dan pengalaman pengguna DApps, terutama ketika diperlukan beberapa operasi baca.

Seperti yang dapat dilihat dari kodenya, pustaka Multicall yang digunakan oleh kontrak rentan di proyek thirdweb menjalankan fungsi lain dalam kontrak yang mereferensikan pustaka tersebut dengan memanggil fungsi DelegateCall secara siklis.

akar permasalahan

Penyebab utama kerentanan ini adalah kontrak token menggunakan pustaka ERC-2771 dan Multicall. Penyerang memanggil fungsi multicall dari kontrak token melalui fungsi eksekusi kontrak Forwarder untuk menjalankan fungsi lain dalam kontrak (seperti membakar token). Metode ini berhasil melewati penilaian isTrustedForwarder dari ERC-2771, dan akhirnya menyelesaikan pemanggil fungsi ke dalam 20 byte terakhir dari data panggilan berbahaya. Oleh karena itu, penyerang berhasil menipu kontrak dengan berpikir bahwa penelepon adalah alamat pengguna lain, yang pada gilirannya menyebabkan pembakaran token pengguna lain.

Analisis langkah serangan

Di sini kita mengambil transaksi serangan 0xecdd11...f6b6 sebagai contoh untuk analisis:

1. Penyerang pertama kali menggunakan 5 WETH untuk menukar 345,539,9346 token Waktu di kumpulan Uniswap V2.

2. Kemudian panggil fungsi eksekusi kontrak Forwarder dan buat data berbahaya untuk memanggil fungsi multipanggilan kontrak token. Pada saat ini, kontrak token akan mendelegasikan Panggilan untuk menjalankan fungsi pembakaran kontrak token berdasarkan data berbahaya yang diteruskan oleh penyerang, membakar alamat kumpulan. 62.227.259.510 Token waktu.

3. Karena langkah sebelumnya membakar sejumlah besar token Waktu di kumpulan, menyebabkan harga token Waktu naik seketika, penyerang akhirnya dapat menukarkan token Waktu yang diperoleh pada langkah pertama, mengosongkan kumpulan.

Analisis prinsip serangan

Dalam fungsi eksekusi kontrak Forward, setelah memverifikasi tanda tangan req.from, panggilan akan digunakan untuk berinteraksi dengan req.to (alamat token). Persyaratan data yang diteruskan oleh penyerang adalah

Karena 0xac9650d8 adalah tanda tangan fungsi dari fungsi multipanggilan, fungsi multipanggilan dari kontrak token akan dipanggil, dan nilai data yang diteruskan oleh fungsi multipanggilan adalah 0x42966c680000000000000000000000000000000000000c9112ec16d958e8da8180000760dc 1 e043d99394a10605b2fa08f123d60faf84.

Mengapa tidak ada req.from pada nilai data yang diteruskan ke fungsi multipanggilan? Hal ini karena lapisan bawah EVM akan memotong nilai yang diperlukan berdasarkan offset saat memproses panggilan. Offset yang disetel pada nilai calldata yang diteruskan oleh penyerang adalah 38, dan panjang nilainya adalah 1, sehingga hanya dicegat. Nilai datanya adalah 42966c68000000000000000000000000000000000000000c9112ec16d958e8da8180000760dc1e043d99394a10605b2fa08f123d60faf84.

Untuk detailnya, silakan lihat deskripsi panggilan di opcode EVM (https://www.evm.codes/?fork=shanghai).

Karena 0x42966c68 adalah tanda tangan fungsi dari fungsi pembakaran, fungsi pembakaran dari kontrak token akan dipanggil melalui panggilan delegasi berdasarkan nilai data yang dibuat oleh penyerang.

Fungsi _msgSender() digantikan oleh perpustakaan ERC-2771.

Karena multicall dipanggil melalui delegasicall, msg.sender yang diteruskan oleh isTrustedForwarder sebenarnya adalah alamat kontrak Forward, sehingga lolos penilaian, dan pada akhirnya nilai yang dikembalikan oleh _msgSender() adalah 20 byte terakhir dari data panggilan masuk , alamat kumpulannya adalah 0x760dc1e043d99394a10605b2fa08f123d60faf84.

sebagai kesimpulan

Penyebab utama serangan ini adalah kontrak mereferensikan Multicall dan ERC2771Context. Penyerang dapat memasukkan data panggilan berbahaya ke dalam permintaan penerusan, menggunakan fungsi delegasicall Multicall untuk memberikan penilaian kepada penerus tepercaya, dan memanipulasi _msgSender() di dalam. sub-panggilan Analisis, sehingga token pengguna mana pun dapat dimanipulasi.

Tim keamanan SlowMist merekomendasikan agar pihak proyek tidak menggunakan Multicall dan ERC2771Context secara bersamaan saat menulis kontrak token. Jika permintaan yang diharapkan memerlukan referensi simultan, Anda harus memeriksa apakah panjang data panggilan memenuhi harapan atau menggunakan versi resmi terbaru dari Multicall dan openzeppelin. ERC2771Konteks kontrak.

referensi

Alamat penyerang: 0xfde0d1575ed8e06fbf36256bcdfa1f359281455a

Kontrak serangan: 0x6980a47bee930a4584b09ee79ebe46484fbdbdd0

Transaksi serangan terkait: https://etherscan.io/tx/0xecdd111a60debfadc6533de30fb7f55dc5ceed01dfadd30e4a7ebdb416d2f6b6

Detail versi yang terpengaruh: https://blog.thirdweb.com/security-vulnerability/

Alat mitigasi: https://mitigate.thirdweb.com/