mem-isolate: Keselamatan Memori Berasaskan Fork Mempunyai Batasan Serius, Pakar Memberi Amaran

BigGo Editorial Team
mem-isolate: Keselamatan Memori Berasaskan Fork Mempunyai Batasan Serius, Pakar Memberi Amaran

Komuniti Rust kini sedang membincangkan perpustakaan mem-isolate yang baru dikeluarkan, yang menjanjikan untuk menjalankan kod tidak selamat dengan selamat melalui teknik yang mengasingkan operasi berbahaya dalam proses yang difork. Walaupun pendekatan ini bijak, pakar keselamatan dan pengaturcaraan sistem telah menimbulkan kebimbangan ketara tentang batasannya dan potensi penyalahgunaannya.

mem-isolate berfungsi dengan melaksanakan fungsi dalam proses anak yang diasingkan yang dicipta melalui panggilan sistem POSIX fork(). Pendekatan ini mencipta salinan ruang memori proses induk, membolehkan operasi tidak selamat dijalankan tanpa menjejaskan ruang memori proses asal. Apabila fungsi selesai, hasilnya diserialisasikan kembali kepada proses induk melalui paip, dan proses anak ditamatkan.

Batasan Keselamatan

Pakar keselamatan dalam komuniti telah menunjukkan bahawa mem-isolate sebenarnya tidak menyediakan tahap keselamatan yang diimplikasikan oleh namanya. Perpustakaan ini tidak memenuhi definisi Rust tentang kod selamat, yang memerlukan jaminan keselamatan memori spatial dan temporal.

Saya tidak fikir ini memenuhi definisi 'selamat' dalam Rust yang selamat: selamat bukan sahaja bermaksud tidak akan gagal disebabkan oleh ralat memori spatial, ia bermaksud bahawa kod itu sebenarnya selamat dari segi memori spatial dan temporal.

Dari perspektif keselamatan, pengasingan yang disediakan adalah cetek. Proses yang difork mengekalkan salinan lengkap keadaan program, termasuk apa-apa rahsia dalam memori. Ini bermakna kod tidak selamat yang boleh dieksploitasi masih boleh mengakses maklumat sensitif dalam persekitaran yang diasingkan. Tambahan pula, proses anak mengekalkan keistimewaan yang sama seperti induk, jadi kelemahan pelaksanaan kod masih boleh dieksploitasi.

Batasan Utama mem-isolate:

  • Hanya berfungsi pada sistem POSIX (Linux, macOS, BSD)
  • Menambah overhead sekitar 1.9ms bagi setiap panggilan fungsi (berbanding 1.5ns untuk panggilan terus)
  • Memerlukan pengserialan data yang dikembalikan antara proses
  • Berpotensi berbahaya dalam aplikasi berbilang bebenang
  • Tidak menghalang eksploitasi yang tidak menyebabkan kerosakan sistem
  • Proses anak mempunyai keistimewaan dan akses memori yang sama seperti proses induk
  • Boleh menyebabkan kebuntuan jika proses bercabang ketika mutex sedang dipegang

Kebimbangan Teknikal dengan Fork

Pakar pengaturcaraan sistem telah menekankan bahawa fork() adalah API yang bermasalah untuk kes penggunaan ini, terutamanya dalam aplikasi berbilang benang. Apabila proses difork, seluruh keadaan memori direplikasi, termasuk keadaan mutex dan kunci. Jika mana-mana benang memegang kunci pada masa forking, proses anak boleh mengalami deadlock.

Walaupun operasi mudah seperti mencetak atau peruntukan memori boleh menyebabkan pembekuan dalam proses yang difork. Penimbal ruang pengguna yang tidak dibilas sebelum callback selesai akan hilang. Isu-isu ini menjadikan mem-isolate berpotensi berbahaya dalam aplikasi kompleks.

Implikasi Prestasi

Perpustakaan ini memperkenalkan overhed prestasi yang ketara, dengan penanda aras menunjukkan bahawa execute_in_isolated_process() mengambil masa kira-kira 1.9ms berbanding dengan 1.5ns untuk panggilan fungsi langsung – lebih sejuta kali lebih perlahan. Walaupun penulis mengakui batasan ini dengan komen jenaka tentang menjalankan kod 1ms lebih perlahan, ahli komuniti menunjukkan bahawa overhed ini menjadikan perpustakaan tidak praktikal untuk banyak kes penggunaan.

Ramai pembangun menggunakan kod tidak selamat khusus untuk pengoptimuman prestasi, jadi membungkus kod sedemikian dalam mekanisme yang memperkenalkan overhed yang besar mengalahkan tujuan asal. Seperti yang dinyatakan oleh seorang pengulas, menggunakan pendekatan ini secara meluas boleh menafikan kelebihan prestasi Rust berbanding bahasa seperti Python atau Ruby yang sangat bergantung pada forking untuk keselarian.

Penanda Aras Prestasi:

  • Panggilan fungsi langsung: ~1.5ns
  • fork() + wait: ~1.7ms
  • execute_in_isolated_process(): ~1.9ms

Aplikasi Praktikal

Walaupun terdapat batasannya, sesetengah pembangun melihat nilai dalam mem-isolate untuk senario tertentu. Perpustakaan ini boleh berguna apabila bekerja dengan kod pihak ketiga yang secara semulajadi tidak selamat yang tidak dapat diperbaiki, terutamanya apabila berinteraksi dengan perpustakaan C. Dalam kes-kes ini, pengasingan yang disediakan mungkin merupakan pertukaran yang boleh diterima untuk keselamatan tambahan, terutamanya dalam laluan yang tidak kritikal dari segi prestasi.

Walau bagaimanapun, untuk kebanyakan aplikasi, pakar mengesyorkan pendekatan pengasingan yang lebih teguh. Seni bina berbilang proses yang direka dengan baik dengan saluran IPC terhad dan API sandboxing peringkat OS memberikan jaminan keselamatan yang lebih kukuh. Enjin pelayar seperti Chrome menggunakan pendekatan ini berbanding pengasingan proses yang mudah.

Perbincangan mengenai mem-isolate menyoroti cabaran berterusan dalam mengimbangi keselamatan, prestasi, dan kepraktisan dalam pengaturcaraan sistem. Walaupun pendekatan inovatif terhadap keselamatan memori dialu-alukan dalam ekosistem Rust, ia mesti dinilai dengan teliti berbanding amalan terbaik dan model keselamatan yang mantap.

Rujukan: mem-isolate: Run unsafe code safely