Donanım Destekli Anahtar Deposu

Çip üzerinde sistem (SoC) içinde Güvenilir Yürütme Ortamı (TEE) bulunması, Android cihazların Android OS'e, platform hizmetlerine ve hatta üçüncü taraf uygulamalarına (standart Java Cryptography Architecture'ın Android'e özgü uzantıları şeklinde, bkz. KeyGenParameterSpec) donanım destekli, güçlü güvenlik hizmetleri sunmasına olanak tanır.

Sözlük

Keystore bileşenleri ve aralarındaki ilişkilerle ilgili kısa bir genel bakışı aşağıda bulabilirsiniz.

AndroidKeyStore
Uygulamaların Anahtar Deposu işlevine erişmek için kullandığı Android Framework API ve bileşeni. Bu, standart Java Cryptography Architecture 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 arka plan programına yönlendirerek karşılar.
keystore daemon
Binder API aracılığıyla tüm anahtar deposu işlevlerine erişim sağlayan bir Android sistem arka plan programı. Bu arka plan programı, temel KeyMint (veya Keymaster) uygulaması tarafından oluşturulan ve gizli anahtar materyalini içeren keyblob'ları depolamaktan sorumludur. Bu materyal, Keystore'un bunları depolayabilmesi ancak kullanamaması veya ifşa edememesi için şifrelenir.
KeyMint HAL hizmeti
Temel KeyMint TA'ya erişim sağlayan IKeyMintDevice HAL'yi uygulayan bir AIDL sunucusu.
KeyMint güvenilir uygulaması (TA)
Güvenli bir bağlamda (çoğu zaman bir ARM SoC'deki TrustZone'da) çalışan ve tüm güvenli kriptografik işlemleri 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 kontrolü koşullarını doğrular.
LockSettingsService
Kullanıcı kimlik doğrulamasından (hem şifre hem parmak izi) sorumlu Android sistem bileşeni. Keystore'un bir parçası olmasa da Keystore, kimlik doğrulama ile bağlı anahtarlar kavramını desteklediği için önemlidir. Bu anahtarlar yalnızca kullanıcı kimlik doğrulama yaptıysa kullanılabilir. LockSettingsService, kimlik doğrulama jetonları almak için Gatekeeper TA ve Fingerprint TA ile etkileşime girer. Bu jetonları, KeyMint TA tarafından kullanılan anahtar deposu daemon'una sağlar.
Gatekeeper TA
Güvenli ortamda çalışan ve kullanıcı şifrelerinin kimliğini doğrulamaktan ve KeyMint TA'ya belirli bir kullanıcı için belirli bir zamanda kimlik doğrulama yapıldığını kanıtlamak üzere kullanılan kimlik doğrulama jetonları oluşturmaktan sorumlu olan 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 kullanıcı için belirli bir zamanda kimlik doğrulama yapıldığını kanıtlamak üzere kullanılan kimlik doğrulama jetonları oluşturmaktan sorumlu olan bileşen.

Mimari

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

KeyMint HAL, Anahtar Deposu hizmeti tarafından donanım destekli şifreleme hizmetleri sağlamak için kullanılan, OEM tarafından sağlanan bir hizmettir. HAL uygulamaları, özel anahtar materyalinin güvenliğini sağlamak için kullanıcı alanında, hatta çekirdek alanında bile hassas işlemler gerçekleştirmez. Bunun yerine, Android'de çalışan KeyMint HAL hizmeti, hassas işlemleri genellikle istekleri bazı uygulamaya özel tel biçiminde sıralayıp sıralamadan çıkararak 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

1. şekil. KeyMint'e erişim.

KeyMint HAL API, düşük düzeydedir, platformun dahili bileşenleri tarafından kullanılır ve uygulama geliştiricilere sunulmaz. Uygulamaların kullanımına sunulan daha ü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 normalde anahtarı oluşturan uygulama veya sistem bileşeniyle sınırlıdır.

Anahtar deposu alanları

