Kapı görevlisi

Gatekeeper alt sistemi, Güvenilir Yürütme Ortamı'nda (TEE) cihaz deseni/şifre kimlik doğrulaması gerçekleştirir. Gatekeeper, donanım tabanlı bir gizli anahtar kullanarak şifreleri kaydeder ve doğrular. Ayrıca Gatekeeper, art arda başarısız doğrulama denemelerini kısıtlar ve belirli bir zaman aşımı ile belirli sayıda art arda başarısız denemeye göre hizmet isteklerini reddetmelidir.

Kullanıcılar şifrelerini doğruladığında Gatekeeper, yalnızca güvenli bileşenlerin kullanabileceği, önyükleme başına HMAC anahtarıyla imzalanmış bir kimlik doğrulama jetonu yayınlar. Bu jeton, donanım tabanlı Keystore'a gönderilir. Yani bir Gatekeeper kimlik doğrulama jetonu, kimlik doğrulamaya bağlı anahtarların (örneğin, uygulamaların oluşturduğu anahtarlar) uygulamalar tarafından kullanılabileceğini Keystore'a bildirir.

Mimari

Gatekeeper üç ana bileşenden oluşur:

  • gatekeeperd (Gatekeeper daemon): Android'de, tedarikçiye özel temel bir IGatekeeper uygulamasına dayalı olarak IGateKeeperService 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 tedarikçiye özel bir uygulaması. Bu HAL hizmeti Android'de çalışır ancak temel Gatekeeper işlevinin güvenli bir ortamda çalışması gerektiğinden genellikle Gatekeeper TA ile iletişim kurar.
  • Gatekeeper Güvenilir Uygulaması (TA): TEE'de çalışan ve asıl şifre veya desen doğrulamasını gerçekleştiren, tedarikçiye özel bir uygulama.

LockSettingsService, Android OS'teki gatekeeperd arka plan programına ulaşan bir istekte bulunur (Binder aracılığıyla). gatekeeperd arka plan programı, IGatekeeper HAL hizmetinden istekte bulunur. Bu hizmet de TEE'deki karşılığı olan Gatekeeper TA'ya ulaşır:

Geçit bekçisi akışı

Şekil 1. GateKeeper tarafından kimlik doğrulama için üst düzey veri akışı.

gatekeeperd arka plan programı, Android çerçeve API'lerinin HAL'ye erişmesine olanak tanır ve cihaz kimlik doğrulamalarının Keystore'a bildirilmesine katılır. gatekeeperd arka plan programı kendi sürecinde çalışır ve sistem sunucusundan ayrıdır.

HAL uygulaması

gatekeeperd arka plan programı, şifre kimlik doğrulaması için temel Gatekeeper TA ile etkileşim kurmak üzere IGatekeeper HAL'yi kullanır. Gatekeeper TA uygulaması, blob'ları imzalayabilmeli (kaydedebilmeli) ve doğrulayabilmelidir. Tüm uygulamaların, her başarılı şifre doğrulamasında oluşturulan kimlik doğrulama jetonunun (HardwareAuthToken) standart biçimine uyması beklenir. HardwareAuthToken öğesinin içeriği ve semantiği hakkında ayrıntılı bilgi için HardwareAuthToken.aidl tanımına bakın.

IGatekeeper HAL'nin tedarikçi firma uygulamaları, enroll ve verify işlevlerini uygulamalıdır:

  • enroll yöntemi, bir şifre blob'u alır, imzalar ve imzayı bir tutma yeri olarak döndürür. Döndürülen blob (enroll çağrısından) system/gatekeeper/include/gatekeeper/password_handle.h içinde 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 tutma yeriyle eşleştiğinden emin olmalıdır.

Kayıt ve doğrulama için kullanılan anahtar hiçbir zaman değişmemeli ve her cihaz başlatıldığında yeniden türetilebilmelidir.

Trusty ve diğer uygulamalar

Trusty işletim sistemi, Google'ın TEE ortamları için geliştirdiği açık kaynaklı güvenilir işletim sistemidir ve Gatekeeper'ın onaylı bir uygulamasını içerir. Ancak TEE'nin kalıcı bir donanım tabanlı anahtara ve bekleme modunda çalışan güvenli, monoton bir saate erişimi olduğu sürece herhangi bir TEE OS, Gatekeeper'ı uygulayabilir.

