Apa potensi jebakan dengan memiliki kernel minimal yang menjalankan kode terkelola?

14

Misalkan saya ingin membangun sistem operasi berdasarkan kernel rendah asli asli yang sangat kecil yang bertindak sebagai penerjemah / runtime kode terkelola dan kernel atas yang lebih besar yang dikompilasi ke bahasa mesin yang bukan asli (Java bytecode, CIL, dll.). Contoh sistem operasi yang serupa adalah Singularity dan Cosmos .

Apa jebakan dan tantangan pengembangan yang ada menulis OS dengan infrastruktur semacam ini berbeda dengan solusi murni asli?

Adam Maras
sumber

Jawaban:

8

Bergantung pada bahasanya, mungkin ada banyak tantangan pembangunan:

  1. Pointer: Jika suatu bahasa tidak memiliki pointer, itu akan menjadi tantangan untuk melakukan tugas-tugas yang relatif mudah. Misalnya, Anda dapat menggunakan pointer untuk menulis ke memori VGA untuk mencetak ke layar. Namun, dalam bahasa yang dikelola, Anda akan memerlukan semacam "colokan" (dari C / C ++) untuk melakukan hal yang sama.

  2. Majelis: Suatu OS selalu membutuhkan perakitan. Bahasa seperti C #, Java, dll. Tidak bekerja dengan baik dengannya, tidak seperti C / C ++. Dalam C atau C ++ Anda juga dapat memiliki inline assembly yang sangat, sangat berguna untuk banyak tugas. Ada banyak kasus di mana ini diperlukan (contoh dalam x86): memuat GDT, memuat IDT, mengaktifkan paging, mengatur IRQ, dll.

  3. Kontrol: Jika Anda menggunakan sesuatu seperti Cosmos, Anda tidak memiliki kontrol penuh. Cosmos adalah mikro-kernel dan pada dasarnya "bootstraps" "kernel" Anda. Anda dapat mengimplementasikan sesuatu seperti Cosmos dari awal jika Anda benar-benar menginginkannya, namun itu bisa memakan waktu yang sangat lama.

  4. Overhead: Dengan bahasa yang dikelola, ada BANYAK overhead dibandingkan dengan C atau bahkan C ++. Hal-hal seperti Cosmos perlu mengimplementasikan banyak hal sebelum bahkan kernel dunia C # hello dapat dijalankan. Di C, Anda siap untuk pergi, tidak perlu pengaturan nyata. Di C ++, hanya ada beberapa hal yang perlu diimplementasikan untuk menggunakan beberapa fitur C ++.

  5. Struktur: Di C / C ++ ada struct yang tidak dimiliki oleh banyak bahasa yang dikelola, jadi Anda perlu mengimplementasikan beberapa cara untuk memiliki sesuatu seperti struct. Misalnya, jika Anda ingin memuat IDT (Interrupt Descriptor Table), di C / C ++, Anda dapat membuat struct (dengan atribut dikemas), dan beban itu menggunakan x86 ASM instruksi lidt . Dalam bahasa yang dikelola, ini jauh lebih sulit dilakukan ...

Bahasa yang dikelola, sintaksis, lebih mudah, namun, karena banyak hal terkait OS sering kali sangat tidak cocok. Itu tidak berarti mereka tidak dapat digunakan, namun, sesuatu seperti C / C ++ sering direkomendasikan.

mmk
sumber
Jawaban ini sangat lemah. Apa "tugas yang relatif mudah" yang tidak dapat Anda lakukan tanpa petunjuk (tidak termasuk fondasi kecil)? Apa saja bagian yang perlu dirakit? Kontrol apa yang Anda miliki? Apa yang menjadi dasar pernyataan Anda tentang overhead? Mengapa Anda tidak dapat memiliki struktur dalam bahasa yang dikelola?
Gilles 'SANGAT berhenti menjadi jahat'
1. Tidak ada alasan mengapa bahasa yang dikelola tidak akan menawarkan kemampuan untuk mengakses memori VGA, hanya pemetaan / unmapping yang harus disediakan sebagai primitif (primitif manajemen memori). 2. Beberapa pengalihan tugas (mis. Menyimpan register) biasanya harus dilakukan sebagai kode rakitan, tetapi sangat terlokalisasi, itu bukan argumen yang menentang 99% OS dalam bahasa yang dikelola. Memanipulasi MMU adalah manajemen memori yang primitif. 4. C juga perlu pengaturan (mengatur tumpukan dan tumpukan); bahasa yang dikelola memerlukan sedikit lebih banyak pengaturan tetapi tidak ada perbedaan kualitatif.
Gilles 'SANGAT berhenti menjadi jahat'
@Gilles, pertanyaannya adalah apa tantangan perkembangan untuk menggunakan bahasa yang dikelola. Ini adalah tantangan perkembangan, namun, Anda masih dapat berhasil mengatasi tantangan tersebut ...
mmk
5

