Zirkon? Apa ini
Pada Agustus 2016, tanpa pengumuman resmi dari Google, sumber sistem operasi baru ditemukan
Fuchsia. OS ini didasarkan pada microkernel yang disebut Zircon, yang pada gilirannya didasarkan pada LK (Little Kernel) .
Fuchsia bukan Linux
Apa yang akan dibahas dalam artikel?
vDSO di Zircon adalah satu - satunya cara mengakses panggilan sistem (syscalls) .
Apakah benar-benar mustahil untuk langsung menghubungi instruksi prosesor SYSENTER / SYSCALL dari kode kami? Tidak, instruksi prosesor ini bukan bagian dari sistem ABI. Kode pengguna dilarang untuk langsung mengikuti instruksi ini.
Mereka yang ingin mengetahui lebih detail tentang langkah arsitektur seperti itu, saya mengundang Anda ke Cat.

Zircon vDSO (Objek Bersama Dinamis virtual)
Singkatan vDSO adalah singkatan dari irtual D ynamic S hared O bject:
- Dynamic Shared Object adalah istilah yang digunakan untuk merujuk ke perpustakaan bersama untuk format ELF (file .so).
- Objek ini virtual karena tidak memuat dari file terpisah yang ada di sistem file. Gambar vDSO disediakan langsung oleh kernel.
Dukungan kernel
Dukungan untuk vDSO sebagai satu-satunya ABI yang dikontrol untuk aplikasi mode pengguna diimplementasikan dalam dua cara:
Memproyeksikan objek memori virtual ( VMO, Objek Memori Virtual ).
Ketika zx_vmar_map memproses VMO untuk vDSO (dan ZX_VM_PERM_EXECUTE
diminta dalam argumen), kernel mensyaratkan bahwa offset dan ukuran secara ketat sesuai dengan segmen vDSO yang dapat dieksekusi. Ini (termasuk) menjamin hanya satu proyeksi vDSO ke dalam memori proses. Setelah proyeksi sukses pertama vDSO ke dalam proses, itu tidak lagi dapat dihapus. Dan upaya untuk memproyeksikan ulang vDSO ke dalam memori proses, upaya untuk menghapus VMO yang diproyeksikan untuk vDSO atau proyek dengan offset yang salah dan / atau ukuran gagal dengan kesalahan ZX_ERR_ACCESS_DENIED
.
Offset dan ukuran kode vDSO diekstraksi pada tahap kompilasi dari file ELF dan kemudian digunakan dalam kode kernel untuk melakukan pemeriksaan di atas. Setelah proyeksi vDSO pertama yang berhasil, kernel OS akan mengingat alamat untuk proses target untuk mempercepat pemeriksaan.
Periksa alamat pengirim untuk fungsi-fungsi panggilan sistem.
Ketika kode mode pengguna memanggil kernel, nomor panggilan sistem tingkat rendah ditransmisikan dalam register. Panggilan sistem tingkat rendah adalah antarmuka internal (pribadi) antara vDSO dan inti Zircon. Beberapa (sebagian besar) secara langsung berhubungan dengan panggilan sistem ABI publik, sementara yang lain tidak.
Untuk setiap panggilan sistem tingkat rendah dalam kode vDSO, ada set offset tetap dalam kode yang melakukan panggilan ini. Kode sumber untuk vDSO mendefinisikan karakter internal yang mengidentifikasi setiap lokasi tersebut. Pada waktu kompilasi, lokasi ini diambil dari tabel simbol vDSO dan digunakan untuk menghasilkan kode kernel yang menentukan prediksi validitas alamat kode untuk setiap panggilan sistem tingkat rendah. Predikat ini memungkinkan Anda untuk dengan cepat memeriksa kode panggilan untuk validitas, mengingat offset dari awal segmen kode vDSO.
Jika predikat menentukan bahwa kode panggilan tidak diperbolehkan untuk membuat panggilan sistem, pengecualian sintetis dilemparkan, mirip dengan yang sama seperti jika kode panggilan mencoba untuk menjalankan instruksi yang tidak ada atau istimewa.
vDSO saat membuat proses baru
Untuk memulai eksekusi utas pertama dari proses yang baru dibuat, panggilan sistem zx_process_start digunakan . Parameter terakhir dari panggilan sistem ini (lihat arg2 dalam dokumentasi) melewati argumen untuk utas pertama dari proses yang dibuat. Menurut perjanjian yang diterima, program loader memetakan vDSO ke ruang alamat proses baru (ke tempat acak yang dipilih oleh sistem) dan mentransfer alamat basis pemetaan dengan argumen arg2 ke utas pertama dari proses yang dibuat. Alamat ini adalah alamat header file ELF, di mana fungsi-fungsi bernama yang diperlukan dapat ditemukan untuk melakukan panggilan sistem.
Kartu memori (tata letak) vDSO
vDSO adalah pustaka bersama EFL biasa yang dapat dianggap seperti yang lain. Tetapi untuk vDSO, sebagian kecil dari seluruh format ELF sengaja dipilih. Ini memiliki beberapa keunggulan:
- Pemetaan ELF seperti itu ke dalam proses itu sederhana dan tidak termasuk kasus batas kompleks yang diperlukan untuk sepenuhnya mendukung program ELF.
- Menggunakan vDSO tidak membutuhkan pengikatan ELF dinamis yang berfungsi penuh. Secara khusus, vDSO tidak memiliki relokasi dinamis. Memproyeksikan segmen PT_LOAD dari file ELF adalah satu-satunya tindakan yang diperlukan.
- Kode vDSO adalah stateless dan reentrant. Ini bekerja secara eksklusif dengan register prosesor dan tumpukan. Ini membuatnya cocok untuk digunakan dalam berbagai konteks dengan pembatasan minimal, yang sesuai dengan sistem operasi ABI wajib. Ini juga menyederhanakan analisis kode dan verifikasi untuk keandalan dan keamanan.
Semua memori vDSO diwakili oleh dua segmen berurutan, yang masing-masing berisi seluruh halaman yang selaras:
- Segmen pertama adalah hanya-baca dan termasuk header ELF serta data konstan.
- Segmen kedua dapat dieksekusi dan berisi kode vDSO.
Seluruh gambar vDSO hanya terdiri dari halaman dari dua segmen ini. Hanya dua nilai yang diekstrak dari header ELF diperlukan untuk menampilkan memori vDSO: jumlah halaman di setiap segmen.
Data konstan waktu boot OS
Beberapa panggilan sistem mengembalikan nilai yang konstan (nilai harus diminta saat runtime dan tidak dapat dikompilasi ke dalam kode mode pengguna). Nilai-nilai ini ditetapkan dalam kernel pada waktu kompilasi, atau ditentukan oleh kernel pada saat boot (parameter boot dan parameter perangkat keras). Misalnya: zx_system_get_version () , zx_system_get_num_cpus () dan zx_ticks_per_second () . Nilai kembali dari fungsi terakhir, misalnya, dipengaruhi oleh parameter baris perintah kernel .
Tunggu, apakah jumlah CPU konstan?Menariknya, deskripsi fungsi zx_system_get_num_cpus () juga secara eksplisit menyatakan bahwa OS tidak mendukung hot- swapping jumlah prosesor:
Jumlah ini tidak dapat berubah selama menjalankan sistem, hanya pada saat boot.
Ini, setidaknya, secara tidak langsung menunjukkan bahwa OS tidak diposisikan sebagai server.
Karena nilai-nilai ini konstan, tidak masuk akal untuk membayar panggilan sistem nyata ke kernel OS. Sebaliknya, implementasinya adalah fungsi C ++ sederhana yang mengembalikan data yang dibaca dari segmen konstan vDSO. Nilai yang diambil selama kompilasi (seperti string versi sistem) dikompilasi ke dalam vDSO.
Untuk nilai yang ditentukan saat boot, kernel harus memodifikasi konten vDSO. Ini dilakukan dengan menggunakan kode yang dapat dieksekusi lebih awal yang membentuk VMO vDSO sebelum kernel memulai proses pengguna pertama (dan memberikannya deskriptor VMO). Selama kompilasi, offset dari gambar vDSO ( vdso_constants ) diekstraksi dari file ELF dan kemudian disematkan ke dalam kernel. Dan pada saat boot, kernel sementara menampilkan halaman yang mencakup vdso_constants di ruang alamatnya sendiri untuk pra-inisialisasi struktur dengan nilai-nilai yang benar (untuk startup sistem saat ini).
Kenapa semua sakit kepala ini?
Salah satu alasan terpenting adalah keamanan. Artinya, jika penyerang berhasil mengeksekusi kode arbitrer (shell-), ia harus menggunakan fungsi vDSO untuk memanggil fungsi sistem. Rintangan pertama adalah pengacakan alamat boot vDSO tersebut untuk setiap proses yang dibuat. Dan karena kernel OS bertanggung jawab untuk VMO vDSO (objek memori virtual), ia dapat memilih untuk memetakan vDSO yang sama sekali berbeda untuk proses tertentu, sehingga melarang panggilan sistem yang berbahaya (dan tidak diperlukan untuk proses tertentu). Misalnya: Anda dapat mencegah driver memunculkan proses anak atau menangani memproyeksikan area MMIO. Ini adalah alat yang hebat untuk mengurangi permukaan serangan.
Catatan: Saat ini, dukungan untuk beberapa vDSO sedang dikembangkan secara aktif. Sudah ada implementasi konsep bukti dan tes sederhana, tetapi lebih banyak pekerjaan diperlukan untuk meningkatkan keandalan implementasi dan menentukan opsi mana yang tersedia. Konsep saat ini menyediakan opsi gambar vDSO yang hanya mengekspor subset dari antarmuka panggilan sistem vDSO lengkap.
Bagaimana dengan sistem operasi lain?Perlu dicatat bahwa teknik serupa telah berhasil digunakan dalam sistem operasi lain. Misalnya, pada Windows ada ProcessSystemCallDisablePolicy :
Win32k System Call Disable Restriction untuk membatasi kemampuan menggunakan NTUser dan GDI