Analisis Kerentanan Kompilator Solidity dan Strategi Penanggulangannya
Kompiler adalah salah satu komponen dasar dari sistem komputer modern, yang bertanggung jawab untuk mengubah bahasa pemrograman tingkat tinggi menjadi instruksi eksekusi tingkat rendah. Meskipun pengembang biasanya memperhatikan keamanan kode aplikasi, keamanan kompilernya sendiri juga sangat penting. Kerentanan pada kompilernya dalam beberapa kasus juga dapat menyebabkan risiko keamanan yang serius, seperti kerentanan pada mesin JavaScript browser yang dapat mengakibatkan eksekusi kode jarak jauh.
Kompiler Solidity juga tidak terkecuali, terdapat beberapa versi yang memiliki kerentanan keamanan. Berbeda dengan kerentanan EVM, kerentanan pada kompiler Solidity hanya mempengaruhi pengembang kontrak, tidak akan langsung membahayakan keamanan jaringan Ethereum. Namun, ini dapat menyebabkan kode EVM yang dihasilkan tidak sesuai dengan yang diharapkan oleh pengembang, sehingga memicu kerentanan kontrak pintar yang dapat membahayakan keamanan aset pengguna.
Berikut adalah beberapa contoh kerentanan kompilator Solidity yang nyata:
SOL-2016-9 HighOrderByteCleanStorage
Versi yang terpengaruh: >=0.1.6 <0.4.4
Kerentanan ini dapat menyebabkan variabel storage diubah secara tidak sengaja. Contohnya:
solidity
kontrak C {
uint32 a = 0x1234;
uint32 b = 0;
fungsi run() mengembalikan (uint) {
a += 1;
return b;
}
}
fungsi run() seharusnya mengembalikan 0, tetapi sebenarnya mengembalikan 1. Ini karena kompilator tidak membersihkan bit tinggi dengan benar saat menangani overflow integer, yang menyebabkan bit overflow ditulis ke variabel yang berdekatan.
SOL-2022-4 Efek Samping Memori InlineAssembly
Versi yang terpengaruh: >=0.8.13 <0.8.15
Kerentanan ini berasal dari proses optimasi kompilasi. Contohnya:
solidity
kontrak C {
function f() public pure returns (uint) {
assembly {
mstore(0, 0x42)
}
uint x;
assembly {
x := mload(0)
}
return x;
}
}
f() fungsi harus mengembalikan 0x42, tetapi versi yang rentan akan mengembalikan 0. Ini karena compiler secara keliru menghapus operasi penulisan memori di blok assembly pertama.
Kerentanan ini melibatkan encoding ABI dari array calldata. Contohnya:
solidity
kontrak C {
fungsi f(bytes[1] calldata a) publik murni mengembalikan (bytes memory) {
return abi.encode(a);
}
}
f() fungsi harus mengembalikan array yang dimasukkan, tetapi versi yang rentan akan mengembalikan string kosong. Ini disebabkan oleh kesalahan pembersihan data yang berdekatan oleh kompiler selama proses pengkodean.
Untuk mengurangi risiko kerentanan pada compiler Solidity, pengembang harus:
Gunakan versi compiler yang lebih baru
Memperbaiki unit test, meningkatkan cakupan kode
Hindari penggunaan fitur bahasa yang kompleks, seperti inline assembly, pengkodean ABI array multidimensi, dll.
Petugas audit keamanan harus:
Pertimbangkan risiko potensial compiler selama proses audit
Disarankan agar tim pengembang segera memperbarui versi compiler
Menambahkan pemeriksaan otomatis versi compiler dalam proses CI/CD
Sumber referensi yang berguna:
Blog Peringatan Keamanan Resmi Solidity
Daftar bug di repositori GitHub Solidity
Peringatan kerentanan compiler di halaman kontrak Etherscan
Singkatnya, meskipun kerentanan compiler tidak umum, dampaknya bisa serius. Pengembang dan personel keamanan harus tetap waspada dan mengambil langkah-langkah yang sesuai untuk mengurangi risiko.
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
8 Suka
Hadiah
8
6
Bagikan
Komentar
0/400
FUD_Vaccinated
· 07-10 00:52
Kembali memplay people for suckers ya
Lihat AsliBalas0
blockBoy
· 07-08 03:21
Lagi melihat celah kontrak, sangat mengganggu~
Lihat AsliBalas0
GasGuzzler
· 07-07 09:10
Compiler lagi bikin masalah
Lihat AsliBalas0
GweiTooHigh
· 07-07 09:05
Apa yang terjadi? Ada celah lagi.
Lihat AsliBalas0
RektRecovery
· 07-07 09:00
*sigh* lagi-lagi kerentanan yang dapat diprediksi... kapan para pengembang akan belajar untuk berhenti bermain api
Lihat AsliBalas0
GasGuzzler
· 07-07 08:44
Setelah diuji setengah hari, tidak ada masalah ini.
Analisis Kerentanan Compiler Solidity: Risiko Keamanan dan Strategi Penanganan
Analisis Kerentanan Kompilator Solidity dan Strategi Penanggulangannya
Kompiler adalah salah satu komponen dasar dari sistem komputer modern, yang bertanggung jawab untuk mengubah bahasa pemrograman tingkat tinggi menjadi instruksi eksekusi tingkat rendah. Meskipun pengembang biasanya memperhatikan keamanan kode aplikasi, keamanan kompilernya sendiri juga sangat penting. Kerentanan pada kompilernya dalam beberapa kasus juga dapat menyebabkan risiko keamanan yang serius, seperti kerentanan pada mesin JavaScript browser yang dapat mengakibatkan eksekusi kode jarak jauh.
Kompiler Solidity juga tidak terkecuali, terdapat beberapa versi yang memiliki kerentanan keamanan. Berbeda dengan kerentanan EVM, kerentanan pada kompiler Solidity hanya mempengaruhi pengembang kontrak, tidak akan langsung membahayakan keamanan jaringan Ethereum. Namun, ini dapat menyebabkan kode EVM yang dihasilkan tidak sesuai dengan yang diharapkan oleh pengembang, sehingga memicu kerentanan kontrak pintar yang dapat membahayakan keamanan aset pengguna.
Berikut adalah beberapa contoh kerentanan kompilator Solidity yang nyata:
Versi yang terpengaruh: >=0.1.6 <0.4.4
Kerentanan ini dapat menyebabkan variabel storage diubah secara tidak sengaja. Contohnya:
solidity kontrak C { uint32 a = 0x1234; uint32 b = 0; fungsi run() mengembalikan (uint) { a += 1; return b; } }
fungsi run() seharusnya mengembalikan 0, tetapi sebenarnya mengembalikan 1. Ini karena kompilator tidak membersihkan bit tinggi dengan benar saat menangani overflow integer, yang menyebabkan bit overflow ditulis ke variabel yang berdekatan.
Versi yang terpengaruh: >=0.8.13 <0.8.15
Kerentanan ini berasal dari proses optimasi kompilasi. Contohnya:
solidity kontrak C { function f() public pure returns (uint) { assembly { mstore(0, 0x42) } uint x; assembly { x := mload(0) } return x; } }
f() fungsi harus mengembalikan 0x42, tetapi versi yang rentan akan mengembalikan 0. Ini karena compiler secara keliru menghapus operasi penulisan memori di blok assembly pertama.
Versi yang terpengaruh: >= 0.5.8 < 0.8.16
Kerentanan ini melibatkan encoding ABI dari array calldata. Contohnya:
solidity kontrak C { fungsi f(bytes[1] calldata a) publik murni mengembalikan (bytes memory) { return abi.encode(a); } }
f() fungsi harus mengembalikan array yang dimasukkan, tetapi versi yang rentan akan mengembalikan string kosong. Ini disebabkan oleh kesalahan pembersihan data yang berdekatan oleh kompiler selama proses pengkodean.
Untuk mengurangi risiko kerentanan pada compiler Solidity, pengembang harus:
Petugas audit keamanan harus:
Sumber referensi yang berguna:
Singkatnya, meskipun kerentanan compiler tidak umum, dampaknya bisa serius. Pengembang dan personel keamanan harus tetap waspada dan mengambil langkah-langkah yang sesuai untuk mengurangi risiko.