Saya telah mengerjakan proyek pribadi dalam C # yang tujuannya kurang lebih memungkinkan pengguna untuk mengeksekusi skrip yang ditulis oleh pengguna lain dan membatasi izin skrip itu. Program saya mengkompilasi skrip menggunakan perpustakaan pihak ketiga, kotak pasir mereka menggunakan mekanisme Keamanan Akses Kode NET. Dan memastikan bahwa mereka hanya memiliki izin yang ingin diberikan pengguna.
Secara umum, persyaratan keamanan saya adalah:
- pengguna harus dapat membatasi akses skrip yang tidak dipercaya hanya ke bagian-bagian tertentu dari sistem file, termasuk melarang semua akses sistem file
- pengguna harus dapat membatasi koneksi jaringan skrip yang tidak dipercaya hanya untuk alamat IP atau nama host tertentu, termasuk melarang semua koneksi jaringan
- tidak apa-apa jika skrip pengguna berhasil menggantung atau menghentikan aplikasi host, tetapi skrip pengguna tidak dapat menghindari batasan izin (mis. penolakan layanan tidak apa-apa, pelanggaran tidak)
Saya ingin mencoba melakukan sesuatu yang serupa di C ++, sebagai semacam latihan pribadi. Jelas, hal-hal lebih rumit ketika menjalankan kode asli secara langsung, bahkan jika skrip pengguna ditulis dalam bahasa skrip seperti Lua.
Pendekatan pertama yang bisa saya pikirkan adalah untuk memasukkan kait saya sendiri di lingkungan perpustakaan standar fungsi scripting. Misalnya, jika bahasa skrip Lua, alih-alih mengekspos io.open secara normal, saya harus mengekspos pembungkus yang memeriksa argumen terhadap izin skrip sebelum meneruskannya ke implementasi asli.
Kekhawatiran saya dengan pendekatan ini adalah bahwa secara drastis meningkatkan jumlah kode saya sendiri yang bertanggung jawab atas keamanan dan, oleh karena itu, potensi kerentanan keamanan yang saya tulis sendiri. Dengan kata lain, ketika bekerja dengan .NET CAS, saya dapat percaya bahwa Microsoft melakukan tugasnya dengan baik dalam kode sandboxing, sebagai lawan harus mempercayai kode sandboxing saya sendiri.
Apakah ada alternatif yang tidak saya sadari?