mikrodroid

Microdroid adalah OS mini-Android yang berjalan di pVM. Anda tidak harus menggunakan Microdroid, Anda dapat memulai VM dengan OS apa pun. Namun, kasus penggunaan utama pVM tidak menjalankan OS yang berdiri sendiri melainkan menawarkan lingkungan eksekusi terisolasi untuk menjalankan sebagian aplikasi dengan jaminan kerahasiaan dan integritas yang lebih kuat daripada yang dapat diberikan oleh Android.

Pada sistem operasi tradisional, memberikan kerahasiaan dan integritas yang kuat memerlukan banyak upaya (seringkali diduplikasi) karena sistem operasi tradisional tidak sesuai dengan arsitektur Android secara keseluruhan. Misalnya, dengan arsitektur Android standar, pengembang perlu mengimplementasikan cara memuat dan mengeksekusi sebagian aplikasi mereka secara aman di pVM, dan payload dibuat dengan menggunakan glibc. Aplikasi Android menggunakan Bionic, komunikasi memerlukan protokol khusus melalui vsock, dan proses debug menggunakan adb merupakan hal yang menantang.

Microdroid mengisi kesenjangan ini dengan menyediakan image OS siap pakai yang dirancang untuk memerlukan upaya paling sedikit dari pengembang untuk memindahkan sebagian aplikasi mereka ke pVM. Kode asli dibuat berdasarkan Bionic, komunikasi terjadi melalui Binder, dan memungkinkan impor APEX dari Android dan mengekspos subset API Android, seperti keystore untuk operasi kriptografi dengan kunci yang didukung perangkat keras. Secara keseluruhan, pengembang harus menganggap Microdroid sebagai lingkungan yang familier dengan alat yang biasa mereka gunakan di OS Android lengkap.

Fitur

Microdroid adalah versi Android yang disederhanakan dengan beberapa komponen tambahan khusus untuk pVM. Dukungan mikrodroid:

  • Subset API NDK (semua API untuk implementasi libc dan Bionic Android disediakan)
  • Fitur debug, seperti adb, logcat, batu nisan, dan gdb
  • Boot Terverifikasi dan SELinux diaktifkan
  • Memuat dan mengeksekusi biner, bersama dengan pustaka bersama, yang tertanam dalam APK
  • Binder RPC melalui vsock dan pertukaran file dengan pemeriksaan integritas implisit
  • Memuat APEX

Microdroid tidak mendukung:

  • Android Java API di paket android.\*

  • SystemServer dan Zigot

  • Grafik/UI

  • HAL

Arsitektur mikrodroid

Microdroid mirip dengan Cuttlefish karena keduanya memiliki arsitektur yang mirip dengan Android standar. Microdroid terdiri dari gambar partisi berikut yang dikelompokkan bersama dalam gambar disk komposit:

  • bootloader - Memverifikasi dan memulai kernel.
  • boot.img - Berisi kernel dan init ramdisk.
  • vendor_boot.img - Berisi modul kernel khusus VM, seperti virtio.
  • super.img - Terdiri dari partisi logis sistem dan vendor.
  • vbmeta.img - Berisi metadata boot terverifikasi.

Gambar partisi dikirimkan dalam Virtualization APEX dan dikemas dalam gambar disk komposit oleh VirtualizationService . Selain image disk komposit OS utama, VirtualizationService bertanggung jawab untuk membuat partisi lain berikut:

  • payload - Satu set partisi yang didukung oleh APEX dan APK Android
  • instance - Partisi terenkripsi untuk menyimpan data boot terverifikasi per instans, seperti salt per instans, kunci publik APEX tepercaya, dan penghitung rollback

Urutan boot

Urutan booting Microdroid terjadi setelah booting Perangkat . Boot perangkat dibahas dalam dokumen Arsitektur . Gambar 1 menunjukkan langkah-langkah yang dilakukan selama urutan booting Microdroid:

Mengamankan alur boot instance mikrodroid

Gambar 1. Bootflow aman dari instance microdroid

