Mikrodroid

Microdroid, pVM'de çalışan bir mini Android OS'tir. 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ğ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 izole bir yürütme ortamı sunmaktır.

Geleneksel işletim sistemleri, genel Android mimarisine uymadığı için güçlü gizlilik ve bütünlük sağlamak oldukça fazla çalışma (genellikle yinelenen) gerektirir. Örneğin, standart Android mimarisinde geliştiricilerin uygulamalarının bir kısmını pVM'de güvenli bir şekilde yükleyip yürütmelerini sağlayan bir yöntem uygulamaları gerekir. Yük, glibc'ye göre derlenir. Android uygulaması Bionic kullanıyor, iletişim için vsock üzerinden özel bir protokol gerekiyor ve adb kullanarak hata ayıklama zor.

Microdroid, geliştiricilerin uygulamalarının bir kısmını pVM'ye aktarmak için en az çabayı göstermesi amacıyla tasarlanmış hazır bir işletim sistemi resmi sağlayarak bu boşlukları doldurur. Yerel kod Bionic için oluşturulur, iletişim Binder üzerinden gerçekleşir, APEX'lerin ana Android'den içe aktarılmasına olanak tanır ve Android API'nin bir alt kümesini (ör. donanım destekli anahtarlarla kriptografik işlemler için anahtar mağazası) 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 özel birkaç ek bileşen içeren, Android'in temel özelliklerini içeren bir sürümüdür. Microdroid şunu destekler:

  • NDK API'lerinin bir alt kümesi (Android'in libc ve Bionic uygulamasını içeren tüm API'ler sağlanı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'leri

  • SystemServer ve Zygote

  • Grafikler/Kullanıcı Arayüzü

  • HAL'ler

Microdroid mimarisi

Microdroid, standart Android'e benzer bir mimariye sahip olması açısından Cuttlefish ile benzerdir. Microdroid, aşağıdaki bölüm resimlerinden oluşur ve bunlar birleştirilmiş bir disk resminde gruplandırılır:

  • bootloader: Çekirdeği doğrular ve başlatır.
  • boot.img: Çekirdeği ve init ramdisk'ini içerir.
  • vendor_boot.img: virtio gibi sanal makineye özgü ç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 karma disk görüntüsüne ek olarak aşağıdaki bölümleri oluşturmaktan da sorumludur:

  • payload: Android'in APEX'leri ve APK'ları tarafından desteklenen bir bölüm grubu
  • instance: Ö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 depolamak için şifrelenmiş bir bölüm

Açılış sırası

Microdroid önyükleme sırası, cihazın başlatılmasından 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:

microdroid örneğinin güvenli başlatma akışı

Şekil 1. microdroid örneğinin güvenli başlatma akışı

Adımların açıklaması aşağıda verilmiştir:

  1. Ö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. Daha açık belirtmek gerekirse, pVM başlangıçta boş bir örnek görüntüsüyle başlatılır. pvmfw, önyükleyicinin kimliğini örnek görüntüsünde depolar ve ş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.

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

  3. Önyükleme yükleyici, vbmeta ve boot ile super gibi zincirlenmiş bölümleri doğrular ve başarılı olursa sonraki aşamadaki pVM gizli bilgilerini türetebilir. Ardından Microdroid, kontrolü çekirdeğe verir.

  4. 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'ün ihtiyaçlarına göre uyarlanmıştır.

  5. 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 sonra zipfuse ve apexd tarafından sırasıyla istemci APK'sını bağlarken ve istenen APEX'leri yüklerken kullanılır.

  6. Microdroid yönetici hizmeti apexd tarihinde başlar.

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

  8. zipfuse, Microdroid'un 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ştirirken apexd tarafından kullanılır.

  9. 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 üretilen 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. pVM'ler arasındaki arayüzleri desteklemek için Binder protokolü, pVM'ler söz konusu olduğunda vsock üzerinden çalışmak üzere 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 nesne kaydeder ve yeni bağlantıları dinlemeye başlar. İstemciler, RpcSession nesnesi kullanarak bu sunucuya bağlanabilir, Binder nesnesini alabilir ve bu nesneyi, çekirdek Binder sürücüsü ile Binder nesnesi kullanıldığı gibi kullanabilir.