mikrodroid

Koleksiyonlar ile düzeninizi koruyun İçeriği tercihlerinize göre kaydedin ve kategorilere ayırın.

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'leri

  • SystemServer 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:

Mikrodroid örneğinin güvenli önyükleme akışı

Şekil 1. Mikrodroid örneğinin güvenli önyükleme akışı

İşte adımların bir açıklaması:

  1. 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.

  2. Ö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.

  3. Önyükleyici vbmeta'yı ve boot ve super 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.

  4. 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.

  5. 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üklediklerinde zipfuse ve apexd tarafından kullanılır.

  6. Microdroid yönetici hizmeti apexd başlatır.

  7. 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.

  8. 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.

  9. Ö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.