Analisis Kerentanan Compiler Solidity dan Strategi Penanganannya

robot
Pembuatan abstrak sedang berlangsung

Analisis Kerentanan Compiler Solidity dan Strategi Penanggulangannya

Compiler adalah salah satu komponen dasar dari sistem komputer modern, fungsinya yang utama adalah mengubah kode sumber bahasa pemrograman tingkat tinggi menjadi kode instruksi yang dapat dieksekusi oleh CPU atau mesin virtual komputer.

Meskipun sebagian besar pengembang dan profesional keamanan biasanya lebih fokus pada keamanan kode aplikasi, keamanan compiler itu sendiri juga sangat penting. Sebagai program komputer, compiler juga mungkin memiliki kerentanan keamanan, yang dalam beberapa kasus dapat menimbulkan risiko keamanan yang serius.

Sebagai contoh menggunakan browser, dalam proses kompilasi dan eksekusi kode frontend JavaScript, mungkin ada celah dalam mesin pengurai JavaScript yang dapat dimanfaatkan oleh penyerang untuk melaksanakan kode jarak jauh saat pengguna mengunjungi halaman web berbahaya, akhirnya mengontrol browser korban bahkan sistem operasi. Selain itu, bug dalam compiler C++ juga dapat menyebabkan eksekusi kode jarak jauh dan konsekuensi serius lainnya.

Compiler Solidity juga memiliki kerentanan keamanan. Menurut peringatan keamanan dari tim pengembang Solidity, terdapat kerentanan keamanan di beberapa versi compiler Solidity.

Analisis dan Tindakan Terhadap Kerentanan Compiler Solidity

Kerentanan Compiler Solidity

Peran compiler Solidity adalah untuk mengubah kode kontrak pintar menjadi kode instruksi (EVM) untuk Ethereum Virtual Machine, yang kemudian dikemas dalam transaksi dan diunggah ke Ethereum, akhirnya diparsing dan dijalankan oleh EVM.

Perlu dicatat bahwa kerentanan compiler Solidity berbeda dari kerentanan EVM itu sendiri. Kerentanan EVM mengacu pada masalah keamanan yang muncul saat mesin virtual mengeksekusi instruksi, yang dapat mempengaruhi seluruh jaringan Ethereum. Sedangkan kerentanan compiler Solidity mengacu pada masalah yang ada saat mengubah Solidity menjadi kode EVM, yang tidak akan langsung mempengaruhi jaringan Ethereum itu sendiri.

Salah satu bahaya dari kerentanan compiler Solidity adalah dapat menyebabkan kode EVM yang dihasilkan tidak sesuai dengan harapan pengembang kontrak pintar. Karena kontrak pintar di Ethereum biasanya terkait dengan aset cryptocurrency pengguna, maka setiap bug yang disebabkan oleh compiler dapat mengakibatkan kehilangan aset pengguna, yang dapat menghasilkan konsekuensi yang serius.

Pengembang dan auditor kontrak mungkin akan fokus pada masalah implementasi logika kode kontrak, serta masalah keamanan di tingkat Solidity seperti reentrancy dan overflow integer. Namun, untuk kerentanan pada compiler Solidity, hanya dengan melakukan audit pada logika sumber kode kontrak sangat sulit untuk ditemukan. Diperlukan analisis yang menggabungkan versi compiler tertentu dengan pola kode tertentu untuk menentukan apakah kontrak pintar terpengaruh oleh kerentanan compiler.

Contoh Kerentanan Compiler Solidity

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

SOL-2016-9 HighOrderByteCleanStorage

Kerentanan ini ada di versi awal dari kompiler Solidity (>=0.1.6 <0.4.4).

Pertimbangkan kode berikut:

soliditas kontrak C { uint32 a = 0x12345678; uint32 b = 0; fungsi run() mengembalikan (uint256) { a += 1; return b; } }

variabel storage b tidak mengalami perubahan apapun, sehingga fungsi run() seharusnya mengembalikan nilai default 0. Namun, dalam kode yang dihasilkan oleh compiler versi yang rentan, run() akan mengembalikan 1.

Situasi yang tidak konsisten dengan yang diharapkan ini, jika variabel b digunakan untuk verifikasi izin, pencatatan aset, dan tujuan lainnya, dapat menyebabkan konsekuensi yang serius.

Alasan munculnya situasi ini adalah EVM menggunakan elemen tumpukan berukuran 32 byte, sedangkan Solidity mendukung tipe data yang lebih kecil seperti uint32. Kompiler perlu melakukan operasi penghapusan pada bit tinggi saat menangani tipe-tipe ini, tetapi tidak menangani dengan benar saat terjadi overflow integer, mengakibatkan 1 bit dari bit tinggi ditulis ke variabel b yang berdekatan.

SOL-2022-4 InlineAssemblyMemorySideEffects

Kerentanan ini ada pada versi 0.8.13 hingga 0.8.15 dari compiler.

Pertimbangkan kode berikut:

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

