Sürüm bağlama

Keymaster 1'de tüm Keymaster anahtarları, cihaz Root of Trust'a veya Doğrulanmış Önyükleme Anahtarı'na kriptografik olarak bağlıydı. Keymaster 2 ve 3'te tüm anahtarlar, sistem görüntüsünün işletim sistemine ve yama düzeyine de bağlıdır. Bu sayede, sistem veya TEE yazılımının eski bir sürümünde zayıflık keşfeden bir saldırgan, cihazı zayıf sürüme geri döndürüp yeni sürümle oluşturulan anahtarları kullanamaz. Ayrıca, belirli bir sürüm 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ılabilmesi için yükseltilir ve anahtarın önceki sürümü geçersiz kılınır. Bu sayede, cihaz yükseltilirken anahtarlar da cihazla birlikte *ileri doğru ilerler*. Ancak cihazın önceki bir sürüme geri döndürülmesi, anahtarların kullanılamamasına neden olur.

Treble'ın modüler yapısını desteklemek ve system.img ile boot.img arasındaki bağlamayı kaldırmak için Keymaster 4, anahtar sürümü bağlama modelini her bölüm için ayrı düzeltme düzeylerine sahip olacak şekilde değiştirdi. Bu sayede, geri alma koruması sunmaya devam ederken her bölümün bağımsız olarak güncellenmesi sağlanır.

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

  • Android Doğrulanmış Başlatma (AVB) özelliğine sahip cihazlar, tüm yama düzeylerini ve sistem sürümünü vbmeta'ya yerleştirebilir. Böylece önyükleyici bunları Keymaster'a sağlayabilir. Zincirlenmiş bölümlerde, bölümün sürüm bilgileri zincirlenmiş vbmeta içindedir. Genel olarak sürüm bilgileri, belirli bir bölüme ait doğrulama verilerini (karma oluşturma veya karma oluşturma ağacı) içeren vbmeta struct içinde olmalıdır.
  • AVB olmayan cihazlarda:
    • Doğrulanmış Başlatma uygulamalarının, bootloader'ın Keymaster'a karma oluşturma işlemini sağlayabilmesi için sürüm meta verilerinin karma oluşturma işlemini bootloader'a sağlaması gerekir.
    • boot.img, yama düzeyini başlıkta saklamaya devam edebilir
    • system.img, düzeltme düzeyini ve işletim sistemi sürümünü salt okunur özelliklerde saklamaya devam edebilir
    • vendor.img, yama düzeyini salt okunur ro.vendor.build.version.security_patch mülkünde depolar.
    • Önyükleme yükleyici, doğrulanmış önyükleme tarafından doğrulanan tüm verilerin karmasını anahtar yöneticisine sağlayabilir.
  • Android 9'da aşağıdaki bölümlerin 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 üstbilgisinde kaldırılır.
  • Anahtar yöneticisi uygulamaları tüm yamalar düzeylerini bağımsız olarak ele almalıdır. Tüm sürüm bilgileri bir anahtarla ilişkili değerlerle eşleşirse ve IKeymaster::upgradeDevice() gerekirse daha yüksek bir düzeltme düzeyine geçerse anahtarlar kullanılabilir.

HAL değişiklikleri

Android 7.1, sürüm bağlama ve sürüm doğrulamayı desteklemek için Tag::OS_VERSION ve Tag::OS_PATCHLEVEL etiketlerini ve configure ile upgradeKey yöntemlerini ekledi. Sürüm etiketleri, Keymaster 2 ve sonraki sürümlerin uygulamaları tarafından yeni oluşturulan (veya güncellenen) tüm anahtarlara otomatik olarak eklenir. Ayrıca, geçerli sistem işletim sistemi sürümüne veya yaması düzeyine karşılık gelen bir işletim sistemi sürümüne ya da yaması düzeyine sahip olmayan bir anahtarın kullanılmasına ErrorCode::KEY_REQUIRES_UPGRADE ile yanıt verilir.

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

Tag::OS_PATCHLEVEL, sistemdeki son güncellemenin yıl ve ayını YYYYAA olarak temsil eden bir UINT değeridir. Burada YYYY dört basamaklı yıl, AA ise iki basamaklı aydır. Örneğin, Mart 2016 201603 olarak temsil edilir.

UpgradeKey

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

Keymaster 3

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