Saya telah mendengarnya diklaim (oleh seorang peneliti yang bekerja pada teknik microkernel bersaing ) bahwa sangat sedikit yang diketahui tentang bagaimana mengevaluasi keamanan sistem yang dapat diperluas melalui kode yang dikelola.

Masalahnya adalah bahwa jenis bug yang dapat menyebabkan lubang keamanan sangat berbeda dari yang digunakan peneliti keamanan. Dalam microkernel tradisional, semua driver dan sub-bagian kernel lainnya diisolasi satu sama lain dengan menjalankannya di ruang alamat yang berbeda. Dalam sebuah microkernel di mana isolasi diimplementasikan melalui pengecekan jenis kode yang dikelola Anda menghindari overhead yang sangat besar dari ruang alamat switching setiap kali Anda perlu menggunakan sub-layanan, tetapi tradeoff adalah bahwa sekarang mengevaluasi mekanisme isolasi lebih sulit.

Setiap bagian tertentu dari kernel (katakanlah driver perangkat) yang ditulis dalam bahasa yang dikelola aman jika dan hanya jika pemeriksa tipe mengatakan driver itu aman dan pemeriksa tipe tidak memiliki bug. Jadi pemeriksa tipe adalah bagian dari inti kernel. Dalam praktiknya tampaknya checker tipe jauh lebih besar dan lebih rumit daripada core microkernel tradisional. Itu berarti bahwa permukaan serangan berpotensi lebih besar.

Saya tidak tahu apakah teknik isolasi mikro-kernel tradisional atau teknik isolasi berbasis kode dikelola benar-benar lebih atau kurang dapat diandalkan. Ada masalah bootstrap di sini: sampai teknik isolasi kode terkelola banyak digunakan, kita tidak akan tahu seberapa sering mereka tidak aman. Tetapi tanpa mengetahui seberapa tidak amannya mereka, sulit untuk menempatkan mereka dalam situasi yang kritis terhadap keamanan.

Logika Pengembaraan
sumber
Itu poin yang bagus.
Adam Maras
Saya merasa argumen ini sangat aneh. (Memang, saya mungkin bias oleh latar belakang saya dalam metode formal, tetapi ini bukan satu-satunya dasar untuk pendapat saya.) Typechecker tidak begitu rumit, dibandingkan dengan microkernel plus MMU. Sebagai contoh, microkernel Coq adalah sekitar 14 kLoC dari OCaml - lebih besar dari microkernel, tetapi tidak terlalu banyak, dan ditulis dalam bahasa yang lebih rentan kesalahan daripada kebanyakan kernel (tidak ada C atau assembler). Pemeriksa tipe tidak rentan terhadap kondisi balapan, yang merupakan kelas bug yang sangat halus.
Gilles 'SO- berhenti bersikap jahat'
Kode yang dikelola memberikan peluang yang lebih baik untuk menangani kelas bug tertentu; misalnya, analisis aliran informasi dapat membuktikan tidak adanya saluran samping (kemungkinan membutuhkan banyak pekerjaan, dan saya tidak tahu sejauh mana hal itu dilakukan, tetapi pada prinsipnya bisa dilakukan), sedangkan isolasi perangkat keras hanya memungkinkan Anda menguji saluran samping yang telah Anda pikirkan.
Gilles 'SANGAT berhenti menjadi jahat'
Di sisi praktis, beberapa mesin virtual yang menyediakan isolasi telah disertifikasi pada EAL5 dan lebih tinggi. Berikut adalah dua contoh yang mungkin Anda miliki di dompet Anda jika Anda orang Eropa, karena mereka digunakan dalam kartu pintar seperti kartu kredit: MULTOS , platform terbuka Kartu Java . Di komunitas evaluasi keamanan, saya telah mendengar banyak keraguan bahwa isolasi MMU dapat melampaui EAL2.
Gilles 'SANGAT berhenti menjadi jahat'