Tim kompiler Clang telah mengungkap proposal ambisius untuk mode pengerasan baru yang dirancang untuk meningkatkan keselamatan dan keamanan dalam program C dan C++. Inisiatif ini bertujuan untuk menyatukan mekanisme keamanan yang tersebar ke dalam satu fitur yang mudah digunakan yang dapat secara otomatis mengaktifkan berbagai langkah perlindungan seperti pemeriksaan batas, perlindungan stack, dan diagnostik yang ditingkatkan.
Proposal ini datang pada saat kekhawatiran keselamatan dalam C dan C++ telah mencapai titik kritis, dengan lembaga pemerintah dan pemimpin industri mendorong praktik pemrograman yang lebih aman. Meskipun Clang sudah menawarkan banyak fitur keamanan, saat ini tersebar di berbagai flag, makro, dan pengaturan yang dianggap sulit dinavigasi oleh banyak pengembang.
Fitur Mode Pengerasan yang Diusulkan:
- Flag peringatan:
-Wall
,-Wextra
,-Wshadow
,-Wunused
- Opsi sanitizer:
-fsanitize=address
,-fstack-protector-strong
- Makro keamanan:
__FORTIFY_SOURCE
,_GLIBCXX_ASSERTIONS
- Proteksi tingkat mesin: retpoline, LVI/LFence
- Langkah-langkah keamanan pengenal Unicode
- Spesifikasi standar bahasa yang wajib
Komunitas Memperdebatkan Trade-off Performa vs. Keamanan
Diskusi ini telah memicu minat signifikan terkait implikasi performa dari langkah-langkah pengerasan tersebut. Perkembangan terbaru dalam pemeriksaan batas menunjukkan hasil yang menjanjikan, dengan beberapa implementasi mencapai overhead serendah 0,3% untuk pemeriksaan batas pustaka standar. Ini merupakan peningkatan besar dari asumsi sebelumnya bahwa perlindungan semacam itu akan terlalu mahal untuk penggunaan produksi.
Namun, komunitas tetap terbagi dalam pendekatan implementasi. Beberapa pengembang menunjuk pada solusi yang sudah ada seperti Valgrind untuk deteksi kesalahan memori, meskipun alat-alat ini datang dengan penalti performa yang substansial - sering kali meningkatkan runtime hingga 10 sampai 30 kali. Mode pengerasan yang diusulkan bertujuan untuk menyediakan jalan tengah dengan perlindungan yang bermakna pada biaya performa yang dapat diterima.
Tolok Ukur Performa:
- Overhead pemeriksaan batas: Serendah 0,3% untuk operasi pustaka standar
- Pemeriksaan memori Valgrind : Peningkatan runtime 10-30x
- Pemeriksaan batas mode debug: Sudah tersedia di MSVC dan Clang dengan Microsoft STL
Perubahan yang Merusak Memicu Kontroversi
Mungkin aspek paling kontroversial dari proposal ini adalah sikap tim terhadap kompatibilitas mundur. RFC secara eksplisit menyatakan bahwa kode yang rusak antara rilis kompiler akan menjadi fitur, bukan bug dalam mode pengerasan. Pendekatan ini telah menghasilkan perdebatan sengit dalam komunitas.
Kode yang berfungsi adalah kode yang berfungsi, saya tidak peduli jika terlihat mencurigakan bagi fitur kompiler acak dari orang acak.
Sentimen ini mencerminkan kekhawatiran yang lebih luas tentang penekanan tradisional komunitas C++ pada kompatibilitas mundur. Banyak pengelola paket dan pengguna enterprise khawatir tentang implikasi praktis dari pendekatan semacam itu, takut hal itu dapat menciptakan beban pemeliharaan dan memaksa organisasi untuk mempertahankan beberapa versi kompiler.
Opsi Implementasi yang Sedang Dipertimbangkan
Tim Clang telah menguraikan beberapa pendekatan potensial untuk mengimplementasikan mode pengerasan. Ini berkisar dari file konfigurasi yang dapat dikirim dengan kompiler, hingga mode driver baru, flag ortogonal untuk aspek keamanan yang berbeda, atau satu flag komprehensif. Setiap pendekatan menyajikan trade-off yang berbeda dalam hal kegunaan, fleksibilitas, dan integrasi dengan sistem build yang ada.
Proposal ini juga membahas kompatibilitas dengan mode -fhardened
yang sudah ada di GCC sambil menekankan bahwa implementasi Clang mungkin berbeda dalam perilaku spesifik. Pendekatan pragmatis ini mengakui bahwa kompatibilitas sempurna antara kompiler sering kali tidak praktis sambil tetap bekerja menuju tujuan keamanan bersama.
Pendekatan Implementasi yang Sedang Dipertimbangkan:
- File Konfigurasi: Mengirimkan konfigurasi pengerasan bersama dengan Clang, diaktifkan melalui
-config=hardened
- Mode Driver: Membuat driver kompiler "hardened" yang terpisah
- Flag Ortogonal: Flag terpisah untuk opsi bahasa, diagnostik, dan sanitizer
- Flag Tunggal: Flag terpadu (misalnya,
-fhardened
) yang mengontrol semua aspek pengerasan
Fitur Keamanan di Luar Pemeriksaan Batas
Mode pengerasan akan mencakup lebih dari sekadar keselamatan memori. Proposal ini mencakup ketentuan untuk mengatasi kerentanan identifier Unicode yang memungkinkan serangan homoglyph, di mana karakter yang secara visual mirip dapat digunakan untuk membuat kode yang menipu. Serangan semacam itu mengeksploitasi karakter Unicode yang terlihat identik dengan huruf ASCII tetapi memiliki arti yang berbeda bagi kompiler.
Selain itu, mode ini dapat mengaktifkan berbagai flag peringatan, sanitizer, mekanisme perlindungan stack, dan makro yang berfokus pada keamanan seperti __FORTIFY_SOURCE
dan _GLIBCXX_ASSERTIONS
. Pendekatan komprehensif ini bertujuan untuk menciptakan lingkungan pengembangan yang mengutamakan keamanan tanpa mengharuskan pengembang untuk secara manual mengkonfigurasi puluhan pengaturan individual.
Melihat ke Depan
Tim Clang saat ini sedang mencari umpan balik komunitas tentang arah tingkat tinggi sebelum melanjutkan dengan rencana implementasi yang detail. Keberhasilan inisiatif ini dapat secara signifikan mempengaruhi bagaimana pengembangan C dan C++ berkembang dalam merespons tuntutan keamanan yang meningkat, berpotensi menetapkan standar baru untuk pengerasan program yang dibantu kompiler di seluruh ekosistem.
Referensi: [RFC] Hardening mode for the compiler