Analisis Kerentanan Compiler Solidity dan Strategi Penanganannya
Kompiler adalah salah satu komponen dasar dari sistem komputer modern. Ini adalah program yang mengubah bahasa pemrograman tingkat tinggi menjadi instruksi yang dapat dieksekusi oleh komputer. Meskipun pengembang dan ahli keamanan biasanya fokus pada keamanan kode aplikasi, keamanan kompilernya sendiri juga sama pentingnya.
Compiler sebagai program komputer juga mungkin memiliki kerentanan keamanan, yang dalam beberapa kasus dapat membawa risiko keamanan yang serius. Misalnya, saat browser mem-parsing dan mengeksekusi kode JavaScript, mungkin karena kerentanan di mesin JavaScript menyebabkan pengguna diserang saat mengakses halaman web berbahaya, yang pada akhirnya dapat menyebabkan penyerang mengendalikan browser korban bahkan sistem operasi.
Kompilator Solidity juga tidak terkecuali. Menurut peringatan keamanan dari tim pengembang Solidity, terdapat kerentanan keamanan di beberapa versi kompiler Solidity.
Kerentanan Kompiler Solidity
Fungsi compiler Solidity adalah untuk mengubah kode kontrak pintar menjadi kode instruksi EVM( Ethereum Virtual Machine). Instruksi EVM ini dikemas dalam transaksi dan diunggah ke Ethereum, dan akhirnya dieksekusi oleh EVM.
Perlu membedakan antara kerentanan compiler Solidity dan kerentanan EVM itu sendiri. Kerentanan EVM merujuk pada celah keamanan saat mesin virtual mengeksekusi instruksi, yang dapat mempengaruhi seluruh jaringan Ethereum. Sedangkan kerentanan compiler Solidity adalah masalah yang terjadi saat mengubah Solidity menjadi kode EVM.
Kerentanan pada compiler Solidity tidak akan langsung mempengaruhi jaringan Ethereum, tetapi dapat menyebabkan kode EVM yang dihasilkan tidak sesuai dengan yang diharapkan oleh pengembang. Karena kontrak pintar biasanya melibatkan aset cryptocurrency, setiap bug yang disebabkan oleh compiler dapat mengakibatkan kehilangan aset pengguna, dengan konsekuensi yang serius.
Hanya dengan mengaudit kode sumber kontrak sangat sulit untuk menemukan celah pada compiler. Diperlukan analisis yang menggabungkan versi compiler tertentu dan pola kode untuk menentukan apakah kontrak terpengaruh oleh celah compiler.
Contoh Kerentanan Compiler Solidity
Berikut adalah beberapa contoh nyata dari kerentanan compiler Solidity, yang menunjukkan bentuk spesifik, penyebab, dan bahaya.
SOL-2016-9 HighOrderByteCleanStorage
Kerentanan ini ada di versi awal dari compiler Solidity (>=0.1.6 <0.4.4).
Pertimbangkan kode berikut:
solidity
kontrak C {
uint32 a = 0x12345678;
uint32 b = 0;
fungsi run() mengembalikan (uint256) {
a = a + 1;
return b;
}
}
Variabel storage b yang tidak dimodifikasi, fungsi run() seharusnya mengembalikan nilai default 0. Namun, dalam versi compiler yang memiliki celah, run() akan mengembalikan 1.
Situasi yang tidak sesuai dengan harapan ini, jika variabel b digunakan untuk verifikasi akses atau pencatatan aset, dapat menyebabkan konsekuensi yang serius.
Penyebab fenomena ini adalah EVM menggunakan elemen tumpukan dan slot penyimpanan berukuran 32 byte, sementara Solidity mendukung tipe data lebih kecil seperti uint32. Kompiler perlu menghapus bit tinggi saat memproses tipe ini, tetapi tidak menangani dengan benar saat terjadi overflow integer, yang menyebabkan bit tinggi 1 ditulis ke storage, menimpa variabel b.
SOL-2022-4 InlineAssemblyMemorySideEffects
Kelemahan ini ada di dalam kompiler versi >=0.8.13 <0.8.15.
Pertimbangkan kode berikut:
solidity
kontrak C {
function f() public pure returns (uint) {
assembly {
mstore(0, 0x42)
}
uint x;
rakitan {
x := mload(0)
}
return x;
}
}
Vuln ini berasal dari optimasi kompilasi. Kompiler mencoba menghapus operasi penulisan memori yang tampaknya berlebihan, tetapi secara keliru melintasi blok assembly untuk analisis. Dalam versi yang rentan, fungsi f() akan mengembalikan 0, bukan 0x42 yang benar.
Kerentanan ini mempengaruhi compiler versi >= 0.5.8 < 0.8.16.
Pertimbangkan kode berikut:
solidity
kontrak C {
function f(string[1] calldata a) external pure returns (string memory) {
return abi.decode(abi.encode(a), (string[1]))[0];
}
}
Dalam keadaan normal, kode ini seharusnya mengembalikan nilai variabel a "aaaa". Namun, dalam versi yang memiliki celah, akan mengembalikan string kosong "".
Ini disebabkan oleh Solidity yang 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 pengkodean ulang.
Perlu dicatat bahwa Solidity secara implisit mengeksekusi abi.encode saat melakukan panggilan eksternal dan mengeluarkan acara, sehingga dampak dari kerentanan semacam ini mungkin lebih luas daripada yang diperkirakan.
Saran Keamanan
Berdasarkan analisis model ancaman kerentanan compiler Solidity dan pemetaan kerentanan historis, berikut adalah saran untuk pengembang dan profesional keamanan:
Untuk Pengembang:
Gunakan versi terbaru dari kompiler Solidity. Versi baru biasanya memperbaiki masalah keamanan yang diketahui.
Perbaiki pengujian unit. Sebagian besar bug tingkat compiler menyebabkan hasil eksekusi kode tidak sesuai harapan, dengan meningkatkan cakupan kode, masalah seperti ini dapat ditemukan pada tahap pengujian.
Hindari menggunakan inline assembly, operasi pengkodean dan penguraian ABI yang kompleks, dll. Sebagian besar kerentanan sejarah terkait dengan fitur kompleks ini.
untuk petugas keamanan:
Jangan abaikan risiko keamanan yang mungkin diperkenalkan oleh compiler saat diaudit. Item pemeriksaan Klasifikasi Kelemahan Smart Contract terkait adalah SWC-102.
Dalam proses internal SDL, mendorong tim pengembang untuk meningkatkan versi compiler Solidity, mempertimbangkan untuk memperkenalkan pemeriksaan otomatis dalam CI/CD.
Tidak perlu terlalu khawatir tentang kerentanan compiler. Sebagian besar kerentanan hanya dipicu dalam pola kode tertentu, dan perlu dievaluasi dampak sebenarnya berdasarkan situasi spesifik.
( Sumber Daya Praktis:
Peringatan keamanan yang dirilis oleh tim Solidity:
Daftar bug resmi Solidity:
Daftar bug compiler versi yang berbeda:
Ikon peringatan di pojok kanan atas halaman kode kontrak Etherscan dapat menunjukkan kerentanan keamanan yang ada pada versi compiler saat ini.
Ringkasan
Artikel ini memperkenalkan konsep kerentanan compiler Solidity, menganalisis risiko keamanan yang mungkin ditimbulkan dalam pengembangan Ethereum yang sebenarnya, dan memberikan saran keamanan praktis bagi pengembang dan personel keamanan. Dengan memahami karakteristik dan dampak kerentanan compiler, kita dapat lebih baik melindungi keamanan kontrak pintar.
![Analisis Kerentanan Kompiler Solidity dan Tindakan Penanggulangannya])https://img-cdn.gateio.im/webp-social/moments-84f5083d8748f2aab71fd92671d999a7.webp###
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.
12 Suka
Hadiah
12
3
Bagikan
Komentar
0/400
DataBartender
· 18jam yang lalu
Keamanan tidak ada akhir, tambalan sementara tidak akan bertahan.
Analisis Kerentanan Compiler Solidity dan Strategi Perlindungan Keamanan
Analisis Kerentanan Compiler Solidity dan Strategi Penanganannya
Kompiler adalah salah satu komponen dasar dari sistem komputer modern. Ini adalah program yang mengubah bahasa pemrograman tingkat tinggi menjadi instruksi yang dapat dieksekusi oleh komputer. Meskipun pengembang dan ahli keamanan biasanya fokus pada keamanan kode aplikasi, keamanan kompilernya sendiri juga sama pentingnya.
Compiler sebagai program komputer juga mungkin memiliki kerentanan keamanan, yang dalam beberapa kasus dapat membawa risiko keamanan yang serius. Misalnya, saat browser mem-parsing dan mengeksekusi kode JavaScript, mungkin karena kerentanan di mesin JavaScript menyebabkan pengguna diserang saat mengakses halaman web berbahaya, yang pada akhirnya dapat menyebabkan penyerang mengendalikan browser korban bahkan sistem operasi.
Kompilator Solidity juga tidak terkecuali. Menurut peringatan keamanan dari tim pengembang Solidity, terdapat kerentanan keamanan di beberapa versi kompiler Solidity.
Kerentanan Kompiler Solidity
Fungsi compiler Solidity adalah untuk mengubah kode kontrak pintar menjadi kode instruksi EVM( Ethereum Virtual Machine). Instruksi EVM ini dikemas dalam transaksi dan diunggah ke Ethereum, dan akhirnya dieksekusi oleh EVM.
Perlu membedakan antara kerentanan compiler Solidity dan kerentanan EVM itu sendiri. Kerentanan EVM merujuk pada celah keamanan saat mesin virtual mengeksekusi instruksi, yang dapat mempengaruhi seluruh jaringan Ethereum. Sedangkan kerentanan compiler Solidity adalah masalah yang terjadi saat mengubah Solidity menjadi kode EVM.
Kerentanan pada compiler Solidity tidak akan langsung mempengaruhi jaringan Ethereum, tetapi dapat menyebabkan kode EVM yang dihasilkan tidak sesuai dengan yang diharapkan oleh pengembang. Karena kontrak pintar biasanya melibatkan aset cryptocurrency, setiap bug yang disebabkan oleh compiler dapat mengakibatkan kehilangan aset pengguna, dengan konsekuensi yang serius.
Hanya dengan mengaudit kode sumber kontrak sangat sulit untuk menemukan celah pada compiler. Diperlukan analisis yang menggabungkan versi compiler tertentu dan pola kode untuk menentukan apakah kontrak terpengaruh oleh celah compiler.
Contoh Kerentanan Compiler Solidity
Berikut adalah beberapa contoh nyata dari kerentanan compiler Solidity, yang menunjukkan bentuk spesifik, penyebab, dan bahaya.
SOL-2016-9 HighOrderByteCleanStorage
Kerentanan ini ada di versi awal dari compiler Solidity (>=0.1.6 <0.4.4).
Pertimbangkan kode berikut:
solidity kontrak C { uint32 a = 0x12345678; uint32 b = 0; fungsi run() mengembalikan (uint256) { a = a + 1; return b; } }
Variabel storage b yang tidak dimodifikasi, fungsi run() seharusnya mengembalikan nilai default 0. Namun, dalam versi compiler yang memiliki celah, run() akan mengembalikan 1.
Situasi yang tidak sesuai dengan harapan ini, jika variabel b digunakan untuk verifikasi akses atau pencatatan aset, dapat menyebabkan konsekuensi yang serius.
Penyebab fenomena ini adalah EVM menggunakan elemen tumpukan dan slot penyimpanan berukuran 32 byte, sementara Solidity mendukung tipe data lebih kecil seperti uint32. Kompiler perlu menghapus bit tinggi saat memproses tipe ini, tetapi tidak menangani dengan benar saat terjadi overflow integer, yang menyebabkan bit tinggi 1 ditulis ke storage, menimpa variabel b.
SOL-2022-4 InlineAssemblyMemorySideEffects
Kelemahan ini ada di dalam kompiler versi >=0.8.13 <0.8.15.
Pertimbangkan kode berikut:
solidity kontrak C { function f() public pure returns (uint) { assembly { mstore(0, 0x42) } uint x; rakitan { x := mload(0) } return x; } }
Vuln ini berasal dari optimasi kompilasi. Kompiler mencoba menghapus operasi penulisan memori yang tampaknya berlebihan, tetapi secara keliru melintasi blok assembly untuk analisis. Dalam versi yang rentan, fungsi f() akan mengembalikan 0, bukan 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) external pure returns (string memory) { return abi.decode(abi.encode(a), (string[1]))[0]; } }
Dalam keadaan normal, kode ini seharusnya mengembalikan nilai variabel a "aaaa". Namun, dalam versi yang memiliki celah, akan mengembalikan string kosong "".
Ini disebabkan oleh Solidity yang 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 pengkodean ulang.
Perlu dicatat bahwa Solidity secara implisit mengeksekusi abi.encode saat melakukan panggilan eksternal dan mengeluarkan acara, sehingga dampak dari kerentanan semacam ini mungkin lebih luas daripada yang diperkirakan.
Saran Keamanan
Berdasarkan analisis model ancaman kerentanan compiler Solidity dan pemetaan kerentanan historis, berikut adalah saran untuk pengembang dan profesional keamanan:
Untuk Pengembang:
Gunakan versi terbaru dari kompiler Solidity. Versi baru biasanya memperbaiki masalah keamanan yang diketahui.
Perbaiki pengujian unit. Sebagian besar bug tingkat compiler menyebabkan hasil eksekusi kode tidak sesuai harapan, dengan meningkatkan cakupan kode, masalah seperti ini dapat ditemukan pada tahap pengujian.
Hindari menggunakan inline assembly, operasi pengkodean dan penguraian ABI yang kompleks, dll. Sebagian besar kerentanan sejarah terkait dengan fitur kompleks ini.
untuk petugas keamanan:
Jangan abaikan risiko keamanan yang mungkin diperkenalkan oleh compiler saat diaudit. Item pemeriksaan Klasifikasi Kelemahan Smart Contract terkait adalah SWC-102.
Dalam proses internal SDL, mendorong tim pengembang untuk meningkatkan versi compiler Solidity, mempertimbangkan untuk memperkenalkan pemeriksaan otomatis dalam CI/CD.
Tidak perlu terlalu khawatir tentang kerentanan compiler. Sebagian besar kerentanan hanya dipicu dalam pola kode tertentu, dan perlu dievaluasi dampak sebenarnya berdasarkan situasi spesifik.
( Sumber Daya Praktis:
Ringkasan
Artikel ini memperkenalkan konsep kerentanan compiler Solidity, menganalisis risiko keamanan yang mungkin ditimbulkan dalam pengembangan Ethereum yang sebenarnya, dan memberikan saran keamanan praktis bagi pengembang dan personel keamanan. Dengan memahami karakteristik dan dampak kerentanan compiler, kita dapat lebih baik melindungi keamanan kontrak pintar.
![Analisis Kerentanan Kompiler Solidity dan Tindakan Penanggulangannya])https://img-cdn.gateio.im/webp-social/moments-84f5083d8748f2aab71fd92671d999a7.webp###