2 poin oleh GN⁺ 2024-08-05 | 1 komentar | Bagikan ke WhatsApp

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

 
GN⁺ 2024-08-05
Opini Hacker News
  • Penulis compiler tidak bertanggung jawab atas bug yang muncul akibat optimasi

    • Menurut standar bahasa, bug semacam ini dianggap sebagai kesalahan programmer
    • Ini menjadi bukti bahwa hal tersebut bukan bug
  • Setuju dengan pendapat Bernstein, tetapi kadang arahnya keliru

    • Manfaat optimasi berbeda-beda tergantung kasus penggunaan
    • Ada keluhan bahwa compiler C tidak mempertimbangkan makna yang tidak bisa diekspresikan dalam bahasa
    • Ini bisa diringkas dengan kesimpulan: "gunakan bahasa yang bisa mengekspresikan makna yang dibutuhkan"
  • C dan C++ tidak cocok untuk menulis algoritme yang memerlukan jaminan waktu konstan

    • Standarnya hampir tidak memiliki konsep real-time
    • Menyalahkan pengembang compiler adalah arah yang keliru
  • Pada CPU Intel, clang maupun apa pun yang lain tidak bisa menghasilkan kode yang benar di mode pengguna

    • Tidak mungkin mengatur DOITM
  • Tidak setuju dengan klaim bahwa penulis compiler tidak bertanggung jawab atas bug

    • Ini adalah kesalahpahaman mendasar tentang "undefined behavior" di C
  • clang memiliki atribut clang::optnone untuk menonaktifkan optimasi per fungsi

    • GCC memiliki atribut gnu::optimize untuk mengatur level optimasi
    • clang::no_builtins menonaktifkan optimasi memcpy dan memset
  • Karena ada banyak undefined behavior di C, ada kemungkinan berpindah ke bahasa lain

    • Di Python, urutan objek set tidak penting
    • Compiler C mencoba melakukan optimasi dengan menganalisis pola kode
    • Ini dapat memberikan performa yang lebih baik dengan cara yang mirip dengan penyelesaian masalah pada teleskop Hubble
  • Setuju dengan tujuan para ahli kriptografi, tetapi compiler serbaguna tidak mempertimbangkan hal itu

    • Mungkin diperlukan compiler yang terspesialisasi
  • Memang benar bahwa beberapa bahasa dan compiler tidak cocok untuk menulis rutin kriptografi waktu konstan

    • Namun salah jika menyimpulkan bahwa semua compiler dan bahasa non-assembly itu buruk
    • Compiler dan bahasa khusus domain yang sederhana perlu dibuat
  • Dalam contoh fungsi tertentu, input SIZE_T_MAX memicu undefined behavior

    • Ada banyak bug semacam ini, tetapi pada praktiknya tidak penting