Kerentanan ini berasal dari operasi optimisasi kompilasi. Kompiler akan menganalisis dan mengoptimalkan blok assembly tunggal, jika suatu operasi penulisan memori tidak dibaca setelahnya, maka akan dihapus untuk menghemat gas. Namun, penulisan dan pembacaan memori dalam kode di atas berada di dua blok assembly yang berbeda, sehingga kompiler secara keliru menganggap penulisan pertama adalah redundan dan menghapusnya, mengakibatkan fungsi f() mengembalikan 0 alih-alih 0x42 yang benar.

SOL-2022-6 AbiReencodingHeadOverflowWithStaticArrayCleanup

Kerentanan ini mempengaruhi versi 0.5.8 hingga 0.8.16 dari kompiler.

Pertimbangkan kode berikut:

soliditas kontrak C { function f(bytes4[] calldata a) external pure returns (bytes4[] memory) { return abi.decode(abi.encode(a), (bytes4[])); } }

Dalam kondisi normal, kode ini harus mengembalikan variabel a yang dimasukkan. Namun, dalam versi yang rentan, jika masukan adalah "aaaa", akan mengembalikan array kosong.

Ini disebabkan oleh operasi abi.encode pada array tipe calldata di Solidity yang secara keliru membersihkan beberapa data, mengakibatkan perubahan pada data yang berdekatan, sehingga menyebabkan ketidakkonsistenan data setelah encoding dan decoding.

Perlu dicatat bahwa Solidity secara implisit melakukan abi.encode pada parameter saat melakukan panggilan eksternal dan mengeluarkan peristiwa, sehingga kemungkinan terjadinya kerentanan semacam ini mungkin lebih tinggi dari yang dibayangkan.

Analisis dan Tindakan Terhadap Kerentanan Kompiler Solidity

Saran Keamanan

Mengenai kerentanan compiler Solidity, berikut adalah saran untuk para pengembang dan petugas keamanan:

Untuk Pengembang:

  • Gunakan versi compiler Solidity yang lebih baru. Versi baru biasanya memperbaiki masalah keamanan yang diketahui.
  • Memperbaiki kasus uji unit. Sebagian besar bug di level compiler dapat menyebabkan hasil eksekusi kode tidak sesuai dengan yang diharapkan, dengan meningkatkan cakupan pengujian dapat meminimalkan masalah semacam ini.
  • Usahakan untuk menghindari penggunaan assembly inline, pengkodean dan penguraian ABI yang kompleks, dan jangan sembarangan menggunakan fitur baru dan fungsi eksperimental. Sebagian besar kerentanan compiler terkait dengan operasi kompleks ini.

Kepada petugas keamanan:

  • Saat mengaudit kode Solidity, jangan abaikan risiko keamanan yang mungkin diperkenalkan oleh compiler.
  • Dalam proses pengembangan internal, mendorong tim pengembang untuk memperbarui versi compiler Solidity, dapat mempertimbangkan untuk memperkenalkan pemeriksaan otomatis untuk versi compiler dalam proses CI/CD.
  • Tidak perlu terlalu khawatir tentang kerentanan compiler, sebagian besar kerentanan hanya dipicu dalam pola kode tertentu, perlu mengevaluasi dampak nyata berdasarkan situasi proyek yang spesifik.

Beberapa sumber daya praktis:

  • Peringatan keamanan yang dirilis secara berkala oleh tim Solidity
  • Daftar bug yang diperbarui secara berkala dari repositori resmi Solidity
  • Daftar bug kompiler untuk setiap versi
  • Segitiga tanda seru di sudut kanan atas halaman kode kontrak di Etherscan dapat menunjukkan kerentanan keamanan yang ada pada versi kompiler saat ini.

Analisis Kerentanan Compiler Solidity dan Tindakan Penanggulangannya

Secara keseluruhan, kerentanan compiler Solidity merupakan risiko keamanan yang tidak dapat diabaikan dalam pengembangan kontrak pintar. Para pengembang dan petugas keamanan harus tetap waspada dan mengambil langkah-langkah yang tepat untuk mengurangi ancaman potensial yang ditimbulkan oleh kerentanan semacam ini.

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
  • 8
  • Bagikan
Komentar
0/400
BlockDetectivevip
· 07-07 07:59
Sudah terjebak lagi, gkd upgrade
Lihat AsliBalas0
liquidation_surfervip
· 07-06 14:45
Sekali lagi muncul banyak bug.
Lihat AsliBalas0
GasFeeCriervip
· 07-04 08:26
Versi terbaru resmi setiap hari siapa-siapa
Lihat AsliBalas0
DoomCanistervip
· 07-04 08:24
Segera perbaiki kode.
Lihat AsliBalas0
Token_Sherpavip
· 07-04 08:23
ngmi jika kamu tidak memeriksa versi kompiler kamu sejujurnya... sudah melihat terlalu banyak cerita rekt
Lihat AsliBalas0
PonziDetectorvip
· 07-04 08:21
Saatnya berburu celah yang paling saya sukai lagi.
Lihat AsliBalas0
VirtualRichDreamvip
· 07-04 08:18
Transfer uang itu seperti sebuah dart!
Lihat AsliBalas0
LiquidationWizardvip
· 07-04 08:13
Kontraknya sudah terlipat!
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)