Kemungkinan masalah keamanan dengan ERC777 dan kontrak panggilan arbitrer

Baru-baru ini, saat bekerja dengan salah satu klien kami, kami menemukan bug menarik yang berpotensi menjadi vektor serangan untuk beberapa proyek DeFi. Kesalahan ini terutama terkait dengan standar token ERC777 yang terkenal. Selain itu, ini bukan hanya masalah re-entry sederhana yang biasa terjadi di kalangan peretas terkenal.

Artikel ini memberikan penjelasan komprehensif tentang ERC777, mencakup semua detail yang diperlukan. Ada beberapa sumber daya untuk menyelidiki secara spesifik token ERC777, dan artikel ini adalah panduan mendetail yang berharga bagi siapa pun yang tertarik untuk mempelajari lebih lanjut tentang token ERC777.

Di bagian terakhir artikel, temuan terbaru kami akan dijelaskan.

Penjelasan singkat tentang vektor serangan

Kerentanan ini memanfaatkan karakteristik ERC777 dan dapat mengatur fungsi penerima Hook. Dengan memanfaatkan kemampuan untuk melakukan panggilan sewenang-wenang dalam kontrak target, penelepon jahat dapat memanggil kontrak registri ERC777 dan menetapkan alamat Hook tertentu ke kontrak target. Oleh karena itu, setiap kali kontrak target menerima token ERC777 di masa mendatang, kontrak Hook penyerang akan terpicu. Kait ini dapat dieksploitasi dengan berbagai cara: baik untuk serangan reentrancy untuk mencuri token, atau hanya untuk membatalkan transaksi, mencegah kontrak target mengirim atau menerima token ERC777.

ERC777 dan Pengaitnya

Apa itu ERC777

ERC777 adalah salah satu standar token dengan transfer Hook. Ini deskripsi EIP: , dan ini adalah praktik ERC777 [4] 。

Motivasi utama untuk mengimplementasikan token ERC777 adalah meniru perilaku transfer token asli. Dengan memicu smart contract saat token diterima, pengembang dapat menjalankan logika khusus untuk meningkatkan fungsionalitas dan menciptakan interaksi token yang lebih dinamis.

Namun, panggilan ekstra ini selama proses transfer membuat ERC777 berbeda dari token ERC20. Kait ini memperkenalkan vektor serangan baru yang dapat memengaruhi kontrak pintar yang tidak dirancang untuk menangani panggilan tambahan selama transfer token. Perilaku tak terduga tersebut menimbulkan risiko keamanan untuk kontrak ini.

Berikut ini adalah daftar beberapa token ERC777 dengan beberapa likuiditas di mainnet Ethereum:

Kp6OQ2xMxjKs5X4G5V33hmMqR8TSwawzldCaPOtL.png

Saat Pengait terjadi

Token ERC20 hanya memperbarui saldo selama transfer. Tapi token ERC777 melakukan ini:

  1. Lakukan panggilan Hook ke alamat inisiator token

  2. Perbarui saldo

  3. Lakukan panggilan Hook ke alamat penerima token

Ini diilustrasikan dengan baik dalam token VRA:

Kode sumber:

Sekarang, mari kita periksa kode untuk panggilan ini:

seperti yang Anda lihat:

  1. Fungsi ini membaca kontrak yang disebut pelaksana dari _ERC1820_REGISTRY
  2. Jika fungsi menemukan pelaksana, pelaksana itu dipanggil.

Mari jelajahi registry ini dan lihat apakah implementor itu.

Registri dan pelaksana

Semua token ERC777 terkait dengan kontrak Registry:

Alamat ini digunakan oleh token ERC777 untuk menyimpan set penerima Hook. Penerima Hook ini disebut "pelaksana antarmuka".

Ini berarti Alice dapat memilih Bob sebagai pelaksana antarmukanya. Jika Alice menerima atau mengirim token ERC777, Bob akan menerima Hook.

Alice dapat mengelola jenis Hook yang berbeda. Oleh karena itu, ketika Alice mengirim token, dia dapat memilih Bob sebagai pelaksana antarmuka, dan hanya ketika Alice menerima token, dia memilih Tom sebagai pelaksana.

Dia juga dapat memilih pelaksana antarmuka yang berbeda untuk token yang berbeda dalam banyak kasus.

Preferensi ini disimpan dalam registri yang dipetakan ini:

_interfaceHash adalah ID dari interface implementer yang dipilih oleh Alice untuk sebuah event.

Dan siapapun dapat membaca interface implementor Alice dengan fungsi ini:

Seperti yang Anda lihat, ini adalah fungsi yang kami temui sebelumnya di kode VRA.

Variabel _TOKENS_SENDER_INTERFACE_HASH digunakan sebagai _interfaceHash, yang dapat berupa byte apa saja. Tapi token VRA menggunakan byte ini untuk mengidentifikasi tipe Hook ini:

Menerima Pengait

Untuk mengatur fungsi penerima Hook, Alice hanya perlu memanggil fungsi ini di registri dan memasukkan alamat Bob sebagai parameter _implementer.

Dia juga harus menentukan _interfaceHash. Dia akan mendapatkan _TOKENS_SENDER_INTERFACE_HASH ini dari kode token VRA.

Ada satu detail penting lagi.

