Analisis Kerentanan Kompiler Solidity: Ancaman Kontrak Pintar yang Tidak Boleh Diabaikan

robot
Pembuatan abstrak sedang berlangsung

Analisis Kerentanan Kompiler Solidity dan Langkah-Langkah Penanganannya

Kompiler adalah salah satu komponen dasar dari sistem komputer modern, yang fungsinya adalah mengubah kode sumber bahasa pemrograman tingkat tinggi menjadi kode instruksi yang dapat dieksekusi oleh komputer. Meskipun pengembang dan petugas keamanan biasanya fokus pada keamanan kode aplikasi program, kompilernya sendiri sebagai program komputer juga mungkin memiliki kerentanan keamanan, yang dalam beberapa kasus dapat menimbulkan risiko keamanan yang serius.

Misalnya, saat browser mengompilasi dan mengeksekusi kode JavaScript, mungkin karena kerentanan pada mesin pemrosesan yang menyebabkan eksekusi kode jarak jauh, yang memungkinkan penyerang mengendalikan browser korban bahkan sistem operasinya. Penelitian juga menunjukkan bahwa bug pada kompilator C++ dapat menyebabkan eksekusi kode jarak jauh dan konsekuensi serius lainnya.

Compiler Solidity juga memiliki celah keamanan. Menurut peringatan keamanan dari tim pengembang, masalah keamanan ditemukan di beberapa versi compiler Solidity.

Analisis Kerentanan Compiler Solidity dan Tindakan Penanganan

Fungsi compiler Solidity adalah mengubah kode kontrak pintar menjadi kode instruksi (EVM) untuk mesin virtual Ethereum. Penting untuk membedakan antara kerentanan compiler Solidity dan kerentanan EVM itu sendiri. Kerentanan EVM merujuk pada masalah keamanan saat mesin virtual mengeksekusi instruksi, yang dapat mempengaruhi seluruh jaringan Ethereum. Sedangkan kerentanan compiler Solidity merujuk pada masalah saat mengubah Solidity menjadi kode EVM, yang tidak akan langsung mempengaruhi jaringan Ethereum, tetapi dapat menyebabkan kode EVM yang dihasilkan tidak sesuai dengan harapan pengembang.

Karena kontrak pintar biasanya melibatkan aset cryptocurrency pengguna, setiap bug yang disebabkan oleh compiler dapat mengakibatkan konsekuensi serius. Hanya dengan mengaudit kode sumber kontrak, sulit untuk menemukan kerentanan compiler, perlu dilakukan analisis yang menggabungkan versi spesifik dan pola kode.

Berikut adalah beberapa kasus nyata yang menunjukkan bentuk, penyebab, dan bahaya dari kerentanan compiler Solidity.

SOL-2016-9 HighOrderByteCleanStorage

Vulnerability ini ada di versi compiler Solidity yang lebih awal (>=0.1.6 <0.4.4).

Pertimbangkan kode berikut:

solidity kontrak C { uint32 a = 0x1234; uint32 b = 0; fungsi f() publik { a += 1; } function run() public view returns (uint) { return b; } }

Variabel b tidak dimodifikasi, fungsi run() seharusnya mengembalikan nilai default 0. Namun, dalam kode yang dihasilkan oleh compiler versi yang rentan, run() akan mengembalikan 1.

Ini karena EVM menggunakan elemen tumpukan berukuran 32 byte, sedangkan Solidity mendukung tipe di bawah 32 byte seperti uint32. Kompiler perlu melakukan operasi pembersihan bit tinggi untuk memastikan keakuratan data. Ketika terjadi overflow penjumlahan, kompiler tidak membersihkan bit tinggi dengan benar, mengakibatkan bit 1 yang meluap ditulis ke storage, menimpa variabel b.

SOL-2022-4 InlineAssemblyMemorySideEffects

Kelemahan ini ada di dalam compiler versi >=0.8.13 <0.8.15.

Pertimbangkan kode berikut:

soliditas kontrak C { function f() public pure returns (uint) { assembly { mstore(0, 0x42) } uint x; perakitan { x := mload(0) } return x; } }

