Sürüm Bağlama

Keymaster 1'de, tüm anahtar yöneticisi anahtarları kriptografik olarak cihazın Güven Kökü'ne veya Doğrulanmış Önyükleme anahtarına bağlandı. Keymaster 2 ve 3'te tüm anahtarlar aynı zamanda işletim sistemine ve sistem görüntüsünün yama düzeyine de bağlıdır. Bu, sistemin veya TEE yazılımının eski bir sürümünde bir zayıflık keşfeden bir saldırganın, cihazı güvenlik açığı bulunan sürüme geri döndürememesi ve yeni sürümle oluşturulan anahtarları kullanamaması anlamına gelir. Ayrıca, belirli bir sürüme ve yama düzeyine sahip bir anahtar, daha yeni bir sürüme veya yama düzeyine yükseltilmiş bir cihazda kullanıldığında, anahtar kullanılmadan önce yükseltilir ve anahtarın önceki sürümü geçersiz kılınır. Bu şekilde, cihaz yükseltildikçe tuşlar da cihazla birlikte ileri doğru "döner" ancak cihazın önceki bir sürüme geri döndürülmesi, tuşların kullanılamaz olmasına neden olur.

Treble'ın modüler yapısını desteklemek ve system.img'nin boot.img'ye bağlanmasını kırmak için Keymaster 4, anahtar sürümü bağlama modelini her bölüm için ayrı yama düzeylerine sahip olacak şekilde değiştirdi. Bu, her bir bölümün bağımsız olarak güncellenmesine olanak tanırken, bir yandan da geri alma koruması sağlar.