Setelah menyiapkan implementor untuk VRA di atas, Alice juga akan mengetahui bahwa meskipun token ERC777 lainnya ditransfer, Bob akan menerima panggilan tersebut. Seperti imBTC [5] , imBTC memiliki _interfaceHash yang sama pada token yang dikirim.

Ini karena fakta bahwa semua token ERC777 berbagi kontrak registri yang sama untuk menyimpan preferensi Hook. Tetapi tergantung pada token ERC777 untuk memberikan nama pada Hooks mereka, dan meskipun terkadang mirip, tidak selalu.

Cara menemukan token ERC777

Memanggil registri adalah fitur dari semua ERC777. Jadi kita bisa mencoba dune.com [6] untuk memanggil semua kontrak pintar yang memanggil registri.

Kita bisa menggunakan skrip SQL ini. Sebenarnya, kami juga harus memfilter alamat token, tetapi setidaknya kami memiliki awal yang sempurna dan berakhir dengan 78 alamat.

Catatan penerjemah: tabel jejak gundukan [7] Akan merekam catatan panggilan internal transaksi.

Apakah registri ini satu-satunya kemungkinan?

Secara teoritis, tidak ada yang dapat menjamin bahwa beberapa token menggunakan kontrak 0x1820 ini sebagai registri. Tapi kita bisa menggunakan dune.com [8] Ayo periksa.

itu mengembalikan alamat ini

0x1820a4b7618bde71dce8cdc73aab6c95905fad24 0xc0ce3461c92d95b4e1d3abeb5c9d378b1e418030 0x820c4597fc3e4193282576750ea4fcfe34ddf0a7

Kami memeriksa dan 0x1820 adalah satu-satunya registri dengan token ERC777 yang berharga. Token pendaftar lain tidak begitu berharga.

Situasi umum token Hookable

ERC777 bukan hanya standar dengan Hooks. Juga ERC223, ERC995 atau ERC667. Mereka tidak biasa. Anda pasti pernah mendengar tentang token LINK yang mengimplementasikan ERC667 [9] 。

Serang vektor menggunakan panggilan sewenang-wenang

Ini adalah vektor serangan yang baru ditemukan untuk salah satu pelanggan kami.

Peneliti umumnya berasumsi bahwa token ERC777 melakukan panggilan ke penelepon dan penerima. Namun pada kenyataannya, inisiator dan penerima dapat memilih "Bob" apa pun sebagai penerima Hook.

Jadi bayangkan apa yang terjadi jika digabungkan dengan kontrak yang melakukan panggilan sewenang-wenang ke alamat mana pun dengan data apa pun?

Ada fungsi panggilan arbitrer yang dapat digunakan secara luas di agregator DEX, dompet, dan kontrak multipanggilan.

Catatan Penerjemah: Fungsi pemanggilan sewenang-wenang berarti ada fungsi seperti ini dalam kontrak:

function ute(address target, uint value, string memory signature, bytes memory data, uint eta) public payable;

Itu dapat memanggil metode lain.

Metode serangan:

  1. Penyerang menemukan kontrak target (Target) yang memungkinkan panggilan fungsi sewenang-wenang
  2. Penyerang memanggil target:
  3. registy1820.setInterfaceImplementer(Target, hookHash, Penyerang)
  4. Sekarang, Attacker kita adalah pelaksana Target
  5. Penyerang akan dipanggil dengan hookHash yang digunakan di token ERC777.
  6. Setiap kali kontrak target (Target) menerima token ERC777, Attacker akan menerima panggilan Hook.
  7. Serangan berikut bervariasi tergantung pada kode Target:
  • Penyerang dapat masuk kembali ketika beberapa pengguna menjalankan fungsi dalam kontrak target
  • Penyerang dapat memutar kembali secara langsung, sehingga transaksi pengguna akan langsung dipulihkan

Jika agregator DEX menghitung bahwa jalur konversi terbaik adalah melalui pasangan perdagangan DEX dengan token ERC777, maka agregator tersebut mungkin mengalami masalah.

Melindungi

Setelah berjam-jam berdiskusi dengan pelanggan, kami menemukan solusi yang tidak memutus panggilan sembarangan.

Sisi proyek sebaiknya membatasi penggunaan Registry1820 sebagai alamat panggilan apa pun. Oleh karena itu, tidak ada penyerang yang dapat mengeksploitasi panggilan sewenang-wenang untuk mengatur pelaksana antarmuka.

Berbicara dari pengalaman

Proyek dan auditor harus memperhatikan perilaku Hook yang dijelaskan dalam ERC777. Token ini melakukan panggilan tidak hanya ke penerima dan inisiator, tetapi juga ke beberapa penerima Hook lainnya.

Dalam pengertian ini, proyek yang memungkinkan panggilan sewenang-wenang harus berhati-hati dan mempertimbangkan vektor serangan lain untuk ERC777.

Lihat Asli
Halaman ini mungkin berisi konten pihak ketiga, yang disediakan untuk tujuan informasi saja (bukan pernyataan/jaminan) dan tidak boleh dianggap sebagai dukungan terhadap pandangannya oleh Gate, atau sebagai nasihat keuangan atau profesional. Lihat Penafian untuk detailnya.
  • Hadiah
  • Komentar
  • Bagikan
Komentar
0/400
Tidak ada komentar
  • Sematkan
Perdagangkan Kripto Di Mana Saja Kapan Saja
qrCode
Pindai untuk mengunduh aplikasi Gate
Komunitas
Bahasa Indonesia
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)