Donanım Destekli Anahtar Deposu

Bir çip üzerinde sistemde (SoC) güvenilir bir yürütme ortamının bulunması, Android cihazların Android OS'ye, platform hizmetlerine ve hatta üçüncü taraf uygulamalarına (standart Java Kriptografi Mimarisi'ne Android'e özel uzantılar şeklinde, KeyGenParameterSpec bölümüne bakın) donanım destekli, güçlü güvenlik hizmetleri sunma fırsatı sunar.

Sözlük

Aşağıda, anahtar kutusu bileşenlerine ve aralarındaki ilişkilere kısa bir genel bakış verilmiştir.

AndroidKeyStore
Uygulamaların Anahtar Deposu işlevine erişmek için kullandığı Android Framework API ve bileşeni. Standart Java Şifreleme Mimarisi API'lerinin bir uygulamasıdır ancak Android'e özgü uzantılar da ekler ve uygulamanın kendi işlem alanında çalışan Java kodundan oluşur. AndroidKeyStore, anahtar deposu davranışıyla ilgili uygulama isteklerini anahtar deposu hizmetine yönlendirerek yerine getirir.
anahtar mağazası daemon'u
Binder API aracılığıyla tüm Anahtar Deposu işlevlerine erişim sağlayan bir Android sistem hizmet programı. Bu arka plan hizmet programı, temel KeyMint (veya Keymaster) uygulaması tarafından oluşturulan ve gizli anahtar materyalini içeren anahtar topakları'nı saklamaktan sorumludur. Bu anahtar topakları, Keystore'un saklayabileceği ancak kullanamayacağı veya gösteremeyeceği şekilde şifrelenir.
KeyMint HAL hizmeti
Temel KeyMint TA'ya erişim sağlayan IKeyMintDevice HAL'i uygulayan bir AIDL sunucusu.
KeyMint güvenilir uygulaması (TA)
Güvenli bir bağlamda (genellikle ARM SoC'teki TrustZone'da) çalışan ve güvenli kriptografi işlemlerinin tümünü sağlayan yazılım. Bu uygulama, ham anahtar materyaline erişebilir ve anahtarların kullanımına izin vermeden önce anahtarlardaki tüm erişim denetimi koşullarını doğrular.
LockSettingsService
Kullanıcı kimlik doğrulamasından (hem şifre hem de parmak izi) sorumlu Android sistem bileşeni. Keystore'un bir parçası değildir ancak Keystore, yalnızca kullanıcı kimliğini doğruladıysa kullanılabilen kimlik doğrulamasına bağlı anahtarlar kavramını desteklediği için alakalı bir konudur. LockSettingsService, kimlik doğrulama jetonları almak için Gatekeeper TA ve Fingerprint TA ile etkileşime geçer. Bu jetonları anahtar deposu hizmetine sağlar ve KeyMint TA tarafından tüketilir.
Gatekeeper TA
Güvenli ortamda çalışan ve kullanıcı şifrelerinin kimliğini doğrulamaktan ve KeyMint TA'ya belirli bir zamanda belirli bir kullanıcı için kimlik doğrulaması yapıldığını kanıtlamak için kullanılan kimlik doğrulama jetonlarını oluşturmaktan sorumlu bileşen.
Parmak izi TA
Güvenli ortamda çalışan ve kullanıcı parmak izlerinin kimliğini doğrulamaktan ve KeyMint TA'ya belirli bir zamanda belirli bir kullanıcı için kimlik doğrulamasının yapıldığını kanıtlamak için kullanılan kimlik doğrulama jetonlarını oluşturmaktan sorumlu bileşen.

Mimari

Android Anahtar Deposu API'si ve temel KeyMint HAL'i, erişim denetimli, donanım destekli anahtarlar kullanan protokollerin uygulanmasına olanak tanıyan temel ancak yeterli bir kriptografik temel öğe grubu sağlar.

KeyMint HAL, donanım destekli kriptografik hizmetler sağlamak için Anahtar Deposu hizmeti tarafından kullanılan, OEM tarafından sağlanan bir hizmettir. HAL uygulamaları, özel anahtar materyalini güvende tutmak için kullanıcı alanında veya hatta çekirdek alanında hassas işlemler gerçekleştirmez. Bunun yerine Android'de çalışan KeyMint HAL hizmeti, genellikle istekleri uygulama tanımlı bir kablo biçiminde sıralayıp çözerek hassas işlemleri bir tür güvenli ortamda çalışan bir TA'ya devreder.

Elde edilen mimari şu şekilde görünür:

KeyMint'e erişim

Şekil 1. KeyMint'e erişim

