Clang vs. Clang: Jangan Membuat Clang Marah
- Ini adalah tulisan blog yang membahas eksperimen terkait Clang
- Jika melihat perubahan terbaru pada LLVM dan GCC yang berkaitan dengan optimisasi compiler, isinya mencakup optimisasi, pengujian optimisasi, perbaikan pengujian, dan perbaikan bug
- Para pembuat compiler cenderung tidak mau bertanggung jawab atas bug yang mereka perkenalkan sendiri
- Optimisasi compiler tidak banyak berkontribusi pada peningkatan performa nyata
Masalah optimisasi compiler
- Jarang ada kasus di mana compiler yang dioptimalkan benar-benar meningkatkan performa
- Sebagai contoh, implementasi avx2 dari kyber768 4 kali lebih cepat dibandingkan kode yang dikompilasi dengan compiler yang dioptimalkan
- Menurut hukum Todd A. Proebsting, optimisasi compiler nyaris tidak berkontribusi pada performa komputasi
- Hasil benchmark dari Arseny Kapoulkine juga sampai pada kesimpulan yang serupa
Masalah keamanan
- Compiler yang dioptimalkan dapat menimbulkan bukan hanya bug tradisional, tetapi juga masalah keamanan seperti timing leak
- Menurut makalah EuroS&P 2018, upgrade compiler dapat membuka timing channel dan membuat kode keamanan menjadi rentan
- Pada kode referensi Kyber, serangan timing yang berhasil telah dilaporkan pada kode yang dikompilasi dengan opsi optimisasi Clang 15 atau lebih baru
Alat TIMECOP
- TIMECOP 2 terintegrasi ke dalam framework pengujian kriptografi SUPERCOP dan secara otomatis memindai conditional branch yang diturunkan dari secret
- Perbedaan TIMECOP 1 dan TIMECOP 2: TIMECOP 2 secara otomatis menandai output RNG sebagai secret dan berjalan di multi-core
Menulis kode constant-time
- Sebuah presentasi tentang cara menulis kode constant-time disampaikan pada Juli 2024
- Dijelaskan fungsi-fungsi constant-time yang disediakan oleh libmceliece dan SUPERCOP
- Sebagai contoh, fungsi
crypto_uint32_bitmod_mask(x,j) membuat compiler tidak mengenali hasil 1-bit
Mencegah masalah optimisasi compiler
- Salah satu cara untuk mencegah compiler memasukkan timing leak adalah dengan mendistribusikan library dalam bahasa assembly
- Namun, bahasa assembly dapat membuat audit terhadap kebenaran perangkat lunak menjadi lebih sulit
- Sedang dicari cara untuk cepat memasukkan kode pencegahan timing leak ke dalam kode seperti C, C++, dan lainnya
Patch clang-vs-clang
- Sebuah patch ditulis untuk alat optimisasi LLVM agar memindai
&1 dan >>31 lalu menampilkan pesan peringatan
- Sebagai contoh, pesan peringatan akan ditampilkan pada kode
x >>= 31
Kesimpulan
- Optimisasi compiler tidak banyak berkontribusi pada peningkatan performa dan dapat menimbulkan masalah keamanan
- Perlu menggunakan alat seperti TIMECOP untuk menulis kode constant-time dan mencegah masalah optimisasi compiler
Ringkasan GN⁺
- Tulisan ini membahas masalah optimisasi compiler dan risiko keamanannya
- Ditekankan bahwa optimisasi compiler tidak banyak berkontribusi pada peningkatan performa nyata dan dapat menimbulkan masalah keamanan
- Dengan memperkenalkan alat TIMECOP dan cara menulis kode constant-time, tulisan ini menunjukkan cara mencegah masalah keamanan
- Tulisan ini juga mengusulkan distribusi library dalam bahasa assembly sebagai cara mencegah masalah optimisasi compiler
- Proyek lain yang terkait di bidang ini mencakup compiler berfokus keamanan seperti FaCT dan Jasmin
1 komentar
Opini Hacker News
Penulis compiler tidak bertanggung jawab atas bug yang muncul akibat optimasi
Setuju dengan pendapat Bernstein, tetapi kadang arahnya keliru
C dan C++ tidak cocok untuk menulis algoritme yang memerlukan jaminan waktu konstan
Pada CPU Intel,
clangmaupun apa pun yang lain tidak bisa menghasilkan kode yang benar di mode penggunaTidak setuju dengan klaim bahwa penulis compiler tidak bertanggung jawab atas bug
clangmemiliki atributclang::optnoneuntuk menonaktifkan optimasi per fungsignu::optimizeuntuk mengatur level optimasiclang::no_builtinsmenonaktifkan optimasimemcpydanmemsetKarena ada banyak undefined behavior di C, ada kemungkinan berpindah ke bahasa lain
settidak pentingSetuju dengan tujuan para ahli kriptografi, tetapi compiler serbaguna tidak mempertimbangkan hal itu
Memang benar bahwa beberapa bahasa dan compiler tidak cocok untuk menulis rutin kriptografi waktu konstan
Dalam contoh fungsi tertentu, input
SIZE_T_MAXmemicu undefined behavior