Microdroid, pVM'de çalışan bir mini Android OS'dir. Microdroid'i kullanmanız gerekmez. İstediğiniz işletim sistemine sahip bir sanal makine başlatabilirsiniz. Ancak pVM'lerin birincil kullanım alanları bağımsız bir işletim sistemi çalıştırmak değildir. Bunun yerine, uygulamanın bir bölümünü çalıştırmak için Android'in sağlayabileceğinden daha güçlü gizlilik ve bütünlük garantileri sunan izole bir yürütme ortamı sunarlar.
Geleneksel işletim sistemleri, güçlü gizlilik ve bütünlük sağlamak için oldukça fazla çalışma (genellikle kopya) gerektirir. Çünkü geleneksel işletim sistemleri kapsayıcı Android mimarisine uymaz. Örneğin, standart Android mimarisinde geliştiricilerin uygulamalarının bir kısmını pVM'de güvenli bir şekilde yükleyip çalıştırmanın bir yolunu uygulaması gerekir. Yük, glibc'ye göre derlenir. Android uygulaması Bionic'i kullanır. İletişim, vsock üzerinden özel bir protokol gerektirir. Adb kullanarak hata ayıklamak da zordur.
Microdroid, geliştiricilerin uygulamalarının bir kısmını pVM'ye aktarmak için en az çabayı göstermesi için tasarlanmış hazır bir işletim sistemi resmi sağlayarak bu boşlukları doldurur. Yerel kod Bionic için derlenir, iletişim Binder üzerinden gerçekleşir, ana Android'den APEX'lerin içe aktarılmasına olanak tanır ve donanım destekli anahtarlarla kriptografik işlemler için anahtar kutusu gibi Android API'sinin bir alt kümesini gösterir. Genel olarak geliştiriciler, tam Android OS'te alıştıkları araçlara sahip olan Microdroid'i tanıdık bir ortam olarak bulacaktır.
Özellikler
Microdroid, pVM'lere özgü birkaç ek bileşen içeren, Android'in temel özelliklerini barındıran bir sürümüdür. Microdroid şunları destekler:
- NDK API'lerinin bir alt kümesi (Android'in libc ve Bionic uygulamasına yönelik tüm API'ler sağlanmıştır)
- Adb, logcat, tombstone ve gdb gibi hata ayıklama özellikleri
- Doğrulanmış Başlatma ve SELinux
- Bir APK'ya yerleştirilmiş paylaşılan kitaplıklarla birlikte bir ikili dosyayı yükleme ve yürütme
- vsock üzerinden Binder RPC ve dosya alışverişi için gizli bütünlük kontrolleri
- APEX'lerin yüklenmesi
Microdroid şunları desteklemez:
android.\*
paketlerindeki Android Java API'leriSystemServer ve Zygote
Grafikler/Kullanıcı Arayüzü
HAL'ler
Microdroid mimarisi
Microdroid, her ikisi de standart Android'e benzer bir mimariye sahip olan Cuttlefish'e benzer. Microdroid, birleştirilmiş bir disk resminde gruplandırılmış aşağıdaki bölüm resimlerinden oluşur:
bootloader
: Çekirdeği doğrular ve başlatır.boot.img
: Çekirdeği ve init ramdisk'ini içerir.vendor_boot.img
: Sanal makineye özel virtio gibi çekirdek modülleri içerir.super.img
: Sistem ve tedarikçi mantıksal bölümlerinden oluşur.vbmeta.img
: Doğrulanmış başlatma meta verilerini içerir.
Bölme görüntüleri, VirtualizationService
tarafından Virtualization APEX'te gönderilir ve karma bir disk görüntüsünde paketlenir. VirtualizationService
, ana işletim sistemi bileşik disk görüntüsüne ek olarak aşağıdaki diğer bölümleri de oluşturmaktan sorumludur:
payload
- Android'in APEX'leri ve APK'ları tarafından desteklenen bir dizi bölüminstance
: Örnek başına doğrulanmış önyükleme verilerini (ör. örnek başına tuz, güvenilir APEX ortak anahtarları ve geri alma sayaçları) kalıcı olarak saklamak için şifrelenmiş bir bölüm
Açılış sırası
Microdroid başlatma sırası, Cihaz başlatıldıktan sonra gerçekleşir. Cihazın başlatılması, Mimari belgesinin pVM Donanım Yazılımı bölümünde ele alınmıştır. Şekil 1'de, Microdroid önyükleme sırası sırasında gerçekleşen adımlar gösterilmektedir:
Adımları aşağıda bulabilirsiniz:
Önyükleyici, crosvm tarafından belleğe yüklenir ve pvmfw çalışmaya başlar. pvmfw, önyükleyiciye geçmeden önce iki görev gerçekleştirir:
- Güvenilir bir kaynaktan (Google veya bir OEM) gelip gelmediğini kontrol etmek için önyükleyiciyi doğrular.
- Örnek resminin kullanılmasıyla aynı pVM'nin birden fazla önyüklemesinde tutarlı bir şekilde aynı önyükleme yükleyicinin kullanılmasını sağlar. Spesifik olarak, pVM başlangıçta boş bir örnek görüntüsüyle başlatılır. pvmfw, örnek görüntüsünde bootloader'ın kimliğini depolar ve bunu şifreler. Bu nedenle, pVM bir sonraki sefer aynı örnek görüntüsüyle başlatıldığında pvmfw, örnek görüntüdeki kayıtlı kimliğin şifresini çözer ve daha önce kaydedilenle aynı olup olmadığını doğrular. Kimlikler farklıysa pvmfw önyüklemeyi reddeder.
Ardından önyükleyici Microdroid'i başlatır.
Önyükleme programı, örnek diskine erişir. pvmfw'ye benzer şekilde, önyükleyicide, önceki önyüklemeler sırasında bu örnekte kullanılan bölüm resimleri (ortak anahtar dahil) hakkında bilgi içeren bir örnek disk sürücüsü bulunur.
Önyükleme yükleyici, vbmeta ve
boot
ilesuper
gibi zincirlenmiş bölümleri doğrular ve başarılı olursa sonraki aşamadaki pVM gizli bilgilerini türeterek Ardından Microdroid, kontrolü çekirdeğe verir.Süper bölüm, önyükleme yükleyici tarafından zaten doğrulandığından (3. adım) çekirdek, süper bölümü koşulsuz olarak bağlar. Tam Android'de olduğu gibi, süper bölüm de dm-verity üzerine monte edilmiş birden fazla mantıksal bölümden oluşur. Ardından kontrol, çeşitli yerel hizmetleri başlatan
init
işlemine aktarılır.init.rc
komut dosyası, tam Android'e benzer ancak Microdroid'in ihtiyaçlarına göre uyarlanmıştır.init
işlemi, örnek görüntüsüne erişen Microdroid yöneticisini başlatır. Microdroid yönetici hizmeti, önceki aşamadan iletilen anahtarı kullanarak görüntünün şifresini çözer ve istemci APK'sının ve bu pVM'nin güvendiği APEX'lerin ortak anahtarlarını ve geri alma sayacını okur. Bu bilgiler daha sonrazipfuse
veapexd
tarafından sırasıyla istemci APK'sını bağlarken ve istenen APEX'leri yüklerken kullanılır.Microdroid yönetici hizmeti
apexd
tarihinde başlar.apexd
, APEX'leri/apex/<name>
dizinlerine bağlar. Android ve Microdroid'ün APEX'leri bağlama şekli arasındaki tek fark, Microdroid'de APEX dosyalarının normal dosyalardan (/system/apex/*.apex
) değil, sanal blok cihazlardan (/dev/vdc1
, …) gelmesidir.zipfuse
, Microdroid'in FUSE dosya sistemidir.zipfuse
, istemci APK'sını (temel olarak bir dosya sistemi olarak Zip dosyası) bağlar. Aşağıda, APK dosyası APEX'te olduğu gibi pVM tarafından dm-verity ile sanal bir blok cihaz olarak iletilir. APK, uygulama geliştiricinin bu pVM örneği için istediği APEX'lerin listesini içeren bir yapılandırma dosyası içerir. Liste, APEX'leri etkinleştirirkenapexd
tarafından kullanılır.Açılış akışı, Microdroid yönetici hizmetine geri döner. Yönetici hizmeti daha sonra kilitlenme veya kapatma gibi önemli etkinlikleri bildirmek ve pVM'yi sonlandırma gibi istekleri kabul etmek için Binder RPC'yi kullanarak Android'in
VirtualizationService
ile iletişim kurar. Yönetici hizmeti, APK'nın yapılandırma dosyasından ana ikili dosyanın konumunu okur ve yürütür.
Dosya değişimi (AuthFS)
Android bileşenlerinin giriş, çıkış ve durum için dosya kullanması ve bunları Android çekirdeği tarafından kontrol edilen erişim ile dosya tanımlayıcıları (ParcelFileDescriptor
AIDL'de tür) olarak aktarması yaygındır. AuthFS, pVM sınırları boyunca birbirine güvenmeyen uç noktalar arasında dosya alışverişi için benzer işlevleri kolaylaştırır.
Temel olarak AuthFS, fs-verity
'e benzer şekilde ayrı erişim işlemlerinde şeffaf bütünlük kontrolleri olan uzak bir dosya sistemidir. Bu kontroller, pVM'de çalışan bir dosya okuma programı gibi ön uçların, güvenilmeyen arka uçların (genellikle Android) dosya içeriğiyle oynayıp oynamadığını algılamasına olanak tanır.
Dosya alışverişi yapmak için arka uç (fd\_server
), giriş (salt okunur) veya çıkış (okuma/yazma) için tasarlanıp tasarlanmadığını belirten dosya başına yapılandırmayla başlatılır. Giriş için ön uç, erişim sırasında doğrulama yapmak üzere Merkle ağacının yanı sıra içeriğin bilinen bir karma değeriyle eşleşmesini zorunlu kılar. AuthFS, çıkış için yazma işlemlerinden gözlemlenen içeriğin karma ağacını dahili olarak korur ve veriler geri okunduğunda bütünlüğü zorunlu kılabilir.
Temel aktarım şu anda Binder RPC'ye dayanır ancak performansı optimize etmek için gelecekte bu durum değişebilir.
Anahtar yönetimi
pVM'lere, kalıcı verilerin korunmasına uygun olan kararlı bir mühürleme anahtarı ve pVM tarafından doğrulanabilir şekilde oluşturulan imzalar oluşturmaya uygun bir onay anahtarı sağlanır.
Binder RPC
Android arayüzlerinin çoğu, Binder Linux çekirdek sürücüsünün üzerine inşa edilen AIDL'de ifade edilir. Bağlayıcı protokolü, pVM'ler arasındaki arayüzleri desteklemek amacıyla, pVM'lerde yuvalar (vsock) üzerinde çalışacak şekilde yeniden yazılmıştır. Soket üzerinden çalışma, Android'in mevcut AIDL arayüzlerinin bu yeni ortamda kullanılmasına olanak tanır.
Bağlantıyı kurmak için pVM yükü gibi bir uç nokta, bir RpcServer
nesnesi oluşturur, bir kök nesnesi kaydeder ve yeni bağlantıları dinlemeye başlar. İstemciler bu sunucuya RpcSession
nesnesi kullanarak bağlanabilir, Binder
nesnesini alabilir ve bunu, bir Binder
nesnesinin çekirdek Bağlayıcı sürücüsüyle aynı şekilde kullanabilir.