KeyMint HAL API, platform içi bileşenler tarafından kullanılan düşük düzey bir API'dir ve uygulama geliştiricilere sunulmaz. Uygulamaların kullanabileceği üst düzey Java API'si Android Developers sitesinde açıklanmaktadır.

Erişim denetimi

Android Keystore, hem uygulamalar hem de diğer sistem bileşenleri için donanım destekli kriptografik anahtarların depolanması ve kullanılmasına yönelik merkezi bir bileşen sağlar. Bu nedenle, herhangi bir anahtara erişim genellikle anahtarı oluşturan uygulama veya sistem bileşeniyle sınırlıdır.

Anahtar deposu alanları

Bu erişim denetimini desteklemek için anahtarlar, Keystore'da bir anahtar tanımlayıcısı ile tanımlanır. Bu anahtar tanımlayıcı, tanımlayıcıya ait bir alanı ve bu alandaki bir kimliği belirtir.

Android uygulamaları, anahtarları bir dize takma adıyla tanımlayan standart Java Şifreleme Mimarisi'ni kullanarak Anahtar Deposu'na erişir. Bu tanımlama yöntemi, dahili olarak Keystore APP alanıyla eşlenir. Ayrıca, farklı uygulamalardaki anahtarların anlamını açıklığa kavuşturmak ve bir uygulamanın başka bir uygulamanın anahtarlarına erişmesini önlemek için arayanın UID'si de dahil edilir.

Ayrıca, bir anahtar yüklendikten sonra çerçeve kodu dahili olarak benzersiz bir sayısal anahtar kimliği alır. Bu sayısal kimlik, KEY_ID alanındaki anahtar tanımlayıcıları için tanımlayıcı olarak kullanılır. Ancak erişim denetimi yine de gerçekleştirilir: Bir uygulama, başka bir uygulamanın anahtarının anahtar kimliğini keşfetse bile normal koşullarda bu anahtarı kullanamaz.

Ancak bir uygulamanın, anahtarın kullanımını farklı bir uygulamaya (UID ile tanımlanır) vermesi mümkündür. Bu izin verme işlemi, GRANT alanındaki anahtar tanımlayıcılarının tanımlayıcısı olarak kullanılan benzersiz bir izin verme tanımlayıcısı döndürür. Yine de erişim denetimi gerçekleştirilir: Bir üçüncü taraf uygulaması, anahtar sahibinin izin kimliğini keşfetse bile bu anahtarı kullanamaz.

Anahtar anahtar tanımlayıcıları için diğer sistem bileşenlerinde kullanılan ve uygulama tarafından oluşturulan anahtarlarda kullanılamayan iki alan daha destekler:

  • BLOB alanı, anahtar tanımlayıcısı içinde anahtar için bir tanımlayıcı olmadığını gösterir. Bunun yerine, anahtar tanımlayıcısı anahtar kümesini tutar ve istemci anahtar kümesi depolama alanını yönetir. Bu, veri bölümü monte edilmeden önce Keystore'a erişmesi gereken istemciler (ör. vold) tarafından kullanılır.
  • SELINUX alanı, sistem bileşenlerinin anahtarları paylaşmasına olanak tanır. Bu erişim, SELinux etiketine karşılık gelen sayısal bir tanımlayıcı tarafından yönetilir (keystore_key için SELinux politikasına bakın).

keystore_key için SELinux politikası

Domain::SELINUX anahtar tanımlayıcıları için kullanılan tanımlayıcı değerleri, keystore2_key_context SELinux politika dosyasında yapılandırılır. Bu dosyalardaki her satır, bir sayıyı bir SELinux etiketiyle eşler. Örneğin:

# wifi_key is a keystore2_key namespace intended to be used by wpa supplicant and
# Settings to share keystore keys.
102            u:object_r:wifi_key:s0

SELINUX alanında 102 kimlikli anahtara erişmesi gereken bir bileşenin ilgili SELinux politikasına sahip olması gerekir. Örneğin, wpa_supplicant'ün bu anahtarları almasına ve kullanmasına izin vermek için hal_wifi_supplicant.te'a aşağıdaki satırı ekleyin:

allow hal_wifi_supplicant wifi_key:keystore2_key { get, use };

Domain::SELINUX anahtarlarının sayısal tanımlayıcıları, çakışmadan farklı bölümleri desteklemek için aralıklara bölünür:

Bölüm Aralık Yapılandırma dosyaları
Sistem 0 ... 9.999 /system/etc/selinux/keystore2_key_contexts, /plat_keystore2_key_contexts
Genişletilmiş Sistem 10.000 ... 19.999 /system_ext/etc/selinux/system_ext_keystore2_key_contexts, /system_ext_keystore2_key_contexts
Ürün 20.000 ... 29.999 /product/etc/selinux/product_keystore2_key_contexts, /product_keystore2_key_contexts
Satıcı 30.000 ... 39.999 /vendor/etc/selinux/vendor_keystore2_key_contexts, /vendor_keystore2_key_contexts

