Keterbatasan Inspeksi Tumpukan

8

Ini adalah tindak lanjut dari Bagaimana cara kerja Stack Inspection? yang mengeksplorasi gagasan secara lebih rinci

Stack inspection adalah mekanisme untuk memastikan keamanan dalam konteks mesin virtual JVM dan CLR ketika modul kode yang diunduh secara eksternal dari berbagai tingkat kepercayaan dapat berjalan bersama. Pustaka sistem itu perlu cara untuk membedakan antara panggilan yang berasal dari kode yang tidak dipercaya dan panggilan yang berasal dari aplikasi tepercaya itu sendiri. Ini dilakukan dengan mengaitkan dengan kode prinsipal yang sesuai dengan asalnya. Kemudian izin akses dicatat pada stack dan setiap kali panggilan ke sensitif, metode sistem dibuat, stack dilintasi untuk melihat apakah izin yang sesuai untuk kepala sekolah yang membuat panggilan ada pada stack.

Apa batasan inspeksi tumpukan? Mekanisme apa yang telah diusulkan untuk menggantikannya? Apakah ada perubahan signifikan yang dibuat pada model sejak diperkenalkan pada akhir 90-an?

Dave Clarke
sumber
Saya mengalami kesulitan memahami sepenuhnya cara kerja inspeksi tumpukan. Bisakah Anda memasukkan tautan ke penjelasan yang bagus?
Raphael
@ Raphael: Pertanyaan bagus. Saya telah mengajukan pertanyaan: cs.stackexchange.com/questions/796/…
Dave Clarke
1
Makalah ini menerbitkan beberapa batasan Stack Inspection Model yang digunakan dalam JVM dan Microsoft CLR (tapi saya menemukannya sekarang dan saya hanya membaca kesimpulannya): research.microsoft.com/en-us/um/people/adg/Publications/…
Vor

Jawaban:

6

Inspeksi tumpukan diperlukan karena program pada JVM dan CLR memiliki akses default ke operasi berbahaya, jadi sesuatu harus dilakukan untuk mencegah bencana. Sebagai contoh, sebuah program yang tidak dipercaya dapat merujuk pustaka I / O dan menyebutnya:

using IO;
...
IO.DeleteFile("/home/foo/bla");

Jadi pada setiap operasi berbahaya yang dilakukan, kita perlu memeriksa apakah diizinkan. Dengan inspeksi tumpukan biasanya rumit untuk memahami siapa yang mendapatkan akses ke apa. Ini juga membuat optimisasi seperti inlining dan panggilan ekor sulit.

Mekanisme superior adalah untuk tidak memberikan setiap program akses otomatis ke operasi berbahaya sejak awal. Dalam model ini tidak ada cara untuk mengimpor perpustakaan IO. Satu-satunya cara untuk mendapatkan akses ke perpustakaan IO adalah jika orang lain memberikannya kepada Anda. Ini disebut kapabilitas keamanan. Pengantar dapat ditemukan di sini .

Sebagai gantinya, kami akan menulis program sebelumnya seperti ini:

Main(IOLibrary IO){
  IO.DeleteFile("/home/foo/bla");
}

Pustaka IO adalah parameter ke titik masuk program, dan ini disebut kemampuan (karena memberikan penggunaan beberapa kemampuan, dalam hal ini untuk melakukan IO). Untuk dapat menjalankan program ini, kita harus memiliki akses ke kemampuan IO sendiri, dan menjalankan program dengan menelepon Main(ourIOlibrary). Jika kita menjalankan program yang tidak tepercaya, kita hanya tidak meneruskan pustaka IO kita ke sana, karena mungkin menggunakan pustaka itu untuk menghapus file kita. Dalam beberapa kasus kami ingin memberikan akses terbatas ke program filesystem yang tidak terpercaya. Dalam hal ini kami membuat pembungkus di sekitar pustaka IO kami sendiri yang hanya memungkinkan akses ke direktori tertentu, dan meneruskannya ke program yang tidak dipercaya alih-alih pustaka IO lengkap

Jadi jika kita memerlukan kemampuan IO untuk menjalankan program yang membutuhkan kemampuan IO, itu juga berarti bahwa apa pun yang dipanggil program kita harus memiliki akses ke kemampuan IO untuk dapat memberikannya kepada kita. Jadi dari mana kemampuan IO-nya berasal? Ya, pada akhirnya ada titik di mana manusia yang mengoperasikan komputer memanggil sebuah program. Manusia ini memiliki akses ke semua kemampuan sistem, sehingga ia dapat meneruskan kemampuan IO. Jika manusia ini tidak mempercayai program yang dia jalankan, maka dia tidak akan meneruskan kemampuan IOnya untuk itu.

Anda mungkin dapat dengan mudah membayangkan jenis-jenis kemampuan lain: akses internet, akses untuk menggambar barang-barang di layar Anda, dll. Misalnya sistem pengaya peramban yang aman mungkin memberikan kemampuan grafis pada pengaya yang tidak dipercaya yang hanya memungkinkannya untuk melukis gambar dalam sebuah persegi panjang yang telah ditentukan sebelumnya. di halaman.

Jules
sumber
5

Salah satu batasan inspeksi tumpukan seperti yang diterapkan secara tradisional adalah bahwa hal itu merusak panggilan ekor yang tepat. Secara khusus, implementasi yang khas perlu menjaga seluruh "tumpukan" tetap ada setiap saat. Clements dan Felleisen menunjukkan bagaimana masalah ini dapat diatasi dengan menggunakan teknik yang disebut "tanda kelanjutan" dalam makalah mereka . Semantik Ekor-Rekursif untuk Inspeksi Tumpukan di ESOP 2003.

Sam Tobin-Hochstadt
sumber