Android 9'da boot , system ve vendor bölümlerinin her birinin kendi yama düzeyi vardır.

  • Android Doğrulanmış Önyükleme (AVB) özelliğine sahip cihazlar, tüm yama düzeylerini ve sistem sürümünü vbmeta'ya koyabilir, böylece önyükleyici bunları Keymaster'a sağlayabilir. Zincirlenmiş bölümler için, bölümün sürüm bilgisi zincirlenmiş vbmeta'da olacaktır. Genel olarak sürüm bilgisi, belirli bir bölüm için doğrulama verilerini (hash veya hashtree) içeren vbmeta struct olmalıdır.
  • AVB'siz cihazlarda:
    • Doğrulanmış Önyükleme uygulamalarının, önyükleyiciye sürüm meta verilerinin bir karma değerini sağlaması gerekir; böylece önyükleyici, karma değeri Keymaster'a sağlayabilir.
    • boot.img yama düzeyini başlıkta saklamaya devam edebilir
    • system.img yama düzeyini ve işletim sistemi sürümünü salt okunur özelliklerde saklamaya devam edebilir
    • vendor.img yama düzeyini ro.vendor.build.version.security_patch salt okunur özelliğinde saklar.
    • Önyükleyici, anahtar yöneticisine doğrulanmış önyüklemeyle doğrulanan tüm verilerin bir karmasını sağlayabilir.
  • Android 9'da aşağıdaki bölümlere ilişkin sürüm bilgilerini sağlamak için aşağıdaki etiketleri kullanın:
    • VENDOR_PATCH_LEVEL : vendor bölümü
    • BOOT_PATCH_LEVEL : boot bölümü
    • OS_PATCH_LEVEL ve OS_VERSION : system bölümü. ( OS_VERSION boot.img başlığından kaldırıldı.
  • Keymaster uygulamaları tüm yama düzeylerini bağımsız olarak ele almalıdır. Tüm sürüm bilgilerinin bir anahtarla ilişkili değerlerle eşleşmesi durumunda anahtarlar kullanılabilir ve gerekirse IKeymaster::upgradeDevice() daha yüksek bir yama düzeyine geçer.

HAL Değişiklikleri

Sürüm bağlamayı ve sürüm doğrulamayı desteklemek için Android 7.1, Tag::OS_VERSION ve Tag::OS_PATCHLEVEL etiketlerini ve configure ve upgradeKey yöntemlerini ekledi. Sürüm etiketleri, Keymaster 2+ uygulamaları tarafından yeni oluşturulan (veya güncellenen) tüm anahtarlara otomatik olarak eklenir. Ayrıca, sırasıyla geçerli sistem işletim sistemi sürümü veya yama düzeyiyle eşleşen bir işletim sistemi sürümüne veya yama düzeyine sahip olmayan bir anahtarı kullanma girişimleri ErrorCode::KEY_REQUIRES_UPGRADE ile reddedilir.

Tag::OS_VERSION , bir Android sistem sürümünün ana, alt ve alt alt bölümlerini MMmmss olarak temsil eden bir UINT değeridir; burada MM ana sürüm, mm alt sürüm ve ss alt alt sürümdür. Örneğin 6.1.2, 060102 olarak temsil edilecektir.

Tag::OS_PATCHLEVEL sisteme yapılan son güncellemenin yılını ve ayını YYYYMM olarak temsil eden bir UINT değeridir; burada YYYY dört basamaklı yılı ve MM iki basamaklı ayı temsil eder. Örneğin Mart 2016, 201603 olarak temsil edilecektir.

Yükseltme Anahtarı

Anahtarların yeni işletim sistemi sürümüne ve sistem görüntüsünün yama düzeyine yükseltilmesine izin vermek için Android 7.1, HAL'a upgradeKey yöntemini ekledi:

Anahtar Yöneticisi 3

    upgradeKey(vec keyBlobToUpgrade, vec upgradeParams)
        generates(ErrorCode error, vec upgradedKeyBlob);

Anahtar Yöneticisi 2

keymaster_error_t (*upgrade_key)(const struct keymaster2_device* dev,
    const keymaster_key_blob_t* key_to_upgrade,
    const keymaster_key_param_set_t* upgrade_params,
    keymaster_key_blob_t* upgraded_key);
  • dev cihazın yapısıdır
  • keyBlobToUpgrade yükseltilmesi gereken anahtardır
  • upgradeParams anahtarı yükseltmek için gereken parametrelerdir. Bunlar, oluşturma sırasında sağlanmışsa, anahtar blobunun şifresini çözmek için gerekli olan Tag::APPLICATION_ID ve Tag::APPLICATION_DATA içerecektir.
  • upgradedKeyBlob , yeni anahtar bloğunu döndürmek için kullanılan çıkış parametresidir.

upgradeKey ayrıştırılamayan veya başka bir şekilde geçersiz olan bir anahtar bloğuyla çağrılırsa ErrorCode::INVALID_KEY_BLOB değerini döndürür. Yama düzeyi mevcut sistem değerinden büyük olan bir anahtarla çağrılırsa ErrorCode::INVALID_ARGUMENT değerini döndürür. İşletim sistemi sürümü geçerli sistem değerinden büyük olan bir anahtarla çağrılırsa ve sistem değeri sıfır değilse ErrorCode::INVALID_ARGUMENT değerini döndürür. İşletim sistemi sürümünün sıfırdan sıfıra yükseltilmesine izin verilir. Güvenli dünyayla iletişimde hata olması durumunda uygun bir hata değeri döndürür (örn. ErrorCode::SECURE_HW_ACCESS_DENIED , ErrorCode::SECURE_HW_BUSY ). Aksi takdirde, ErrorCode::OK değerini döndürür ve upgradedKeyBlob içinde yeni bir anahtar blobu döndürür.

keyBlobToUpgrade , upgradeKey çağrısından sonra geçerli kalır ve cihazın sürümü düşürülürse teorik olarak tekrar kullanılabilir. Uygulamada, anahtar deposu genellikle keyBlobToUpgrade blobunda deleteKey çağrısından kısa bir süre sonra upgradeKey öğesini çağırır. keyBlobToUpgrade Tag::ROLLBACK_RESISTANT etiketi varsa, upgradedKeyBlob da bu etikete sahip olması gerekir (ve geri dönmeye dayanıklı olması gerekir).

Güvenli yapılandırma

Sürüm bağlamayı uygulamak için, anahtar yöneticisi TA'nın mevcut işletim sistemi sürümünü ve yama düzeyini (sürüm bilgisi) güvenli bir şekilde almanın ve aldığı bilgilerin çalışan sistem hakkındaki bilgilerle güçlü bir şekilde eşleştiğinden emin olmanın bir yoluna ihtiyacı vardır.

Sürüm bilgilerinin TA'ya güvenli bir şekilde iletilmesini desteklemek için, önyükleme görüntüsü başlığına bir OS_VERSION alanı eklenmiştir. Önyükleme görüntüsü oluşturma komut dosyası bu alanı otomatik olarak doldurur. OEM'lerin ve anahtar yönetici TA uygulayıcılarının, sürüm bilgilerini önyükleme görüntüsünden çıkarmak ve güvenli olmayan sistem başlatılmadan önce bunu TA'ya iletmek üzere aygıt önyükleyicilerini değiştirmek için birlikte çalışmaları gerekir. Bu, saldırganların sürüm bilgilerinin TA'ya sağlanmasına müdahale edememesini sağlar.

Ayrıca sistem görüntüsünün, önyükleme görüntüsüyle aynı sürüm bilgisine sahip olduğundan emin olmak da gereklidir. Bu amaçla, keymaster HAL'a yapılandırma yöntemi eklenmiştir:

keymaster_error_t (*configure)(const struct keymaster2_device* dev,
  const keymaster_key_param_set_t* params);

params bağımsız değişkeni Tag::OS_VERSION ve Tag::OS_PATCHLEVEL içerir. Bu yöntem, keymaster2 istemcileri tarafından HAL açıldıktan sonra ancak diğer yöntemleri çağırmadan önce çağrılır. Eğer yapılandırmadan önce başka bir yöntem çağrılırsa TA, ErrorCode::KEYMASTER_NOT_CONFIGURED değerini döndürür.

Aygıt önyüklendikten sonra ilk kez configure çağrıldığında, sağlanan sürüm bilgilerinin önyükleyici tarafından sağlananlarla eşleştiğini doğrulaması gerekir. Sürüm bilgisi eşleşmiyorsa, configure ErrorCode::INVALID_ARGUMENT değerini döndürür ve diğer tüm anahtar yöneticisi yöntemleri ErrorCode::KEYMASTER_NOT_CONFIGURED döndürmeye devam eder. Bilgiler eşleşirse, configure ErrorCode::OK değerini döndürür ve diğer anahtar yöneticisi yöntemleri normal şekilde çalışmaya başlar.

Sonraki configure çağrıları, ilk çağrının döndürdüğü aynı değeri döndürür ve anahtar yöneticisinin durumunu değiştirmez. Bu işlemin tüm OTA'ların hem sistem hem de önyükleme yansımalarını güncellemesini gerektirdiğini unutmayın; sürüm bilgilerini senkronize tutmak için ayrı ayrı güncellenemezler.

configure içeriğini doğrulaması amaçlanan sistem tarafından çağrılacağından, bir saldırganın sistem görüntüsünü tehlikeye atması ve onu önyükleme görüntüsüyle eşleşen ancak gerçek görüntü olmayan sürüm bilgilerini sağlamaya zorlaması için dar bir fırsat penceresi vardır. sistemin versiyonu. Önyükleme görüntüsü doğrulaması, sistem görüntüsü içeriklerinin dm-verity doğrulaması ve configure sistem önyüklemesinde çok erken çağrılması gerçeğinin birleşimi, bu fırsat penceresinden yararlanmayı zorlaştırmalıdır.