Microdroid, pVM'de çalışan bir mini Android işletim sistemidir. Microdroid kullanmanıza gerek yok, herhangi bir işletim sistemiyle VM başlatabilirsiniz. Bununla birlikte, pVM'lerin birincil kullanım durumları, bağımsız bir işletim sistemi çalıştırmak değil, bir uygulamanın bir bölümünü Android'in sağlayabileceğinden daha güçlü gizlilik ve bütünlük garantileriyle çalıştırmak için yalıtılmış bir yürütme ortamı sunmaktır.
Geleneksel işletim sistemlerinde güçlü bir gizlilik ve bütünlük sağlamak oldukça fazla çalışma (çoğunlukla kopya) gerektirir çünkü geleneksel işletim sistemleri genel Android mimarisine uymaz. Örneğin, standart Android mimarisiyle geliştiricilerin, uygulamalarının bir bölümünü pVM'ye güvenli bir şekilde yüklemek ve yürütmek için bir araç uygulaması gerekir ve yük, glibc'ye göre oluşturulur. Android uygulaması Bionic kullanıyor, iletişim vsock üzerinden özel bir protokol gerektiriyor ve adb kullanarak hata ayıklamak zorlu.
Microdroid, geliştiricilerin uygulamalarının bir kısmını bir pVM'ye aktarmaları için en az çabayı gerektirecek şekilde tasarlanmış kullanıma hazır bir işletim sistemi görüntüsü sağlayarak bu boşlukları dolduruyor. Yerel kod Bionic'e karşı oluşturulmuştur, iletişim Binder üzerinden gerçekleşir ve APEX'lerin Android'den içe aktarılmasına izin verir ve donanım destekli anahtarlarla şifreleme işlemleri için anahtar deposu gibi Android API'nin bir alt kümesini ortaya çıkarır. Genel olarak geliştiriciler, Microdroid'i, tam Android işletim sisteminde alıştıkları araçlarla tanıdık bir ortam bulmalıdır.
Özellikler
Microdroid, pVM'lere özgü birkaç ek bileşen içeren, Android'in sadeleştirilmiş bir sürümüdür. Mikrodroid ş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ış Önyükleme ve SELinux etkin
- Bir APK'ya katıştırılmış, paylaşılan kitaplıklarla birlikte bir ikili dosyayı yükleme ve yürütme
- Vsock üzerinden Binder RPC ve örtülü bütünlük kontrolleriyle dosya alışverişi
- APEX'lerin yüklenmesi
Microdroid şunları desteklemiyor:
android.\*
paketlerindeki Android Java API'leriSistem Sunucusu ve Zygote
Grafik/Kullanıcı Arayüzü
HAL'ler
Mikrodroid mimarisi
Microdroid, Mürekkepbalığı'na benzer çünkü her ikisi de standart Android'e benzer bir mimariye sahiptir. Microdroid, bileşik bir disk görüntüsünde gruplandırılmış aşağıdaki bölüm görüntülerinden oluşur:
-
bootloader
- Çekirdeği doğrular ve başlatır. -
boot.img
- Çekirdeği ve başlangıç ramdiskini içerir. -
vendor_boot.img
- Virtio gibi VM'ye özgü çekirdek modüllerini içerir. -
super.img
- Sistem ve satıcı mantıksal bölümlerinden oluşur. -
vbmeta.img
- Doğrulanmış önyükleme meta verilerini içerir.
Bölüm görüntüleri Virtualization APEX'te gönderilir ve VirtualizationService
tarafından bileşik disk görüntüsünde paketlenir. Ana işletim sistemi bileşik disk görüntüsüne ek olarak VirtualizationService
şu diğer bölümlerin oluşturulmasından sorumludur:
-
payload
- Android'in APEX'leri ve APK'ları tarafından desteklenen bir dizi bölüm -
instance
- Örnek başına tuz, güvenilen APEX genel anahtarları ve geri alma sayaçları gibi örnek başına doğrulanmış önyükleme verilerinin kalıcı olması için şifrelenmiş bir bölüm
Önyükleme sırası
Microdroid önyükleme sırası, Cihaz önyüklemesinden sonra gerçekleşir. Cihaz önyüklemesi Mimari belgesinde tartışılmaktadır. Şekil 1, Microdroid önyükleme sırası sırasında gerçekleşen adımları göstermektedir:
İşte adımların bir açıklaması:
Önyükleyici crosvm tarafından belleğe yüklenir ve pvmfw yürütülmeye başlar. Önyükleyiciye atlamadan önce pvmfw iki görevi gerçekleştirir:
- Güvenilir bir kaynaktan (Google veya OEM) gelip gelmediğini kontrol etmek için önyükleyiciyi doğrular.
- Örnek görüntüsünün kullanılmasıyla aynı önyükleyicinin aynı pVM'nin birden fazla önyüklemesinde tutarlı bir şekilde kullanılmasını sağlar. Spesifik olarak, pVM başlangıçta boş bir örnek görüntü ile başlatılır. pvmfw, önyükleyicinin kimliğini örnek görüntüde saklar ve onu şifreler. Dolayısıyla, pVM'nin aynı örnek görüntüyle bir sonraki başlatılışında, pvmfw, örnek görüntüden kaydedilen kimliğin şifresini çözer ve bunun daha önce kaydedilenle aynı olduğunu doğrular. Kimlikler farklıysa pvmfw önyüklemeyi reddeder.
Önyükleyici daha sonra Microdroid'i başlatır.
Önyükleyici örnek diske erişir. Pvmfw'ye benzer şekilde, önyükleyicide, ortak anahtar da dahil olmak üzere önceki önyüklemeler sırasında bu örnekte kullanılan bölüm görüntüleri hakkında bilgi içeren bir örnek disk sürücüsü bulunur.
Önyükleyici vbmeta'yı ve
boot
vesuper
gibi zincirleme bölümleri doğrular ve başarılı olursa sonraki aşama pVM sırlarını türetir. Daha sonra Microdroid kontrolü çekirdeğe devreder.Süper bölüm, önyükleyici tarafından zaten doğrulanmış olduğundan (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 dm-verity üzerine monte edilmiş birden fazla mantıksal bölümden oluşur. Daha sonra kontrol, çeşitli yerel hizmetleri başlatan
init
sürecine aktarılır.init.rc
betiği tam Android'in betiğine 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 aktarılan anahtarı kullanarak görüntünün şifresini çözer ve bu pVM'nin güvendiği istemci APK'sının ve APEX'lerinin genel anahtarlarını ve geri alma sayaçlarını okur. Bu bilgiler daha sonrazipfuse
veapexd
tarafından sırasıyla istemci APK'sını ve istenen APEX'leri bağladıklarında kullanılır.Microdroid yönetici hizmeti
apexd
başlatır.apexd
APEX'leri/apex/<name>
dizinlerine bağlar. Android ve Microdroid'in APEX'leri nasıl monte ettiği arasındaki tek fark, Microdroid'de APEX dosyalarının normal dosyalardan (/system/apex/*.apex
) değil, sanal blok cihazlarından (/dev/vdc1
, …) gelmesidir.zipfuse
, Microdroid'in FUSE dosya sistemidir.zipfuse
, aslında bir Zip dosyası olan istemci APK'sını bir dosya sistemi olarak bağlar. Altında, APK dosyası, APEX'te olduğu gibi dm-verity ile pVM tarafından sanal bir blok cihazı olarak iletilir. APK, uygulama geliştiricisinin bu pVM örneği için talep ettiği APEX'lerin listesini içeren bir yapılandırma dosyası içerir. Liste, APEX'leri etkinleştirirkenapexd
tarafından kullanılır.Önyükleme akışı Microdroid yönetici hizmetine geri döner. Yönetici hizmeti daha sonra Binder RPC'yi kullanarak Android'in
VirtualizationService
ile iletişim kurarak çökme veya kapanma gibi önemli olayları bildirebilir ve pVM'nin sonlandırılması gibi istekleri kabul edebilir. Yönetici hizmeti, ana ikili dosyanın konumunu APK'nın yapılandırma dosyasından okur ve çalıştırır.
Dosya değişimi (AuthFS)
Android bileşenlerinin giriş, çıkış ve durum için dosyaları kullanması ve bunları, erişimi Android çekirdeği tarafından kontrol edilen dosya tanımlayıcıları (AIDL'de ParcelFileDescriptor
türü) olarak iletmesi yaygındır. AuthFS, pVM sınırları boyunca karşılıklı olarak güvenilmeyen uç noktalar arasında dosya alışverişi için benzer işlevleri kolaylaştırır.
Temel olarak AuthFS, fs-verity
benzer şekilde, bireysel erişim işlemlerinde şeffaf bütünlük kontrollerine sahip bir uzak dosya sistemidir. Kontroller, pVM'de çalışan bir dosya okuma programı gibi ön ucun, güvenilmeyen arka ucun, genellikle Android'in, dosya içeriğine müdahale edip etmediğini tespit etmesine olanak tanır.
Dosya alışverişi yapmak için arka uç ( fd\_server
), giriş (salt okunur) veya çıkış (okuma-yazma) için tasarlandığını belirten dosya başına yapılandırmayla başlatılır. Giriş için ön uç, erişim doğrulaması için Merkle ağacının üstünde içeriğin bilinen bir karma ile eşleşmesini zorunlu kılar. Çıktı için AuthFS, yazma işlemlerinden gözlemlenen içeriklerin karma ağacını dahili olarak tutar ve veriler geri okunduğunda bütünlüğü zorlayabilir.
Temel aktarım şu anda Binder RPC'yi temel almaktadır ancak performansı optimize etmek için gelecekte değişebilir.
Anahtar yönetimi
pVM'ler, korumalı kalıcı veriler için uygun olan sabit bir sızdırmazlık anahtarı ve pVM tarafından doğrulanabilir bir şekilde üretilen imzaları üretmeye uygun bir doğrulama anahtarı ile sağlanır.
Bağlayıcı RPC'si
Android'in arayüzlerinin çoğunluğu, Binder Linux çekirdek sürücüsünün üzerine inşa edilen AIDL'de ifade edilir. pVM'ler arasındaki arayüzleri desteklemek için Binder protokolü, pVM'ler durumunda vsock gibi soketler üzerinde çalışacak şekilde yeniden yazıldı. Soketler üzerinden çalışmak, Android'in mevcut AIDL arayüzlerinin bu yeni ortamda kullanılmasına olanak tanır.
Bağlantıyı kurmak için pVM verisi gibi bir uç nokta bir RpcServer
nesnesi oluşturur, bir kök nesneyi kaydeder ve yeni bağlantıları dinlemeye başlar. İstemciler bu sunucuya bir RpcSession
nesnesi kullanarak bağlanabilir, Binder
nesnesini alabilir ve onu tam olarak çekirdek Binder sürücüsünde bir Binder
nesnesinin kullanıldığı gibi kullanabilir.