mem-isolate: Keamanan Memori Berbasis Fork Memiliki Keterbatasan Serius, Pakar Memperingatkan

BigGo Editorial Team
mem-isolate: Keamanan Memori Berbasis Fork Memiliki Keterbatasan Serius, Pakar Memperingatkan

Komunitas Rust saat ini sedang mendiskusikan pustaka mem-isolate yang baru dirilis, yang menjanjikan untuk menjalankan kode tidak aman secara aman melalui teknik yang mengisolasi operasi yang berpotensi berbahaya dalam proses yang di-fork. Meskipun pendekatan ini cerdas, para pakar keamanan dan pemrograman sistem telah mengangkat kekhawatiran signifikan tentang keterbatasan dan potensi penyalahgunaannya.

mem-isolate bekerja dengan mengeksekusi fungsi dalam proses anak yang terisolasi yang dibuat melalui panggilan sistem POSIX fork(). Pendekatan ini menciptakan salinan memori proses induk, memungkinkan operasi tidak aman berjalan tanpa mempengaruhi ruang memori proses asli. Ketika fungsi selesai, hasil diserialisasi kembali ke proses induk melalui pipa, dan proses anak dihentikan.

Keterbatasan Keamanan

Para pakar keamanan dalam komunitas telah menunjukkan bahwa mem-isolate sebenarnya tidak memberikan tingkat keamanan seperti yang tersirat oleh namanya. Pustaka ini tidak memenuhi definisi Rust tentang kode aman, yang memerlukan jaminan keamanan memori spasial dan temporal.

Saya tidak berpikir ini memenuhi definisi aman dalam Rust yang aman: aman tidak hanya berarti tidak akan crash karena kesalahan memori spasial, tetapi berarti bahwa kode tersebut sebenarnya aman secara spasial dan temporal dalam hal memori.

Dari perspektif keamanan, isolasi yang diberikan bersifat superfisial. Proses yang di-fork mempertahankan salinan lengkap dari status program, termasuk rahasia apa pun dalam memori. Ini berarti bahwa kode tidak aman yang dapat dieksploitasi masih dapat mengakses informasi sensitif dalam lingkungan terisolasi. Selain itu, proses anak mempertahankan hak istimewa yang sama dengan induknya, sehingga kerentanan eksekusi kode tetap dapat dieksploitasi.

Keterbatasan Utama mem-isolate:

  • Hanya berfungsi pada sistem POSIX (Linux, macOS, BSD)
  • Menimbulkan overhead sekitar 1,9ms per pemanggilan fungsi (dibandingkan dengan 1,5ns untuk pemanggilan langsung)
  • Memerlukan serialisasi data yang dikembalikan antar proses
  • Berpotensi berbahaya dalam aplikasi multi-thread
  • Tidak mencegah eksploitasi yang tidak menyebabkan crash
  • Proses anak memiliki hak akses dan akses memori yang sama dengan proses induk
  • Dapat menyebabkan deadlock jika melakukan fork saat mutex sedang digunakan

Masalah Teknis dengan Fork

Para ahli pemrograman sistem telah menyoroti bahwa fork() adalah API yang bermasalah untuk kasus penggunaan ini, terutama dalam aplikasi multi-thread. Ketika sebuah proses melakukan fork, seluruh status memori direplikasi, termasuk status mutex dan kunci. Jika ada thread yang memegang kunci pada saat forking, proses anak bisa mengalami deadlock.

Bahkan operasi sederhana seperti mencetak atau alokasi memori dapat menyebabkan pembekuan dalam proses yang di-fork. Buffer ruang pengguna yang tidak di-flush sebelum callback selesai akan hilang. Masalah-masalah ini membuat mem-isolate berpotensi berbahaya dalam aplikasi kompleks.

Implikasi Kinerja

Pustaka ini menimbulkan overhead kinerja yang signifikan, dengan benchmark menunjukkan bahwa execute_in_isolated_process() membutuhkan waktu sekitar 1,9ms dibandingkan dengan 1,5ns untuk panggilan fungsi langsung – lebih dari sejuta kali lebih lambat. Meskipun penulis mengakui keterbatasan ini dengan komentar jenaka tentang menjalankan kode 1ms lebih lambat, anggota komunitas menunjukkan bahwa overhead ini membuat pustaka tidak praktis untuk banyak kasus penggunaan.

Banyak pengembang menggunakan kode tidak aman khusus untuk optimasi kinerja, sehingga membungkus kode tersebut dalam mekanisme yang menimbulkan overhead substansial mengalahkan tujuan aslinya. Seperti yang dicatat oleh seorang komentator, menggunakan pendekatan ini secara ekstensif dapat menghilangkan keunggulan kinerja Rust dibandingkan dengan bahasa seperti Python atau Ruby yang sangat bergantung pada forking untuk paralelisme.

Tolok Ukur Performa:

  • Pemanggilan fungsi langsung: ~1,5ns
  • fork() + wait: ~1,7ms
  • execute_in_isolated_process(): ~1,9ms

Aplikasi Praktis

Terlepas dari keterbatasannya, beberapa pengembang melihat nilai dalam mem-isolate untuk skenario tertentu. Pustaka ini bisa berguna ketika bekerja dengan kode pihak ketiga yang secara inheren tidak aman yang tidak dapat ditingkatkan, terutama ketika berinteraksi dengan pustaka C. Dalam kasus ini, isolasi yang diberikan mungkin merupakan kompromi yang dapat diterima untuk keamanan tambahan, terutama dalam jalur yang tidak kritis terhadap kinerja.

Namun, untuk sebagian besar aplikasi, para ahli merekomendasikan pendekatan isolasi yang lebih kuat. Arsitektur multi-proses yang dirancang dengan baik dengan saluran IPC terbatas dan API sandboxing tingkat OS memberikan jaminan keamanan yang lebih kuat. Mesin browser seperti Chrome menggunakan pendekatan ini daripada isolasi proses sederhana.

Diskusi seputar mem-isolate menyoroti tantangan berkelanjutan dalam menyeimbangkan keamanan, kinerja, dan kepraktisan dalam pemrograman sistem. Meskipun pendekatan inovatif terhadap keamanan memori disambut baik dalam ekosistem Rust, pendekatan tersebut harus dievaluasi dengan hati-hati terhadap praktik terbaik dan model keamanan yang telah mapan.

Referensi: mem-isolate: Run unsafe code safely