Gatekeeper alt sistemi, cihaz desen/şifre kimlik doğrulamasını Güvenilir Yürütme Ortamı'nda (TEE) gerçekleştirir. Gatekeeper, donanım destekli gizli anahtar kullanarak şifreleri kaydeder ve doğrular. Ayrıca Gatekeeper, art arda yapılan başarısız doğrulama denemelerini sınırlandırır ve belirli bir zaman aşımı ve belirli sayıda art arda başarısız deneme sayısına göre isteklerin işlenmesini reddetmelidir.
Kullanıcılar şifrelerini doğruladığında Gatekeeper, yalnızca güvenli bileşenlerin kullanabileceği bir önyükleme başına HMAC anahtarıyla imzalanan bir kimlik doğrulama jetonu yayınlar ve bu jeton donanım destekli Anahtar Deposu'na gönderilir. Yani Gatekeeper kimlik doğrulama jetonu, Keystore'u kimlik doğrulamasına bağlı anahtarların (ör. uygulamaların oluşturduğu anahtarlar) uygulamalar tarafından kullanılabileceği konusunda bilgilendirir.
Mimari
Gatekeeper üç ana bileşenden oluşur:
gatekeeperd
(Gatekeeper daemon): Android'de,IGatekeeper
'in tedarikçiye özgü temel bir uygulamasına dayalı olarakIGateKeeperService
AIDL arayüzünü uygulayan platformdan bağımsız mantık içeren bir C++ Binder hizmetidir.- Gatekeeper donanım soyutlama katmanı (HAL) hizmeti:
IGatekeeper
AIDL arayüzünün satıcıya özel bir uygulamasıdır. Bu HAL hizmeti Android'de çalışır ancak temel Gatekeeper işlevinin güvenli bir ortamda çalışması gerekir. Bu nedenle, genellikle Gatekeeper TA ile iletişim kurar. - Gatekeeper Güvenilir Uygulaması (TA): TEE'de çalışan ve gerçek şifre veya desen doğrulamasını gerçekleştiren, tedarikçiye özel bir uygulamadır.
LockSettingsService
, Android OS'teki gatekeeperd
daemon'una ulaşan bir istek (Binder aracılığıyla) gönderir. gatekeeperd
daemon'u daha sonra IGatekeeper
HAL hizmetine bir istek gönderir ve bu istek, TEE'deki eşdeğeri Gatekeeper TA'ya ulaşır:

