Microdroid, bir pVM'de çalışan mini bir Android işletim sistemidir. Microdroid kullanmak zorunda değilsiniz, herhangi bir işletim sistemi ile bir VM başlatabilirsiniz. Ancak, pVM'ler için birincil kullanım örnekleri, bağımsız bir işletim sistemi çalıştırmak değil, bir 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 garantileriyle yalıtılmış bir yürütme ortamı sunmaktır.
Geleneksel işletim sistemleriyle, güçlü gizlilik ve bütünlük sağlamak, oldukça fazla çalışma gerektirir (genellikle çoğaltılır), çünkü geleneksel işletim sistemleri kapsayıcı 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ükleme ve yürütme aracını uygulaması gerekir ve yük, glibc'ye göre oluşturulur. Android uygulaması Bionic kullanır, iletişim vsock üzerinden özel bir protokol gerektirir ve adb kullanarak hata ayıklamak zordur.
Microdroid, geliştiricilerin uygulamalarının bir bölümünü bir pVM'ye boşaltmak 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ı doldurur. Yerel kod Bionic'e karşı oluşturulmuştur, iletişim Binder üzerinden gerçekleşir ve Android'den APEX'lerin içe aktarılmasına izin verir ve donanım destekli anahtarlarla kriptografik işlemler için anahtar deposu gibi Android API'sinin bir alt kümesini ortaya çıkarır. Genel olarak, geliştiriciler, tam Android işletim sisteminde alıştıkları araçlarla Microdroid'i tanıdık bir ortam bulmalıdır.
Özellikler
Microdroid, pVM'lere özgü birkaç ek bileşenle 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ı için tüm API'ler sağlanır)
- adb, logcat, tombstone ve gdb gibi hata ayıklama özellikleri
- Doğrulanmış Önyükleme ve SELinux etkin
- Bir APK'ya gömülü paylaşılan kitaplıklarla birlikte bir ikili dosya yükleme ve yürütme
- Vsock üzerinden Binder RPC ve örtük bütünlük kontrolleriyle dosya alışverişi
- APEX'lerin yüklenmesi
Microdroid şunları desteklemez:
Android
android.\*
paketlerindeki Android Java API'leriSystemServer ve Zigot
Grafikler/Kullanıcı Arayüzü
HAL'ler
Mikrodroid mimarisi
Microdroid, Cuttlefish'e benzer, çünkü her ikisi de standart Android'e benzer bir mimariye sahiptir. Microdroid, bileşik 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 init 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 bir 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ümleri oluşturmaktan sorumludur:
-
payload
- Android'in APEX'leri ve APK'ları tarafından desteklenen bir dizi bölüm -
instance
- Örnek başına tuz, güvenilir APEX ortak anahtarları ve geri alma sayaçları gibi örnek başına doğrulanmış önyükleme verilerinin kalıcı olması için şifreli bir bölüm
Önyükleme sırası
Microdroid önyükleme sırası, Aygıt önyüklemesinden sonra gerçekleşir. Aygıt önyüklemesi, Mimari belgesinde tartışılmıştı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ı:
Bootloader crossvm ile belleğe yüklenir ve pvmfw çalışmaya başlar. Önyükleyiciye geçmeden önce pvmfw iki görevi yerine getirir:
- 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ımı yoluyla aynı pVM'nin birden çok önyüklemesinde aynı önyükleyicinin tutarlı bir şekilde kullanılmasını sağlar. Spesifik olarak, pVM başlangıçta boş bir örnek görüntüsü ile önyüklenir. pvmfw, önyükleyicinin kimliğini örnek görüntüsünde saklar ve onu şifreler. Bu nedenle, pVM'nin aynı örnek görüntüsüyle bir sonraki açılışında, pvmfw örnek görüntüsünden kaydedilen kimliğin şifresini çözer ve 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ükleyici, 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üne sahiptir.
Ö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. Ardından, Microdroid kontrolü çekirdeğe verir.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 çok mantıksal bölümden oluşur. Denetim daha sonra çeşitli yerel hizmetleri başlatan
init
işlemine iletilir.init.rc
betiği, tam Android'inkine benzer ancak Microdroid'in ihtiyaçlarına göre uyarlanmıştır.Başlatma işlemi, örnek görüntüsüne erişen
init
yöneticisini başlatır. Microdroid yönetici hizmeti, önceki aşamadan geçirilen anahtarı kullanarak görüntünün şifresini çözer ve bu pVM'nin güvendiği istemci APK'sının ve APEX'lerin genel anahtarlarını ve geri alma sayaçlarını okur. Bu bilgiler daha sonra sırasıyla istemci APK'sını ve istenen APEX'leri yüklediklerindezipfuse
veapexd
tarafından kullanılır.Microdroid yönetici hizmeti
apexd
başlatır.apexd
, APEX'leri/apex/<name>
dizinlerine bağlar. Android ve Microdroid mounta APEX'ler 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
, aslında bir dosya sistemi olarak bir Zip dosyası olan istemci APK'sını bağlar. Altında, APK dosyası, APEX ile aynı dm-verity ile pVM tarafından sanal bir blok cihazı olarak geçirilir. APK, uygulama geliştiricisinin bu pVM örneği için istediği APEX'lerin listesini içeren bir yapılandırma dosyası içerir. Liste,apexd
etkinleştirirken apexd tarafından kullanılır.Önyükleme akışı, Microdroid yönetici hizmetine geri döner. Yönetici hizmeti daha sonra Binder RPC kullanarak Android'in
VirtualizationService
Hizmeti ile iletişim kurar, böylece kilitlenme veya kapanma gibi önemli olayları rapor edebilir ve pVM'yi sonlandırmak gibi istekleri kabul edebilir. Yönetici hizmeti, ana ikili programın konumunu APK'nın yapılandırma dosyasından okur ve yürütür.
Dosya değişimi (AuthFS)
Android bileşenlerinin girdi, çıktı ve durum için dosyaları kullanması ve bunları, erişimi Android çekirdeği tarafından kontrol edilen dosya tanımlayıcıları ( 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, bir pVM'de çalışan bir dosya okuma programı gibi ön ucun, güvenilmeyen arka ucun, tipik olarak Android'in dosya içeriğiyle değiştirilip değiştirilmediğini algılamasını sağlar.
Dosyaları değiş tokuş etmek için, arka uç ( fd\_server
), girdi (salt okunur) veya çıktı (okuma-yazma) için olup olmadığını belirten dosya başına yapılandırma ile başlatılır. Giriş için, ön uç, erişim doğrulaması için bir Merkle ağacının üstünde, içeriğin bilinen bir karma ile eşleşmesini zorlar. Çıktı için, AuthFS, yazma işlemlerinde gözlemlendiği gibi içeriğin bir karma ağacını dahili olarak tutar ve veriler tekrar okunduğunda bütünlüğü zorunlu kılar.
Temel taşıma şu anda Binder RPC'ye dayanmaktadır, ancak bu gelecekte performansı optimize etmek için değişebilir.
Anahtar yönetimi
pVM'lere, korunan kalıcı veriler için uygun kararlı bir mühürleme anahtarı ve pVM tarafından doğrulanabilir şekilde üretilen imzalar üretmeye uygun bir onay anahtarı sağlanır.
bağlayıcı RPC
Android'in arayüzlerinin çoğu, Binder Linux çekirdek sürücüsünün üzerine inşa edilen AIDL'de ifade edilir. pVM'ler arasındaki arabirimleri desteklemek için, Binder protokolü, pVM'ler durumunda vsock, soketler üzerinde çalışacak şekilde yeniden yazılmıştır. Soketler üzerinden çalışmak, Android'in mevcut AIDL arayüzlerinin bu yeni ortamda kullanılmasına izin verir.
Bağlantıyı kurmak için, pVM yükü gibi bir uç nokta bir RpcServer
nesnesi oluşturur, bir kök nesne kaydeder ve yeni bağlantıları dinlemeye başlar. İstemciler bu sunucuya bir RpcSession
nesnesi kullanarak bağlanabilir, Binder
nesnesini alabilir ve onu tıpkı bir Binder
nesnesinin çekirdek Binder sürücüsü ile kullanıldığı gibi kullanabilir.