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 edebilirsystem.img
, düzeltme düzeyini ve işletim sistemi sürümünü salt okunur özelliklerde saklamaya devam edebilirvendor.img
, yama düzeyini salt okunurro.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
veOS_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ırkeyBlobToUpgrade
, yeni sürüme geçirilmesi gereken anahtardırupgradeParams
, anahtarı yükseltmek için gereken parametrelerdir. Bunlara, oluşturma sırasında sağlanmışsa anahtar blob'unun şifresini çözmek için gerekli olanTag::APPLICATION_ID
veTag::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_VERSION
alan 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.