Keymaster 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 yapısıdır
  • keyBlobToUpgrade, yeni sürüme geçirilmesi gereken anahtardır
  • upgradeParams, anahtarı yükseltmek için gereken parametrelerdir. Bunlara, oluşturma sırasında sağlanmışsa anahtar blob'unun şifresini çözmek için gerekli olan Tag::APPLICATION_ID ve Tag::APPLICATION_DATA da dahildir.
  • upgradedKeyBlob, yeni anahtar blob'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 blob'uyla çağrılırsa ErrorCode::INVALID_KEY_BLOB döndürülür. Yama seviyesi mevcut sistem değerinden yüksek bir anahtarla çağrılırsa ErrorCode::INVALID_ARGUMENT döndürülür. OS sürümü mevcut sistem değerinden büyük olan ve sistem değeri sıfır olmayan bir anahtarla çağrılırsa ErrorCode::INVALID_ARGUMENT döndürülür. Sıfır olmayan işletim sistemi sürümlerinden sıfır sürümlere yükseltme yapılmasına izin verilir. Güvenli alanla iletişimde hata olması durumunda uygun bir hata değeri (ör. ErrorCode::SECURE_HW_ACCESS_DENIED, ErrorCode::SECURE_HW_BUSY) döndürür. Aksi takdirde ErrorCode::OK döndürür ve upgradedKeyBlob içinde yeni bir anahtar blob'u döndürür.

keyBlobToUpgrade, upgradeKey aramasından sonra geçerliliğini korur ve cihazın sürümü düşürülürse teorik olarak yeniden kullanılabilir. Uygulamada, anahtar deposu genellikle upgradeKey çağrısından kısa süre sonra keyBlobToUpgrade blob'unda deleteKey çağrısı yapar. keyBlobToUpgrade'te Tag::ROLLBACK_RESISTANT etiketi varsa upgradedKeyBlob'de de olmalıdır (ve geri alma işlemine karşı dayanıklı olmalıdır).

Güvenli yapılandırma

Anahtar yöneticisi TA'nın sürüm bağlamayı uygulamak için mevcut işletim sistemi sürümünü ve yama düzeyini (sürüm bilgileri) güvenli bir şekilde alabileceği ve aldığı bilgilerin çalışan sistemle büyük ölçüde eşleştiğinden emin olabileceği bir yönteme ihtiyacı vardır.

Sürüm bilgilerinin TA'ya güvenli bir şekilde iletilmesini desteklemek için önyükleme resmi üst bilgisine bir OS_VERSIONalan eklendi. Önyükleme resmi oluşturma komut dosyası bu alanı otomatik olarak doldurur. OEM'lerin ve anahtar yöneticisi TA uygulayıcılarının, cihaz önyükleme programlarını, önyükleme görüntüsünden sürüm bilgilerini ayıklayıp güvenli olmayan sistem başlatılmadan önce TA'ya iletecek şekilde değiştirmek için birlikte çalışması gerekir. Bu sayede saldırganlar, TA'ya sürüm bilgilerinin sağlanmasını engelleyemez.

Sistem resminin, önyükleme resmiyle aynı sürüm bilgilerine sahip olması da gerekir. Bu amaçla, yapılandır yöntemi keymaster HAL'e eklendi:

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, HAL açıldıktan sonra ancak diğer yöntemler çağrılmadan önce keymaster2 istemcileri tarafından çağrılır. configure yönteminden önce başka bir yöntem çağrılırsa TA ErrorCode::KEYMASTER_NOT_CONFIGURED döndürür.

Cihaz açıldıktan sonra configure ilk kez çağrıldığında, sağlanan sürüm bilgilerinin önyükleme yükleyici tarafından sağlanan bilgilerle eşleştiği doğrulanmalıdır. Sürüm bilgileri eşleşmezse configure ErrorCode::INVALID_ARGUMENT 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 döndürür ve diğer anahtar yöneticisi yöntemleri normal şekilde çalışmaya başlar.

configure için yapılan sonraki çağrılar, ilk çağrı tarafından döndürülen değeri döndürür ve keymaster'ın durumunu değiştirmez.

configure, içeriğinin doğrulanması amaçlanan sistem tarafından çağrıldığı için saldırganın sistem görüntüsünü tehlikeye atması ve başlatma görüntüsüyle eşleşen ancak sistemin gerçek sürümü olmayan sürüm bilgilerini sağlaması için dar bir fırsat penceresi vardır. Başlatma resmi doğrulaması, sistem resmi içeriğinin dm-verity ile doğrulanması ve configure'ün sistem başlatılırken çok erken çağrılması, bu fırsat penceresinin istismar edilmesini zorlaştırır.