Ç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:

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
vesystem.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.