Sürüm Bağlama

Keymaster 1'de, tüm keymaster anahtarları, cihazın Root of Trust veya Verified Boot anahtarına kriptografik olarak bağlanmıştır. Keymaster 2 ve 3'te, tüm anahtarlar ayrıca işletim sistemine ve sistem görüntüsünün yama düzeyine bağlıdır. Bu, eski bir sistem sürümünde veya TEE yazılımında bir zayıflık keşfeden bir saldırganın, bir cihazı savunmasız sürüme geri döndürememesini ve daha yeni sürümle oluşturulan anahtarları kullanmamasını sağlar. Ayrıca, daha yeni bir sürüme veya yama düzeyine yükseltilmiş bir cihazda belirli bir sürüm ve yama düzeyine sahip bir anahtar 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ükseltilirken, tuşlar cihazla birlikte ileriye doğru "mantarlanır", ancak cihazın herhangi bir önceki sürüme döndürülmesi, tuşların kullanılamaz hale gelmesine neden olur.

Treble'ın modüler yapısını desteklemek ve system.img'nin boot.img'e bağlanmasını kırmak için Keymaster 4, anahtar sürüm bağlama modelini her bölüm için ayrı yama seviyelerine sahip olacak şekilde değiştirdi. Bu, geri alma koruması sağlarken her bölümün bağımsız olarak güncellenmesine izin verir.

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

  • Android Verified Boot (AVB) bulunan cihazlar, tüm yama seviyelerini ve sistem sürümünü vbmeta'ya koyabilir, böylece bootloader bunları Keymaster'a sağlayabilir. Zincirleme bölümler için, bölümün sürüm bilgisi zincirleme vbmeta'da olacaktır. Genel olarak, sürüm bilgisi, belirli bir bölüm için doğrulama verilerini (karma veya hashtree) içeren vbmeta struct olmalıdır.
  • AVB olmayan cihazlarda:
    • Doğrulanmış Önyükleme uygulamalarının, önyükleyicinin, Keymaster'a hash sağlayabilmesi için, önyükleyiciye sürüm meta verilerinin bir karmasını sağlaması gerekir.
    • boot.img , başlıkta yama düzeyini depolamaya devam edebilir
    • system.img , yama düzeyini ve işletim sistemi sürümünü salt okunur özelliklerde depolamaya devam edebilir
    • vendor.img , yama düzeyini ro.vendor.build.version.security_patch salt okunur özelliğinde saklar.
    • Önyükleyici, doğrulanmış önyükleme tarafından keymaster'a doğrulanan tüm verilerin bir karmasını 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 başlığından kaldırılmıştır.
  • Keymaster uygulamaları, tüm yama seviyelerini bağımsız olarak ele almalıdır. Tüm sürüm bilgileri bir anahtarla ilişkili değerlerle eşleşiyorsa anahtarlar kullanılabilir ve IKeymaster::upgradeDevice() daha yüksek bir yama düzeyine geçer.

HAL Değişiklikleri

Sürüm bağlamayı ve sürüm onayını 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, yeni oluşturulan (veya güncellenen) tüm anahtarlara Keymaster 2+ uygulamaları tarafından otomatik olarak eklenir. Ayrıca, sırasıyla mevcut sistem işletim sistemi sürümü veya yama düzeyiyle eşleşen bir OS sürümüne veya yama düzeyine sahip olmayan bir anahtarı kullanma girişimi ErrorCode::KEY_REQUIRES_UPGRADE ile reddedilir.

Tag::OS_VERSION , bir Android sistem sürümünün majör, minör ve alt minör 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 AA iki basamaklı aydır. Örneğin, Mart 2016, 201603 olarak temsil edilecektir.

YükseltmeAnahtarı

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, upgradeKey yöntemini ekledi:

anahtar yöneticisi 3

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

