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üzeyiniro.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
veOS_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 olanTag::APPLICATION_ID
veTag::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.