Kompiler dalam proses optimasi akan menganalisis aliran kontrol dan aliran data untuk mengurangi ukuran kode dan mengoptimalkan konsumsi gas. Namun, optimasi semacam ini sangat rentan terhadap bug.

Dalam contoh ini, kompiler secara keliru menganggap penulisan ke memori 0 di blok assembly pertama adalah redundan, menghapusnya, yang menyebabkan fungsi f() mengembalikan 0 alih-alih 0x42 yang benar.

SOL-2022-6 AbiReencodingHeadOverflowWithStaticArrayCleanup

Kerentanan ini mempengaruhi compiler versi >= 0.5.8 < 0.8.16.

Pertimbangkan kode berikut:

solidity kontrak C { function f(string[1] calldata a) public pure returns (string memory) { return abi.decode(abi.encode(a), (string[1]))[0]; } }

Dalam kondisi normal, kode ini seharusnya mengembalikan nilai variabel a "aaaa". Namun, dalam versi yang rentan, akan mengembalikan string kosong "".

Ini karena Solidity secara keliru membersihkan beberapa data saat melakukan operasi abi.encode pada array tipe calldata, yang mengakibatkan modifikasi data yang berdekatan, menyebabkan ketidakcocokan data setelah pengkodean dan dekode.

Perlu dicatat bahwa saat melakukan panggilan eksternal dan memancarkan acara, akan secara implisit dilakukan abi.encode, sehingga kemungkinan terjadinya kerentanan ini cukup tinggi.

Analisis Kerentanan Compiler Solidity dan Tindakan Penanganan

Saran Keamanan

Kepada pengembang:

  • Menggunakan versi terbaru dari compiler Solidity, masalah keamanan yang diketahui biasanya lebih sedikit.
  • Memperbaiki kasus pengujian unit, meningkatkan cakupan kode, membantu menemukan masalah yang disebabkan oleh kompilator.
  • Hindari menggunakan inline assembly, operasi pengkodean dan pengkodean ABI yang kompleks, dan tidak menggunakan fitur baru dan fungsi eksperimental secara membabi buta.

Untuk petugas keamanan:

  • Jangan mengabaikan risiko yang mungkin diperkenalkan oleh compiler saat audit, sesuai dengan item pemeriksaan SWC-102.
  • Dalam proses SDL, dorong peningkatan versi compiler, pertimbangkan untuk memperkenalkan pemeriksaan otomatis.
  • Evaluasi dampak nyata dari kerentanan compiler, tidak perlu panik berlebihan.

Beberapa sumber daya yang berguna:

  • Blog peringatan keamanan resmi Solidity
  • Daftar bug di repositori Solidity
  • Daftar bug compiler berbagai versi
  • Peringatan kerentanan compiler di halaman kontrak Etherscan

Analisis Kerentanan Kompiler Solidity dan Langkah-langkah Penanganannya

Singkatnya, kerentanan compiler Solidity dapat menyebabkan perilaku sebenarnya dari kontrak pintar tidak sesuai dengan yang diharapkan, pengembang dan personel keamanan harus tetap waspada terhadap hal ini dan mengambil langkah-langkah yang sesuai untuk mengurangi risiko.

ETH-1.03%
SOL0.01%
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
  • 5
  • Posting ulang
  • Bagikan
Komentar
0/400
ColdWalletGuardianvip
· 08-06 10:09
Masih berani menggunakan compiler versi lama, otak besi.
Lihat AsliBalas0
LayerZeroHerovip
· 08-06 02:28
Kompiler juga tidak terlalu stabil.
Lihat AsliBalas0
RektRecordervip
· 08-03 12:34
Begitu berbahaya, keterlaluan fam.
Lihat AsliBalas0
BearMarketGardenervip
· 08-03 12:30
Compiler juga penuh dengan celah, dalam sekejap tidur aset sudah hilang.
Lihat AsliBalas0
SnapshotBotvip
· 08-03 12:27
Kompiler lagi bermasalah. Pergi, pergi!
Lihat AsliBalas0
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)