anahtar ustası 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 , yükseltilmesi gereken anahtardır
  • upgradeParams , anahtarı yükseltmek için gereken parametrelerdir. Bunlar, oluşturma sırasında sağlanmışlarsa, anahtar bloğunun şifresini çözmek için gerekli olan Tag::APPLICATION_ID ve Tag::APPLICATION_DATA öğelerini içerecektir.
  • upgradedKeyBlob , yeni anahtar blobunu döndürmek için kullanılan çıktı parametresidir.

upgradeKey , ayrıştırılamayan veya başka bir şekilde geçersiz olan bir anahtar blobu ile çağrılırsa, ErrorCode::INVALID_KEY_BLOB döndürür. Yama seviyesi mevcut sistem değerinden daha büyük bir anahtarla çağrılırsa, ErrorCode::INVALID_ARGUMENT döndürür. İşletim sistemi sürümü mevcut 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 döndürür. İşletim sistemi sürümünün sıfırdan sıfıra yükseltilmesine izin verilir. Güvenli dünya ile iletişimde hata olması durumunda, uygun bir hata değeri döndürür (örneğin ErrorCode::SECURE_HW_ACCESS_DENIED , ErrorCode::SECURE_HW_BUSY ). Aksi takdirde, ErrorCode::OK döndürür ve upgradedKeyBlob içinde yeni bir anahtar blob döndürür.

keyBlobToUpgrade , upgradeKey çağrısından sonra geçerli kalır ve cihaz eski sürüme geçirilirse teorik olarak yeniden kullanılabilir. Uygulamada, anahtar deposu genellikle deleteKey çağrısından kısa bir süre sonra keyBlobToUpgrade upgradeKey çağırır. keyBlobToUpgrade Tag::ROLLBACK_RESISTANT etiketine sahipse, o zaman upgradedKeyBlob buna sahip olmalıdır (ve geri almaya dayanıklı olmalıdır).

Güvenli yapılandırma

Sürüm bağlamayı uygulamak için, keymaster TA'nın geçerli işletim sistemi sürümünü ve yama düzeyini (sürüm bilgisi) güvenli bir şekilde alması ve aldığı bilgilerin çalışan sistem hakkındaki bilgilerle güçlü bir şekilde eşleşmesini sağlaması için bir yola ihtiyacı vardır.

Sürüm bilgilerinin TA'ya güvenli bir şekilde teslim edilmesini 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'ler ve keymaster TA uygulayıcılarının, güvenli olmayan sistem başlatılmadan önce sürüm bilgilerini önyükleme görüntüsünden çıkarmak ve TA'ya iletmek üzere aygıt önyükleyicilerini değiştirmek için birlikte çalışması gerekir. Bu, saldırganların TA'ya sürüm bilgilerinin sağlanmasına müdahale edememesini sağlar.

Ayrıca sistem görüntüsünün önyükleme görüntüsü ile aynı sürüm bilgisine sahip olduğundan emin olmak gerekir. Bu amaçla, keymaster HAL'a yapılandırma yöntemi 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 params Bu yöntem, keymaster2 istemcileri tarafından HAL açıldıktan sonra, ancak diğer yöntemler çağrılmadan önce çağrılır. Yapılandırmadan önce başka bir yöntem çağrılırsa, TA, ErrorCode::KEYMASTER_NOT_CONFIGURED 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 döndürür ve diğer tüm keymaster 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 keymaster yöntemleri normal şekilde çalışmaya başlar.

configure yönelik sonraki çağrılar, ilk çağrı tarafından döndürülen aynı değeri döndürür ve keymaster'ın durumunu değiştirmez. Bu işlemin, tüm OTA'ların hem sistem hem de önyükleme görüntülerini güncellemesini GEREKTİReceğini unutmayın; sürüm bilgilerini senkronize tutmak için ayrı olarak 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ün güvenliğini aşması ve onu önyükleme görüntüsüyle eşleşen, ancak gerçek 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çeriğinin dm-verity doğrulaması ve configure sistem önyüklemesinde çok erken çağrılması, bu fırsat penceresinden yararlanmayı zorlaştırmalıdır.