Sistem bölümü için aşağıdaki belirli değerler tanımlanmıştır:

Ad alanı kimliği SEPolicy etiketi UID Açıklama
0 su_key Yok Süper kullanıcı anahtarı. Yalnızca userdebug ve eng derlemelerinde test için kullanılır. Kullanıcı derlemelerinde alakasızdır.
1 shell_key Yok Kabuk için kullanılabilir ad alanı. Çoğunlukla test için kullanılır ancak komut satırından kullanıcı derlemelerinde de kullanılabilir.
100 vold_key Yok vold tarafından kullanılmak üzere tasarlanmıştır.
101 odsign_key Yok Cihaz üzerinde imzalama arka plan programı tarafından kullanılır.
102 wifi_key AID_WIFI(1010) wpa_supplicant dahil olmak üzere Android'in kablosuz alt sistemi tarafından kullanılır.
103 locksettings_key Yok LockSettingsService tarafından kullanıldı
120 resume_on_reboot_key AID_SYSTEM(1000) Yeniden başlatıldığında devam ettirme özelliğini desteklemek için Android'in sistem sunucusu tarafından kullanılır.

Erişim vektörleri

Anahtar mağazası, bir anahtara genel erişimi kontrol etmenin yanı sıra anahtar üzerinde hangi işlemlerin yapılabileceğini kontrol etmenize olanak tanır. keystore2_key izinleri KeyPermission.aidl dosyasında açıklanmıştır.

Sistem izinleri

keystore_key için SELinux politikası bölümünde açıklanan anahtar başına erişim denetimlerine ek olarak aşağıdaki tabloda, çeşitli sistem ve bakım işlemlerini gerçekleştirmek için gereken diğer SELinux izinleri açıklanmaktadır:

İzin Anlamı
add_auth Anahtar deposuna kimlik doğrulama jetonları eklemek için gereklidir. Gatekeeper veya BiometricManager gibi kimlik doğrulama sağlayıcıları tarafından kullanılır.
clear_ns Belirli bir ad alanındaki tüm anahtarları silmek için gereklidir; uygulamalar kaldırıldığında bakım işlemi olarak kullanılır.
list Anahtarları sahiplik veya kimlik doğrulama bağlı olup olmama gibi çeşitli özelliklere göre numaralandırmak için sistem tarafından gereklidir. Bu izin, kendi ad alanlarının listesini çıkaran çağrıcılar tarafından gerekli değildir (get_info izni kapsamındadır).
lock Anahtar deposunun cihazın kilitli olduğunu bildirmesi için gereklidir. Bu işlem, kimlik doğrulamayla bağlı anahtarların kullanılamamasını sağlamak için süper anahtarları çıkarır.
unlock Anahtar deposunu cihazın kilidinin açıldığı konusunda bilgilendirmek ve kimlik doğrulamasına bağlı anahtarları koruyan süper anahtarlara erişimi geri yüklemek için gereklidir.
reset Anahtar deposunu fabrika varsayılanlarına sıfırlamak ve Android OS'in çalışması için hayati öneme sahip olmayan tüm anahtarları silmek için gereklidir.

Geçmiş

Android 5 ve önceki sürümlerde, Keymaster donanım soyutlama katmanının (HAL) 0.2 ve 0.3 sürümleri tarafından sağlanan basit, donanım destekli bir kriptografik hizmetler API'si vardı. Anahtar mağazası, dijital imzalama ve doğrulama işlemlerinin yanı sıra asimetrik imzalama anahtarı çiftlerinin oluşturulmasını ve içe aktarılmasını sağladı. Bu özellik birçok cihazda zaten uygulanmaktadır ancak yalnızca bir imza API'si ile kolayca ulaşılamayacak birçok güvenlik hedefi vardır. Android 6.0, daha geniş bir özellik yelpazesi sunmak için Keystore API'yi genişletti.

Android 6.0

Android 6.0'ta Keymaster 1.0, simetrik kriptografik primitifler, AES ve HMAC'nin yanı sıra donanım destekli anahtarlar için bir erişim denetimi sistemi ekledi. Erişim denetimleri, anahtar oluşturma sırasında belirtilir ve anahtarın kullanım ömrü boyunca uygulanır. Anahtarlar, yalnızca kullanıcının kimliği doğrulandıktan sonra ve yalnızca belirtilen amaçlarla veya belirtilen kriptografik parametrelerle kullanılacak şekilde kısıtlanabilir.