Trusty, paylaşılan bir gizli anahtarı doğrudan KeyMint (eski adıyla Keymaster) 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ğrulama onayı sağlamak için Keystore'a gönderilen kimlik doğrulama jetonlarını imzalamak amacıyla kullanılır. Trusty Gatekeeper, her kullanım için KeyMint'ten anahtarı ister ve değeri kalıcı olarak saklamaz veya önbelleğe almaz. Uygulamalar, bu gizli anahtarı güvenliği tehlikeye atmayacak şekilde paylaşabilir.

Şifreleri kaydetmek 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 özel 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 içindeki işlevlere ve yorumlara bakın. Uyumlu bir uygulamanın temel sorumlulukları şunlardır:

  • IGatekeeper HAL'ye uygunluk.
  • Döndürülen kimlik doğrulama jetonları, HardwareAuthToken spesifikasyonuna (HardwareAuthToken.aidl bölümünde açıklanmıştır) göre biçimlendirilmelidir.
  • TEE Gatekeeper, aşağıdakilerden birini kullanarak KeyMint ile bir HMAC anahtarı paylaşabilmelidir:
    • Paylaşılan gizli anahtar sözleşmesi: Gatekeeper, ISharedSecret HAL'yi uygulayarak HMAC anahtarının her başlatma işleminde yapılan anlaşmasına katılabilir. Bunun için Gatekeeper ve KeyMint'in ortak bir önceden paylaşılan gizli anahtara erişimi olması gerekir.
    • Doğrudan erişim: Gatekeeper, TEE'ye özel işlemler arası iletişim mekanizması kullanarak HMAC anahtarını KeyMint'ten isteğe bağlı olarak veya ilk kullanımda (sonrasında önbelleğe alınır) alabilir.

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, bir kullanıcı önceki şifreyi girmeden yeni bir şifre kaydettiğinde kriptografik sözde rastgele sayı üreteci (PRNG) ile oluşturulur. Bu, güvenilmeyen yeniden kayıt olarak bilinir ve normalde yalnızca kullanıcı ilk kez şifre veya desen ayarladığında gerçekleşir.

Güvenilir yeniden kayıt, kullanıcı geçerli bir önceki şifreyi girdiğinde (ör. şifre değiştirirken) gerçekleşir. Bu durumda, kullanıcı SID'si yeni şifre tanıtıcısına taşınır ve bağlı olduğu anahtarlar korunur.

Şifre kaydedildiğinde kullanıcı SID'si, şifre tutamağındaki şifreyle birlikte HMAC kimlik doğrulamasına dahil edilir.

Kullanıcı SID'leri, verify() işlevi tarafından döndürülen HardwareAuthToken içinde yer alır ve kimlik doğrulamaya 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ı, söz konusu şifreye bağlı anahtarları kullanılamaz hale getirir. Saldırganlar Android OS'i kontrol ederlerse cihazın şifresini değiştirebilirler ancak bu işlem sırasında kök korumalı hassas anahtarları imha ederler.

İstek kısıtlama

Gatekeeper, bir kullanıcı kimlik bilgisine yönelik kaba kuvvet saldırısı girişimlerini güvenli bir şekilde kısıtlayabilmelidir. GatekeeperVerifyResponse.aidl bölümünde gösterildiği gibi HAL, milisaniye cinsinden bir zaman aşımı döndürür. Zaman aşımı, istemciye zaman aşımı süresi dolana kadar Gatekeeper'ı tekrar çağırmamasını bildirir. Bekleyen bir zaman aşımı varsa Gatekeeper istekleri karşılamamalıdır.

Gatekeeper, kullanıcı şifresini doğrulamadan önce bir başarısızlık sayacı yazmalıdır. Şifre doğrulama başarılı olursa başarısızlık sayacı temizlenmelidir. Bu, verify çağrısı yaptıktan sonra yerleşik MMC'yi (eMMC) devre dışı bırakarak kısıtlamayı engelleyen saldırıları önler. enroll işlevi, kullanıcı şifresini de (sağlanmışsa) doğrular ve aynı şekilde kısıtlanmalıdır.

Cihaz tarafından destekleniyorsa hata sayacı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 Korumalı Bellek Bloğu'nu (RPMB) kullanabilir.