Microdroid

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

Dengan sistem operasi tradisional, memberikan kerahasiaan dan integritas yang kuat memerlukan banyak pekerjaan (sering kali diduplikasi) karena sistem operasi tradisional tidak sesuai dengan arsitektur Android secara keseluruhan. Misalnya, dengan arsitektur Android standar, developer perlu menerapkan cara untuk memuat dan mengeksekusi sebagian aplikasi mereka secara aman di pVM, dan payload dibuat berdasarkan glibc. Aplikasi Android menggunakan Bionic, komunikasi memerlukan protokol kustom melalui vsock, dan proses debug menggunakan adb menjadi sulit.

Microdroid mengisi kesenjangan ini dengan menyediakan image OS siap pakai yang dirancang untuk memerlukan upaya paling sedikit dari developer untuk memindahkan sebagian aplikasi mereka ke pVM. Kode native dibangun berdasarkan Bionic, komunikasi terjadi melalui Binder, dan memungkinkan mengimpor APEX dari Android host serta mengekspos subset Android API, seperti keystore untuk operasi kriptografi dengan kunci yang didukung hardware. Secara keseluruhan, developer akan menganggap Microdroid sebagai lingkungan yang familiar dengan alat yang sudah biasa mereka gunakan di OS Android lengkap.

Fitur

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

  • Subkumpulan API NDK (semua API untuk penerapan libc dan Bionic di Android disediakan)
  • Fitur proses debug, seperti adb, logcat, tombstone, dan gdb
  • Booting Terverifikasi dan SELinux
  • Memuat dan mengeksekusi biner, bersama dengan library bersama, yang disematkan dalam APK
  • Binder RPC melalui vsock dan pertukaran file dengan pemeriksaan integritas implisit
  • Memuat APEX

Microdroid tidak mendukung:

  • Android Java API dalam paket android.\*

  • SystemServer dan Zygote

  • Grafis/UI

  • HAL

Arsitektur Microdroid

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

  • 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 booting terverifikasi.

Image partisi dikirimkan di Virtualisasi APEX dan dikemas dalam image disk komposit oleh VirtualizationService. Selain image disk komposit OS utama, VirtualizationService bertanggung jawab untuk membuat partisi lain ini:

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

Urutan booting

Urutan booting Microdroid terjadi setelah Booting perangkat. Booting perangkat dibahas di bagian Firmware pVM dalam dokumen Arsitektur. Gambar 1 menunjukkan langkah-langkah yang terjadi selama urutan booting Microdroid:

Alur booting aman instance microdroid

Gambar 1. Alur booting aman instance microdroid

Berikut penjelasan langkah-langkahnya:

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

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

    Bootloader kemudian mem-booting Microdroid.

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

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

  4. Karena partisi super telah diverifikasi oleh bootloader (langkah 3), kernel akan memasang partisi super tanpa syarat. Seperti Android lengkap, partisi super terdiri dari beberapa partisi logis yang di-mount melalui dm-verity. Kontrol kemudian diteruskan ke proses init, yang memulai berbagai layanan native. Skrip init.rc mirip dengan skrip Android lengkap, tetapi disesuaikan dengan kebutuhan Microdroid.

  5. Proses init memulai pengelola Microdroid, yang mengakses image instance. Layanan pengelola Microdroid mendekripsi image menggunakan kunci yang diteruskan dari tahap sebelumnya dan membaca kunci publik serta penghitung rollback APK dan APEX klien yang dipercaya oleh pVM ini. Informasi ini digunakan nanti oleh zipfuse dan apexd saat mereka mem-mount APK klien dan APEX yang diminta, masing-masing.

  6. Layanan pengelola Microdroid memulai 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 oleh developer aplikasi untuk instance pVM ini. Daftar ini digunakan oleh apexd saat mengaktifkan APEX.

  9. Alur booting kembali ke layanan pengelola Microdroid. Layanan pengelola kemudian berkomunikasi dengan VirtualizationService Android menggunakan Binder RPC sehingga dapat melaporkan peristiwa penting seperti error atau penonaktifan, dan menerima permintaan seperti menghentikan pVM. Layanan pengelola membaca lokasi biner utama dari file konfigurasi APK dan mengeksekusinya.

Pertukaran file (AuthFS)

Komponen Android biasanya menggunakan file untuk input, output, dan status, serta meneruskannya sebagai deskriptor file (jenis ParcelFileDescriptor di AIDL) dengan akses yang dikontrol oleh kernel Android. AuthFS memfasilitasi fungsi serupa untuk bertukar file antara endpoint yang saling tidak tepercaya di seluruh batas pVM.

Pada dasarnya, AuthFS adalah sistem file jarak jauh dengan pemeriksaan integritas transparan pada setiap operasi akses, mirip dengan fs-verity. Pemeriksaan ini memungkinkan frontend, seperti program pembaca file yang berjalan di pVM, 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 file tersebut ditujukan untuk input (hanya baca) atau output (baca-tulis). Untuk input, frontend memastikan bahwa konten cocok dengan hash yang diketahui, selain pohon Merkle untuk verifikasi saat akses. Untuk output, AuthFS secara internal mempertahankan pohon hash dari konten yang diamati dari operasi penulisan dan dapat menerapkan integritas saat data dibaca kembali.

Transportasi yang mendasarinya saat ini didasarkan pada Binder RPC, tetapi hal itu dapat berubah di masa mendatang untuk mengoptimalkan performa.

Pengelolaan kunci

pVM dilengkapi dengan kunci penyegelan yang stabil dan cocok untuk melindungi data persisten, serta kunci pengesahan yang cocok untuk menghasilkan tanda tangan yang dapat diverifikasi dan dihasilkan oleh pVM.

Binder RPC

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

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