5 poin oleh GN⁺ 2025-01-24 | 4 komentar | Bagikan ke WhatsApp
  • Crash yang hanya terjadi di ARM64

    • Dalam proses mem-porting kode network I/O EdgeDB dari Python ke Rust, muncul masalah di mana pengujian gagal secara intermiten pada runner CI ARM64.
    • Awalnya terlihat seperti deadlock, tetapi sebenarnya proses mengalami crash dan test runner gagal mendeteksinya.
  • Teori awal

    • Untuk memahami mengapa masalah ini hanya terjadi di ARM64, perbedaan model memori ikut dipertimbangkan.
    • Model memori Intel bersifat ketat, sedangkan ARM memiliki model memori yang lebih lemah.
  • Debugging di mesin CI

    • Masalah diselidiki dengan terhubung langsung ke runner ARM64 di AWS.
    • Proses mengalami crash dan meninggalkan core dump, yang kemudian diperiksa untuk menemukan penyebab masalah.
  • Penyebab sebenarnya: setenv dan getenv

    • setenv tidak aman dalam lingkungan multithread dan dapat menyebabkan crash saat berinteraksi dengan getenv.
    • Penetapan ulang variabel lingkungan terungkap sebagai penyebab masalah.
  • Kaitan dengan openssl_probe

    • Masalah muncul ketika openssl-probe menetapkan variabel lingkungan SSL_CERT_FILE dan SSL_CERT_DIR.
    • Crash terjadi selama rust-native-tls milik Rust menetapkan variabel lingkungan tersebut.
  • Mengapa hanya terjadi di ARM64 Linux

    • Crash hanya terjadi jika beberapa kondisi terpenuhi sekaligus, termasuk jumlah variabel lingkungan dan kegagalan I/O.
  • Solusi

    • Diputuskan untuk beralih dari backend rust-native-tls/openssl milik reqwest ke rustls.
    • Proyek Rust berencana menjadikan fungsi pengaturan lingkungan sebagai tidak aman, dan proyek glibc meningkatkan keamanan thread pada getenv.

4 komentar

 
carnoxen 2025-01-24
 
y15un 2025-01-24

Saya akan menulis judulnya sebagai, "Ketidakamanan thread pada stdlib C bahkan tidak bisa diselamatkan oleh Rust yang katanya aman." :)

 
halfenif 2025-01-24

Saya benar-benar memahaminya.

 
GN⁺ 2025-01-24
Komentar Hacker News
  • Di edisi Rust berikutnya, pengubah environment akan dibuat tidak aman. Ini bisa memengaruhi crate yang saling bertabrakan

    • Di pustaka standar Rust, set_var dan remove_var akan mewajibkan penggunaan blok unsafe {} pada edisi 2024
    • Dokumentasi saat ini memang menyebutkan masalah keamanan, tetapi menjadikan fungsi-fungsi ini aman sejak awal adalah sebuah kesalahan
  • Patch untuk glibc membuat getenv lebih aman, tetapi C masih mengizinkan akses langsung ke environment sehingga tetap tidak sepenuhnya aman

    • Para maintainer pustaka standar C enggan membuat setenv aman untuk multithread, tetapi setidaknya API thread-safe yang baru seharusnya didefinisikan
    • Maintainer Musl tampaknya tidak yakin bahwa masalah ini tidak bisa diselesaikan
  • Mengalami bug terkait environment di Linux dianggap semacam ritual peralihan

    • Linus dan kernel bersikap praktis dalam memperbaiki bug POSIX, tetapi glibc masih tertinggal
    • Menyediakan getenv_r(), menyinkronkannya dengan setenv(), serta memberi peringatan saat kompilasi/linking mungkin akan membantu menyelesaikan masalah
  • Konfigurasi menggunakan variabel environment adalah bagian dari gerakan "12-factor app", tetapi ini dianggap sebagai pendekatan yang bodoh

    • Menggunakan berkas konfigurasi seperti YAML dianggap sebagai pendekatan yang lebih baik dibanding variabel environment
  • Mesin CI yang berjalan di Amazon AWS punya kelebihan karena menyediakan pengguna root yang sesungguhnya

    • Kita tampaknya telah kehilangan kemampuan membangun dan men-debug kode secara lokal tanpa cloud dan container
  • Ini artikel yang sangat bagus dalam mengupas bug yang tidak intuitif

    • Laporan pemecahan masalah sedetail ini memberi pengalaman yang paling mendekati melakukannya sendiri
  • env::set_var kini tidak aman

    • Pada program single-thread, fungsi ini bisa dipanggil dengan aman
    • Di Windows, fungsi ini selalu aman baik pada program single-thread maupun multithread
    • Pada program multithread di sistem operasi lain, satu-satunya pilihan aman adalah tidak menggunakan set_var atau remove_var
  • Ini mengingatkan pada pengalaman ketika setproctitle tidak berfungsi di codebase tertentu

    • Setelah mengimpor numpy, setproctitle tidak berfungsi, karena pemanggilan getenv atau setenv saat inisialisasi numpy mengubah alamat environ