Berikut penjelasan langkah-langkahnya:

  1. Bootloader dimuat ke dalam memori oleh crosvm dan pvmfw mulai dijalankan. Sebelum beralih ke bootloader, pvmfw melakukan dua tugas:

    • Memverifikasi bootloader untuk memeriksa apakah itu berasal dari sumber tepercaya (Google atau OEM).
    • Memastikan bahwa bootloader yang sama digunakan secara konsisten di beberapa boot pVM yang sama melalui penggunaan image instance. Secara khusus, pVM awalnya di-boot dengan image instance kosong. pvmfw menyimpan identitas bootloader dalam gambar instance dan mengenkripsinya. Jadi, saat pVM di-boot lagi dengan image instance yang sama, pvmfw mendekripsi identitas yang disimpan dari image instance dan memverifikasi bahwa identitas tersebut sama dengan yang disimpan sebelumnya. Jika identitasnya berbeda, pvmfw menolak untuk melakukan booting.

    Bootloader kemudian mem-boot Microdroid.

  2. Bootloader mengakses disk instan. Mirip dengan pvmfw, bootloader memiliki drive disk instance dengan informasi tentang gambar partisi yang digunakan dalam instance ini selama boot sebelumnya, termasuk kunci publik.

  3. Bootloader memverifikasi vbmeta dan partisi yang dirantai, seperti boot dan super , dan, jika berhasil, mendapatkan rahasia pVM tahap berikutnya. Kemudian, Microdroid menyerahkan kendali ke kernel.

  4. Karena partisi super telah diverifikasi oleh bootloader (langkah 3), kernel memasang partisi super tanpa syarat. Seperti halnya Android lengkap, partisi super terdiri dari beberapa partisi logis yang dipasang melalui dm-verity. Kontrol kemudian diteruskan ke proses init , yang memulai berbagai layanan asli. Script init.rc mirip dengan full Android namun disesuaikan dengan kebutuhan Microdroid.

  5. Proses init memulai manajer Microdroid, yang mengakses image instance. Layanan manajer Microdroid mendekripsi gambar menggunakan kunci yang diteruskan dari tahap sebelumnya dan membaca kunci publik dan penghitung rollback APK klien dan APEX yang dipercaya oleh pVM ini. Informasi ini kemudian digunakan oleh zipfuse dan apexd saat mereka memasang APK klien dan APEX yang diminta.

  6. Layanan manajer Microdroid dimulai apexd .

  7. apexd memasang APEX di direktori /apex/<name> . Satu-satunya perbedaan antara cara Android dan Microdroid memasang APEX adalah bahwa di Microdroid, file APEX berasal dari perangkat blok virtual ( /dev/vdc1 , …), bukan dari file biasa ( /system/apex/*.apex ).

  8. zipfuse adalah sistem file FUSE Microdroid. zipfuse memasang APK klien, yang pada dasarnya adalah file Zip sebagai sistem file. Di bawahnya, file APK diteruskan sebagai perangkat blok virtual oleh pVM dengan dm-verity, sama seperti APEX. APK berisi file konfigurasi dengan daftar APEX yang diminta pengembang aplikasi untuk instance pVM ini. Daftar ini digunakan oleh apexd saat mengaktifkan APEX.

  9. Aliran boot kembali ke layanan manajer Microdroid. Layanan manajer kemudian berkomunikasi dengan VirtualizationService Android menggunakan Binder RPC sehingga dapat melaporkan peristiwa penting seperti kerusakan atau penutupan, dan menerima permintaan seperti menghentikan pVM. Layanan manajer membaca lokasi biner utama dari file konfigurasi APK dan menjalankannya.

Pertukaran file (AuthFS)

Komponen Android biasanya menggunakan file sebagai input, output, dan status serta menyebarkannya sebagai deskriptor file ( tipe ParcelFileDescriptor dalam AIDL) dengan akses yang dikontrol oleh kernel Android. AuthFS memfasilitasi fungsionalitas serupa untuk bertukar file antara titik akhir yang saling tidak percaya melintasi batas pVM.

Pada dasarnya, AuthFS adalah sistem file jarak jauh dengan pemeriksaan integritas transparan pada operasi akses individual, mirip dengan fs-verity . Pemeriksaan ini memungkinkan frontend, seperti program pembacaan file yang berjalan di pVM, untuk mendeteksi apakah backend yang tidak tepercaya, biasanya Android, merusak konten file.

Untuk bertukar file, backend ( fd\_server ) dimulai dengan konfigurasi per file yang menentukan apakah itu dimaksudkan untuk input (baca-saja) atau output (baca-tulis). Sebagai masukan, frontend menerapkan bahwa konten cocok dengan hash yang diketahui, di atas pohon Merkle untuk verifikasi saat akses. Untuk keluaran, AuthFS secara internal memelihara pohon hash dari konten seperti yang diamati dari operasi tulis dan dapat menegakkan integritas saat data dibaca kembali.

Transportasi yang mendasarinya saat ini didasarkan pada Binder RPC, namun hal itu mungkin berubah di masa mendatang untuk mengoptimalkan kinerja.

Manajemen kunci

pVM dilengkapi dengan kunci penyegelan stabil yang cocok untuk data persisten yang dilindungi, dan kunci pengesahan yang cocok untuk menghasilkan tanda tangan yang dihasilkan oleh pVM secara terverifikasi.

Pengikat RPC

Mayoritas antarmuka Android diekspresikan dalam AIDL , yang dibangun di atas driver kernel Binder Linux. Untuk mendukung antarmuka antar pVM, protokol Binder telah ditulis ulang agar berfungsi melalui soket, vsock dalam kasus pVM. Beroperasi melalui soket memungkinkan antarmuka AIDL Android yang ada digunakan di lingkungan baru ini.

Untuk menyiapkan koneksi, satu titik akhir, seperti payload pVM, membuat objek RpcServer , mendaftarkan objek root, dan mulai mendengarkan koneksi baru. Klien dapat terhubung ke server ini menggunakan objek RpcSession , mendapatkan objek Binder , dan menggunakannya persis seperti objek Binder yang digunakan dengan driver kernel Binder.