Android wykorzystuje koncepcję kluczy kryptograficznych bramkowanych przez uwierzytelnianie użytkownika, które wymagają następujących komponentów:
- Dostawca usług przechowywania i przechowywania kluczy kryptograficznych. Przechowuje klucze kryptograficzne i zapewnia standardowe procedury kryptograficzne na podstawie tych kluczy. System Android obsługuje sprzętowy magazyn kluczy i Keymaster do usług kryptograficznych, w tym sprzętową kryptografię do przechowywania kluczy, która może obejmować zaufane środowisko wykonawcze (TEE) lub bezpieczny element (SE), taki jak Strongbox.
- Uwierzytelniacze użytkownika. Potwierdź obecność użytkownika i/lub pomyślne uwierzytelnienie. Android obsługuje funkcję Gatekeeper do uwierzytelniania za pomocą kodu PIN/wzoru/hasła oraz czytnika linii papilarnych do uwierzytelniania odcisków palców. Urządzenia dostarczane z systemem Android 9 i nowszym mogą używać
BiometricPrompt
jako pojedynczego punktu integracji odcisków palców i dodatkowych danych biometrycznych. Komponenty te komunikują swój stan uwierzytelnienia z usługą magazynu kluczy za pośrednictwem uwierzytelnionego kanału. ( System Android Keystore na poziomie frameworka jest również wspierany przez usługę magazynu kluczy.)
Komponenty Gatekeeper, Fingerprint i Biometric współpracują z Keystore i innymi komponentami, aby obsługiwać użycie tokenów uwierzytelniających wspieranych sprzętowo (AuthTokens).
Zapisy
Podczas pierwszego uruchomienia urządzenia po przywróceniu ustawień fabrycznych wszystkie uwierzytelniacze są przygotowane na otrzymanie rejestracji poświadczeń od użytkownika. Użytkownik musi najpierw zarejestrować PIN/wzór/hasło w Gatekeeper. Ta wstępna rejestracja tworzy losowo wygenerowany 64-bitowy bezpieczny identyfikator użytkownika (SID), który służy jako identyfikator użytkownika i token wiążący dla materiału kryptograficznego użytkownika. Ten identyfikator SID użytkownika jest kryptograficznie powiązany z hasłem użytkownika; pomyślne uwierzytelnienie w Gatekeeper skutkuje AuthTokens, które zawierają identyfikator SID użytkownika dla tego hasła.
Użytkownik chcący zmienić dane uwierzytelniające musi przedstawić istniejące dane uwierzytelniające. Jeśli istniejące poświadczenie zostanie pomyślnie zweryfikowane, identyfikator SID użytkownika powiązany z istniejącym poświadczeniem zostanie przeniesiony do nowego poświadczenia, umożliwiając użytkownikowi dalszy dostęp do kluczy po zmianie poświadczenia. Jeśli użytkownik nie przedstawi istniejącego poświadczenia, nowe poświadczenie zostanie zarejestrowane z całkowicie losowym identyfikatorem SID użytkownika. Użytkownik może uzyskać dostęp do urządzenia, ale klucze utworzone pod starym identyfikatorem SID użytkownika zostaną trwale utracone. Nazywa się to rejestracją niezaufaną .
W normalnych okolicznościach środowisko Androida nie pozwala na niezaufaną rejestrację, więc większość użytkowników nigdy nie zobaczy tej funkcji. Jednak wymuszone resetowanie hasła dokonane przez administratora urządzenia lub osobę atakującą może spowodować taką sytuację.
Uwierzytelnianie
Gdy użytkownik skonfiguruje poświadczenie i otrzyma identyfikator SID, może rozpocząć uwierzytelnianie, które rozpoczyna się w momencie podania przez użytkownika kodu PIN, wzoru, hasła lub odcisku palca. Wszystkie komponenty TEE mają wspólny tajny klucz, którego używają do wzajemnego uwierzytelniania wiadomości.
- Użytkownik udostępnia metodę uwierzytelniania, a powiązana usługa wysyła żądanie do powiązanego demona.
- Aby uzyskać PIN, wzór lub hasło,
LockSettingsService
wysyła żądanie dogatekeeperd
. - Przepływy uwierzytelniania opartego na danych biometrycznych zależą od wersji Androida. Na urządzeniach z Androidem 8.x i starszym
FingerprintService
wysyła żądaniefingerprintd
). Na urządzeniach z systemem Android 9 i nowszymBiometricPrompt
wysyła żądanie do odpowiedniego demona biometrycznego (na przykładfingerprintd
w przypadku odcisków palców lubfaced
) przy użyciu odpowiedniej klasyBiometric Manager
, takiej jakFingerprintManager
lubFaceManager
. Niezależnie od wersji, uwierzytelnianie biometryczne następuje asynchronicznie po wysłaniu żądania.
- Aby uzyskać PIN, wzór lub hasło,
- Demon wysyła dane do swojego odpowiednika, który generuje AuthToken:
- W celu uwierzytelnienia za pomocą PIN-u/wzoru/hasła,
gatekeeperd
wysyła PIN, wzór lub skrót hasła do Gatekeepera w TEE. Jeśli uwierzytelnienie w TEE zakończy się pomyślnie, Gatekeeper w TEE wysyła AuthToken zawierający odpowiedni identyfikator SID użytkownika (podpisany kluczem AuthToken HMAC) do swojego odpowiednika w systemie operacyjnym Android. - W przypadku uwierzytelniania odcisków palców,
fingerprintd
nasłuchuje zdarzeń odcisków palców i wysyła dane do odcisku palca w TEE. Jeśli uwierzytelnienie w TEE zakończy się pomyślnie, Fingerprint w TEE wysyła AuthToken (podpisany kluczem AuthToken HMAC) do swojego odpowiednika w systemie operacyjnym Android. - W przypadku innego uwierzytelniania biometrycznego odpowiedni demon biometryczny nasłuchuje zdarzenia biometrycznego i wysyła je do odpowiedniego komponentu biometrycznego TEE.
- W celu uwierzytelnienia za pomocą PIN-u/wzoru/hasła,
- Demon odbiera podpisany token AuthToken i przekazuje go do usługi magazynu kluczy poprzez rozszerzenie interfejsu Binder usługi magazynu kluczy. (
gatekeeperd
powiadamia również usługę magazynu kluczy, gdy urządzenie zostanie ponownie zablokowane i gdy zmieni się hasło urządzenia.) - Usługa magazynu kluczy przekazuje tokeny AuthTokens do Keymaster i weryfikuje je przy użyciu klucza udostępnionego Gatekeeperowi i obsługiwanego biometrycznego komponentu TEE. Keymaster traktuje sygnaturę czasową w tokenie jako czas ostatniego uwierzytelnienia i opiera decyzję o wydaniu klucza (aby umożliwić aplikacji użycie klucza) na sygnaturze czasowej.
Format tokenu uwierzytelniania
Aby zapewnić współdzielenie tokenów i zgodność między językami i komponentami, format AuthToken opisano w hw_auth_token.h
. Format to prosty protokół serializacji z polami o stałym rozmiarze.
Pole | Typ | Wymagany | Opis |
---|---|---|---|
Wersja tokena uwierzytelniania | 1 bajt | Tak | Tag grupowy dla wszystkich pól poniżej. |
Wyzwanie | 64-bitowa liczba całkowita bez znaku | NIE | Losowa liczba całkowita zapobiegająca atakom poprzez powtórzenie. Zwykle identyfikator żądanej operacji kryptograficznej. Obecnie używany przez transakcyjne autoryzacje odcisków palców. Jeśli jest obecny, AuthToken jest ważny tylko dla operacji kryptograficznych zawierających to samo wyzwanie. |
Identyfikator użytkownika | 64-bitowa liczba całkowita bez znaku | Tak | Niepowtarzalny identyfikator użytkownika powiązany kryptograficznie ze wszystkimi kluczami związanymi z uwierzytelnianiem urządzenia. Aby uzyskać szczegółowe informacje, zobacz Strażnik . |
Identyfikator uwierzytelniający (ASID) | 64-bitowa liczba całkowita bez znaku w kolejności sieciowej | NIE | Identyfikator używany do powiązania z określoną polityką uwierzytelniającą. Wszystkie uwierzytelniacze mają własną wartość ASID, którą mogą zmieniać zgodnie z własnymi wymaganiami. |
Typ uwierzytelnienia | 32-bitowa liczba całkowita bez znaku w kolejności sieciowej | Tak |
|
Znak czasu | 64-bitowa liczba całkowita bez znaku w kolejności sieciowej | Tak | Czas (w milisekundach) od ostatniego uruchomienia systemu. |
Token uwierzytelniania HMAC (SHA-256) | 256-bitowy obiekt typu blob | Tak | Kluczowy adres MAC SHA-256 dla wszystkich pól z wyjątkiem pola HMAC. |
Przebieg uruchamiania urządzenia
Przy każdym uruchomieniu urządzenia należy wygenerować klucz AuthToken HMAC i udostępnić go wszystkim komponentom TEE (Gatekeeper, Keymaster i obsługiwane zaufane certyfikaty biometryczne). Dlatego też, aby zapewnić dodatkową ochronę przed atakami poprzez powtórzenie, klucz HMAC musi być generowany losowo przy każdym ponownym uruchomieniu urządzenia.
Protokół udostępniania tego klucza HMAC wszystkim komponentom jest funkcją implementacji zależną od platformy. Klucza nie wolno nigdy udostępniać poza TEE. Jeśli system operacyjny TEE nie ma mechanizmu wewnętrznej komunikacji międzyprocesowej (IPC) i musi przesyłać dane przez niezaufany system operacyjny, transfer musi odbywać się za pośrednictwem bezpiecznego protokołu wymiany kluczy.
Przykładem TEE jest system operacyjny Trusty , który działa obok Androida, ale zamiast niego można używać innych TEE. Trusty korzysta z wewnętrznego systemu IPC do bezpośredniej komunikacji pomiędzy Keymasterem a Gatekeeperem lub odpowiednim zaufanym zaufaniem biometrycznym. Klucz HMAC jest przechowywany wyłącznie w Keymaster; Odcisk palca i Gatekeeper żądają klucza od Keymastera przy każdym użyciu i nie utrwalają ani nie buforują wartości.
Ponieważ niektóre TEE nie mają infrastruktury IPC, pomiędzy apletami w TEE nie zachodzi żadna komunikacja. Umożliwia to również usłudze magazynu kluczy szybkie odrzucanie żądań, które są skazane na niepowodzenie, ponieważ posiada ona wiedzę o tabeli uwierzytelniania w systemie, oszczędzając potencjalnie kosztowny IPC w TEE.