Bu erişim kontrolünü desteklemek için anahtarlar, anahtar tanımlayıcı ile Keystore'da tanımlanır. Bu anahtar tanımlayıcısı, tanımlayıcının ait olduğu alanı ve bu alandaki bir kimliği gösterir.

Android uygulamaları, anahtarları dize takma adıyla tanımlayan standart Java Cryptography Architecture'ı kullanarak Keystore'a erişir. Bu tanımlama yöntemi, dahili olarak Keystore APP alanıyla eşlenir. Farklı uygulamalardaki anahtarların belirsizliğini gidermek için arayanın UID'si de dahil edilir. Böylece bir uygulamanın diğerinin anahtarlarına erişmesi önlenir.

Dahili olarak, anahtar yüklendikten sonra çerçeveler kodu da 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 kontrolü yine de yapılır: Bir uygulama, başka bir uygulamanın anahtarının anahtar kimliğini keşfetse bile normal şartlarda bu kimliği kullanamaz.

Ancak bir uygulamanın, UID ile tanımlanan farklı bir uygulamaya anahtar kullanım izni vermesi mümkündür. Bu izin verme işlemi, GRANT alanındaki anahtar tanımlayıcıları için tanımlayıcı olarak kullanılan benzersiz bir izin tanımlayıcısı döndürür. Yine erişim kontrolü gerçekleştirilir: Üçüncü taraf bir uygulama, bir alıcının anahtarının izin kimliğini keşfetse bile bunu kullanamaz.