Şekil 1. GateKeeper tarafından kimlik doğrulama için üst düzey veri akışı.
gatekeeperd
daemon'u, Android çerçeve API'lerine HAL'e erişim izni verir ve cihaz kimlik doğrulamalarının Anahtar Deposu'na raporlanmasında yer alır.
gatekeeperd
daemon'ı kendi işleminde çalışır ve sistem sunucusundan ayrıdır.
HAL uygulaması
gatekeeperd
daemon'u, şifre kimlik doğrulaması için temel Gatekeeper TA ile etkileşimde bulunmak üzere IGatekeeper
HAL'i kullanır. Gatekeeper TA uygulaması, blob'ları imzalayabilmeli (kaydedebilmelidir) ve doğrulayabilmelidir. Tüm uygulamaların, her başarılı şifre doğrulamasında oluşturulan kimlik doğrulama jetonu (HardwareAuthToken
) için standart biçime uyması beklenir. HardwareAuthToken
içeriği ve semantiği hakkında ayrıntılı bilgi için HardwareAuthToken.aidl
tanımına bakın.
IGatekeeper
HAL'ın tedarikçi firma uygulamaları, enroll
ve verify
işlevlerini uygulamalıdır:
enroll
yöntemi, bir şifre blob'unu alır, imzalar ve imzayı bir herkese açık kimlik olarak döndürür. Döndürülen blob (enroll
çağrısından),system/gatekeeper/include/gatekeeper/password_handle.h
'te gösterilen yapıya sahip olmalıdır.verify
işlevi, sağlanan şifre tarafından oluşturulan imzayı karşılaştırmalı ve kayıtlı şifre herkese açık kimliğiyle eşleştiğinden emin olmalıdır.
Kaydetme ve doğrulama için kullanılan anahtar hiçbir zaman değişmemeli ve her cihazın başlatılışında yeniden türetilmeye uygun olmalıdır.
Trusty ve diğer uygulamalar
Trusty işletim sistemi, Google'ın TEE ortamları için açık kaynaklı güvenilir işletim sistemidir ve Gatekeeper'ın onaylanmış bir uygulamasını içerir. Ancak TEE'nin kalıcı donanım destekli bir anahtara ve askıdayken çalışan güvenli, tekdüze bir saate erişimi olduğu sürece herhangi bir TEE OS Gatekeeper'ı uygulayabilir.
Trusty, paylaşılan bir gizli anahtarı doğrudan KeyMint ile Gatekeeper'ın Trusty uygulaması (Trusty Gatekeeper) arasında iletmek için dahili bir IPC sistemi kullanır. Bu paylaşılan gizli anahtar, şifre doğrulamasıyla ilgili kanıtlar sağlamak için Keystore'a gönderilen kimlik doğrulama jetonlarının imzalanması için kullanılır. Güvenilir Geçici Bekçi, her kullanım için anahtarı KeyMint'ten ister ve değeri kalıcı olarak saklamaz veya önbelleğe almaz. Uygulamaların bu gizli bilgiyi güvenliği ihlal etmeyecek herhangi bir şekilde paylaşması serbesttir.
Şifreleri kaydettirmek ve doğrulamak için kullanılan HMAC anahtarı, yalnızca Gatekeeper'da türetilir ve saklanır.
Android, tamamlanması için yalnızca cihaza özgü rutinlerin eklenmesini gerektiren genel bir C++ Gatekeeper uygulaması sağlar. Trusty uygulaması buna dayanır. TEE'niz için cihaza özel kod içeren bir TEE Gatekeeper uygulamak istiyorsanız system/gatekeeper/include/gatekeeper/gatekeeper.h
bölümündeki işlevlere ve yorumlara bakın. Uyumlu bir uygulamanın birincil sorumlulukları şunlardır:
IGatekeeper
HAL'e uyma.- Döndürülen kimlik doğrulama jetonları,
HardwareAuthToken
spesifikayonuna (HardwareAuthToken.aidl
bölümünde açıklanmıştır) uygun şekilde biçimlendirilmelidir. - TEE Gatekeeper, aşağıdakilerden birini kullanarak KeyMint ile HMAC anahtarı paylaşabilmelidir:
- Paylaşılan gizli anlaşma: Gatekeeper,
ISharedSecret
HAL'i uygulayarak HMAC anahtarının önyükleme sırasındaki pazarlığına katılabilir. Bunun için hem Gatekeeper hem de KeyMint'in ortak bir önceden paylaşılmış gizliye erişimi olmalıdır. - Doğrudan erişim: Gatekeeper, TEE'de dahili bir işlemler arası iletişim mekanizması kullanarak HMAC anahtarını KeyMint'ten isteğe bağlı olarak veya ilk kullanımda (bundan sonra önbelleğe alınır) alabilir.
- Paylaşılan gizli anlaşma: Gatekeeper,
Kullanıcı güvenli kimlikleri (SID'ler)
Kullanıcı SID'si, bir kullanıcının TEE temsilidir (Android kullanıcı kimliğiyle güçlü bir bağlantısı yoktur). SID, kullanıcı önceki şifresini sağlamadan yeni bir şifre kaydettiğinde kriptografik bir sözde rastgele sayı üreteci (PRNG) ile oluşturulur. Bu durum, güvenilir olmayan yeniden kayıt olarak bilinir ve genellikle yalnızca kullanıcı ilk kez şifre veya desen ayarladığında gerçekleşir.
Kullanıcı geçerli bir önceki şifreyi sağladığında (ör. şifre değiştirirken) güvenilir yeniden kayıt gerçekleşir. Bu durumda, kullanıcı SID'si yeni şifre işleyicisine taşınır ve ona bağlı anahtarlar korunur.
Şifre kaydedilirken kullanıcı SID'si, şifre işleyicisindeki şifreyle birlikte HMAC kimlik doğrulamasına dahil edilir.
Kullanıcı SID'leri, verify()
işlevi tarafından döndürülen HardwareAuthToken
öğesine dahil edilir ve kimlik doğrulamasına bağlı tüm Keystore anahtarlarıyla ilişkilendirilir (HardwareAuthToken
biçimi ve Keystore hakkında ayrıntılı bilgi için Kimlik doğrulama bölümüne bakın).
enroll()
işlevine yapılan güvenilmeyen bir çağrı, kullanıcı SID'sini değiştirdiğinden bu çağrının, söz konusu şifreye bağlı anahtarları geçersiz kılacağını unutmayın. Saldırganlar, Android OS'i kontrol ediyorlarsa cihazın şifresini değiştirebilir ancak bu süreçte root korumalı hassas anahtarları yok ederler.
İstek sınırlama
Gatekeeper, kullanıcı kimlik bilgilerine yönelik kaba kuvvet denemelerini güvenli bir şekilde kısıtlayabilmelidir. GatekeeperVerifyResponse.aidl
bölümünde gösterildiği gibi, HAL bir zaman aşımı süresini milisaniye cinsinden döndürür. Zaman aşımı, istemciye zaman aşımı dolana kadar Gatekeeper'ı tekrar çağırmamasını bildirir.
Bekleme süresi sona ermişse Gatekeeper isteklere hizmet vermemelidir.
Gatekeeper, kullanıcı şifresini doğrulamadan önce bir hata sayacı yazmalıdır. Şifre doğrulaması başarılı olursa hata sayacı sıfırlanır. Bu, verify
çağrısı yapıldıktan sonra yerleşik MMC'yi (eMMC) devre dışı bırakarak tıkanmayı önleyen saldırıları engeller. enroll
işlevi, kullanıcı şifresini de (sağlandıysa) doğrular ve aynı şekilde sınırlandırılmalıdır.
Cihaz tarafından destekleniyorsa hata sayıcısının güvenli depolama alanına yazılması önemle tavsiye edilir. Cihaz dosya tabanlı şifrelemeyi desteklemiyorsa veya güvenli depolama alanı çok yavaşsa uygulamalar doğrudan Tekrar Oynatma Korumalı Bellek Bloğu'nu (RPMB) kullanabilir.