Android 6.0'taki Keystore, kriptografik temel öğelerin kapsamını genişletmenin yanı sıra aşağıdakileri de ekledi:

  • Anahtarların kötüye kullanılması nedeniyle güvenlik ihlali riskini azaltmak için anahtar kullanımının sınırlandırılmasına izin veren bir kullanım denetimi şeması
  • Anahtarları belirli kullanıcılar, istemciler ve tanımlanmış bir zaman aralığıyla kısıtlamayı etkinleştiren bir erişim denetimi şeması

Android 7.0

Android 7.0'da Keymaster 2, anahtar doğrulaması ve sürüm bağlama desteği ekledi.

Anahtar tasdiki, anahtarın güvenli donanımda varlığını ve yapılandırmasını uzaktan doğrulanabilir hale getirmek için anahtarın ve erişim denetimlerinin ayrıntılı bir açıklamasını içeren ortak anahtar sertifikaları sağlar.

Sürüm bağlama anahtarları işletim sistemine ve yama düzeyi sürümüne bağlar. Bu sayede, sistemin veya TEE yazılımının eski bir sürümünde zayıflık keşfeden bir saldırgan, cihazı savunmasız sürüme geri döndürüp yeni sürümle oluşturulan anahtarları kullanamaz. Ayrıca, belirli bir sürüm ve yamalar düzeyine sahip bir anahtar, daha yeni bir sürüme veya yamalar 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. Cihaz yükseltilirken tuşlar da cihazla birlikte yükseltilir. Ancak cihazın önceki bir sürüme geri döndürülmesi, tuşların kullanılamamasına neden olur.

Android 8.0

Android 8.0'da Keymaster 3, eski stil C yapısı HAL'den yeni donanım arayüzü tanımlama dilinde (HIDL) bir tanım kullanılarak oluşturulan C++ HAL arayüzüne geçti. Değişiklik kapsamında, bağımsız değişken türlerinin çoğu değişti. Ancak türler ve yöntemler, eski türlerle ve HAL yapı yöntemleriyle bire bir ilişkilidir.

Android 8.0, bu arayüz düzeltmesine ek olarak Keymaster 2'nin doğrulama özelliğini kimlik doğrulamayı destekleyecek şekilde genişletti. Kimlik doğrulaması, cihaz seri numarası, ürün adı ve telefon kimliği (IMEI veya MEID) gibi donanım tanımlayıcılarının güçlü bir şekilde doğrulanması için sınırlı ve isteğe bağlı bir mekanizma sağlar. Bu eklemeyi uygulamak için Android 8.0, kimlik doğrulamasını eklemek amacıyla ASN.1 doğrulama şemasını değiştirdi. Anahtar yöneticisi uygulamalarının, ilgili veri öğelerini almak için güvenli bir yol bulması ve özelliği güvenli ve kalıcı olarak devre dışı bırakmak için bir mekanizma tanımlaması gerekir.

Android 9

Android 9'daki güncellemeler arasında şunlar yer alır:

  • Keymaster 4'e güncelleme
  • Yerleşik Secure Elements desteği
  • Güvenli anahtar içe aktarma desteği
  • 3DES şifrelemesi desteği
  • Sürüm bağlama işleminde yapılan değişiklikler sayesinde boot.img ve system.img'un bağımsız güncellemelere izin verecek şekilde ayrı ayrı ayarlanmış sürümleri olur.

Android 10

Android 10, Keymaster HAL'ın 4.1 sürümünü kullanıma sundu. Bu sürümde şunlar eklendi:

  • Yalnızca cihazın kilidi açıkken kullanılabilen anahtarlar için destek
  • Yalnızca ön yükleme aşamalarının başlarında kullanılabilen anahtarlar için destek
  • Donanım kapsülü depolama alanı anahtarları için isteğe bağlı destek
  • StrongBox'ta cihaza özgü doğrulama için isteğe bağlı destek

Android 12

Android 12, Keymaster HAL'in yerini alan ancak benzer işlevler sunan yeni KeyMint HAL'i kullanıma sundu. KeyMint HAL, yukarıdaki tüm özelliklerin yanı sıra şunları da içerir:

  • ECDH anahtar anlaşması desteği
  • Kullanıcı tarafından belirtilen doğrulama anahtarları için destek
  • Sınırlı sayıda kullanıma sahip anahtarlar için destek

Android 12, Rust'ta yeniden yazılmış ve keystore2 olarak bilinen anahtar deposu sistem daemon'unun yeni bir sürümünü de içerir.

Android 13

Android 13, hem imzalama hem de anahtar anlaşması için Curve25519 desteği ekleyen KeyMint HAL'in 2. sürümünü ekledi.