Keystore, anahtar tanımlayıcılar için diğer iki alanı da destekler. Bu alanlar diğer sistem bileşenleri için kullanılır ve uygulama tarafından oluşturulan anahtarlarda kullanılamaz:

  • BLOB alanı, anahtar tanımlayıcısında anahtar için tanımlayıcı olmadığını gösterir. Bunun yerine, anahtar tanımlayıcısı anahtar blob'unu tutar ve istemci, anahtar blob'u depolama işlemini gerçekleştirir. 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. Erişim, SELinux etiketine karşılık gelen sayısal bir tanımlayıcı tarafından yönetilir (keystore_key için SELinux politikası bölümüne 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 kimliği 102 olan anahtara erişmesi gereken bir bileşenin, ilgili SELinux politikasına sahip olması gerekir. Örneğin, wpa_supplicant uygulamasının bu anahtarları almasına ve kullanmasına izin vermek için hal_wifi_supplicant.te uygulamasına 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ışma olmadan farklı bölümleri desteklemek için aralıklara ayrılı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 geçerli değildir.
1 shell_key Yok Kabukta kullanılabilen 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 bağlantı alt sistemi tarafından kullanılır.
103 locksettings_key Yok LockSettingsService tarafından kullanılıyor
120 resume_on_reboot_key AID_SYSTEM(1000) Yeniden başlatma işleminden sonra devam etmeyi desteklemek için Android'in sistem sunucusu tarafından kullanılır.

Erişim vektörleri

Keystore, bir anahtar üzerinde hangi işlemlerin yapılabileceğini kontrol etmenize olanak tanır. Ayrıca, anahtara genel erişimi de kontrol edebilirsiniz. keystore2_key izinleri KeyPermission.aidl dosyasında açıklanmıştır.

Sistem izinleri

SELinux policy for keystore_key (keystore_key için SELinux politikası) bölümünde açıklanan anahtar başına erişim kontrollerine 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 Kimlik doğrulama jetonlarını Keystore'a 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 ile bağlı olup olmama gibi çeşitli özelliklere göre numaralandırmak için sistem tarafından gereklidir. Bu izin, kendi ad alanlarını numaralandıran arayanlar için gerekli değildir (get_info izni kapsamındadır).
lock Cihazın kilitlendiğini anahtar deposuna bildirmek için gereklidir. Bu işlem, kimlik doğrulama ile bağlı anahtarların kullanılamamasını sağlamak için süper anahtarları siler.
unlock Cihazın kilidinin açıldığını anahtar deposuna bildirmek ve kimlik doğrulama için kullanılan anahtarları koruyan süper anahtarlara erişimi geri yüklemek için gereklidir.
reset Keystore'u fabrika ayarlarına sıfırlamak ve Android işletim sisteminin işleyişi için hayati önem taşımayan tüm anahtarları silmek için gereklidir.

Geçmiş

Android 5 ve önceki sürümlerde, Android'de 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 deposu, dijital imzalama ve doğrulama işlemlerinin yanı sıra asimetrik imzalama anahtarı çiftlerinin oluşturulması ve içe aktarılması işlemlerini sağlar. Bu özellik birçok cihazda uygulanmış olsa da yalnızca imza API'siyle kolayca ulaşılamayan birçok güvenlik hedefi vardır. Android 6.0, Keystore API'yi genişleterek daha kapsamlı özellikler sunar.

Android 6.0

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

Android 6.0'daki Keystore, kriptografik öğelerin aralığını genişletmenin yanı sıra şunları da ekledi:

  • Anahtar kullanımının sınırlandırılmasına izin veren ve anahtarların kötüye kullanılmasından kaynaklanan güvenlik ihlali riskini azaltan bir kullanım kontrolü şeması
  • Anahtarların belirli kullanıcılar, istemciler ve tanımlanmış bir zaman aralığıyla kısıtlanmasını sağlayan bir erişim kontrolü şeması

Android 7.0

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

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

Sürüm bağlama anahtarları işletim sistemi 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ündeki zafiyeti keşfeden bir saldırgan, cihazı savunmasız sürüme geri döndüremez ve daha 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, kullanılmadan önce yükseltilir ve anahtarın önceki sürümü geçersiz kılınır. Cihaz yükseltilirken anahtarlar da cihazla birlikte ileriye doğru hareket eder ancak cihazın önceki bir sürüme geri döndürülmesi anahtarların kullanılamaz hale gelmesine neden olur.

Android 8.0

Android 8.0'da Keymaster 3, eski tarz 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çiş yaptı. Değişiklik kapsamında, türler ve yöntemler eski türler ve HAL yapı yöntemleriyle bire bir yazışma olsa da birçok bağımsız değişken türü değişti.

Bu arayüz revizyonuna ek olarak Android 8.0, Keymaster 2'nin onay özelliğini genişleterek kimlik onayı desteği ekledi. Kimlik doğrulama, 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, ASN.1 attestation şemasını kimlik onayı ekleyecek şekilde değiştirdi. Keymaster uygulamaları, ilgili veri öğelerini almak için güvenli bir yol bulmanın yanı sıra özelliği güvenli ve kalıcı olarak devre dışı bırakacak bir mekanizma tanımlamalıdır.

Android 9

Android 9'daki güncellemeler şunları içeriyordu:

  • Keymaster 4'e güncelleme
  • Yerleştirilmiş güvenli öğeler için destek
  • Güvenli anahtar içe aktarma desteği
  • 3DES şifreleme desteği
  • boot.img ve system.img'nin bağımsız güncellemeler için ayrı ayrı ayarlanmış sürümlere sahip olması amacıyla sürüm bağlamada yapılan değişiklikler

Android 10

Android 10, Keymaster HAL'nin 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 erken başlatma aşamalarında kullanılabilen anahtarlar için destek
  • Donanım sarmalı depolama anahtarları için isteğe bağlı destek
  • StrongBox'ta cihaza özgü onay için isteğe bağlı destek

Android 12

Android 12, Keymaster HAL'nin yerini alan ancak benzer işlevler sunan yeni KeyMint HAL'yi tanıttı. Yukarıdaki tüm özelliklere ek olarak KeyMint HAL şunları da içerir:

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

Android 12'de, Rust ile yeniden yazılan ve keystore2 olarak bilinen anahtar deposu sistem daemon'unun yeni bir sürümü de yer alıyor.

Android 13

Android 13'e KeyMint HAL'ın v2 sürümü eklendi. Bu sürüm, hem imzalama hem de anahtar anlaşması için Curve25519 desteği ekler.