Wprowadzona w Androidzie 8.1 warstwa abstrakcji sprzętowej (HAL) Weaver (IWeaver.aidl) zapewnia bezpieczny interfejs do uwierzytelniania użytkowników za pomocą czynnika wiedzy o ekranie blokady (LSKF), takiego jak kod PIN, wzór lub hasło.
Weaver zastępuje funkcję weryfikacji LSKF w Gatekeeperze. Gatekeeper jest jednak nadal używany do generowania tokenów uwierzytelniania sprzętowego.
W Androidzie 9 i nowszych wersjach, CDD 9.11.2 wymaga, aby urządzenia obsługujące StrongBox miały dedykowany bezpieczny sprzęt, który obsługuje bezpieczne uwierzytelnianie użytkowników. Wdrożenie HAL Weaver przy użyciu tego bezpiecznego sprzętu spełnia wymaganie „bezpiecznego uwierzytelniania użytkowników”.
Na urządzeniach bez dedykowanego bezpiecznego elementu (SE), Weaver można nadal implementować w zaufanym środowisku wykonawczym (TEE), takim jak Trusty.
Komponenty
Weaver składa się z 3 komponentów:
- Interfejs Weaver AIDL (
IWeaver): formalna specyfikacja HAL. W Androidzie 13 i starszych wersjach zamiast AIDL używano HIDL. - Usługa warstwy abstrakcji sprzętowej (HAL) Weaver:
proces Androida specyficzny dla dostawcy, który implementuje
IWeaverinterfejs. - Zaufana aplikacja Weaver (TA): Podstawowa logika działająca w bezpiecznym środowisku. Przeprowadza weryfikację LSKF i wymusza ograniczenie szybkości. Usługa HAL komunikuje się z TA za pomocą bezpiecznego kanału specyficznego dla implementacji.
Interfejs
Interfejs Weavera to tablica o stałym rozmiarze zawierająca trwałe sloty, z których każdy zawiera klucz i wartość o stałym rozmiarze. Każdy slot jest identyfikowany przez
swój identyfikator, czyli liczbę całkowitą z przedziału [0, numSlots - 1]. Wartość slotu jest dostępna tylko wtedy, gdy podany klucz pasuje do zapisanego klucza.
Interfejs Weavera składa się z tych elementów:
getConfig(): pobiera liczbę slotów, rozmiar klucza i rozmiar wartości obsługiwane przez implementację.write(): zastępuje określony slot nową parą klucz-wartość. Ta operacja jest niepodzielna i sprawia, że poprzednie dane są trwale nieodzyskiwalne (bezpieczne usunięcie).read(): próbuje pobrać wartość określonego slotu. Ta operacja się powiedzie tylko wtedy, gdy nie jest aktywny limit czasu ograniczenia szybkości (wymuszany przez TA) nie jest aktywny, a podany klucz dokładnie pasuje do zapisanego klucza.
Pełną specyfikację interfejsu znajdziesz w pliku
IWeaver.aidl.
Użycie w Androidzie
Gdy dostępna jest implementacja Weavera, LockSettingsService na serwerze systemu Android używa jej do ochrony danych użytkownika. W przypadku każdego użytkownika na urządzeniu LockSettingsService zarządza slotem Weavera:
- Klucz slotu (
weaverKey): skrót LSKF użytkownika. Jeśli użytkownik nie ma blokady ekranu, używany jest ciąg domyślny. - Wartość slotu (
weaverSecret): losowo wygenerowany sekret kryptograficzny o wysokiej entropii.
Wartość weaverSecret można pobrać tylko w jeden z tych sposobów:
- Podanie prawidłowego
weaverKeydo TA Weavera w ramach jego zasad ograniczenia szybkości. - Naruszanie bezpieczeństwa środowiska, w którym działa TA Weavera. Ma to być bardzo trudne.
LockSettingsService używa zarówno klucza weaverKey, jak i wartości weaverSecret do szyfrowania syntetycznego hasła użytkownika. Ponieważ
syntetyczne hasło chroni zaszyfrowany za pomocą klucza poświadczeń (CE) magazyn użytkownika na potrzeby
szyfrowania opartego na plikach (FBE)
oraz
klucze powiązane z uwierzytelnianiem użytkownika w magazynie kluczy Androida,
dane pozostają niedostępne, dopóki Weaver nie udostępni sekretu.
Weaver a Gatekeeper
W przeszłości
HAL Gatekeepera
pełnił 2 odrębne role w ramach jednego wywołania verify():
- Weryfikacja: sprawdzanie LSKF z ograniczeniem szybkości wymuszanym przez TEE.
- Atestowanie: wydawanie tokena
HardwareAuthTokenw celu powiadomienia KeyMint (wcześniej Keymaster), że uwierzytelnianie LSKF się powiodło.
Dlaczego przechodzimy na Weavera?
Wraz z wprowadzeniem bezpiecznych
tokenów resetowania hasła w Androidzie 8.1 „syntetyczne hasło” stało się
głównym sekretem kryptograficznym. Obie opisane powyżej role są teraz obsługiwane przez
oddzielne rejestracje Gatekeepera – jedną dla LSKF pod adresem userId + 100000
i jedną dla syntetycznego hasła pod adresem userId.
Weaver został wprowadzony, aby przejąć pierwszą rolę, używając prostszego interfejsu HAL z obsługą implementacji opartych na bezpiecznym elemencie (SE).
| Funkcja | Weaver | Gatekeeper |
|---|---|---|
| Bezpieczne usuwanie | Bezpieczne usuwanie jest wymagane i łatwe do wdrożenia, ponieważ interfejs używa stałej liczby slotów o stałym rozmiarze. | Bezpieczne usuwanie nie jest wymagane i jest trudne do wdrożenia ponieważ interfejs obsługuje nieograniczoną liczbę rejestracji. |
| Sprzęt | Zoptymalizowany pod kątem SE, ale działa też w TEE. | Działa tylko w TEE. Wdrożenie go w SE nie zapewnia korzyści w zakresie bezpieczeństwa w obecnej wersji. |
| Obsługa błędów | Bardziej przejrzyste kody błędów | Niejednoznaczne kody błędów. W rezultacie ekran blokady nie rozróżnia nieprawidłowych LSKF od niezwiązanych z nimi awarii. |
| Niepodzielność | Kod w LockSettingsService, który używa Weavera, wykonuje
zmiany LSKF niepodzielnie. Nowe dane są zapisywane w nowym slocie Weavera, a
stary slot jest usuwany tylko wtedy, gdy jest to bezpieczne. |
Kod w LockSettingsService, który używa Gatekeepera
, nie wykonuje zmian LSKF niepodzielnie. Jeśli podczas zmiany LSKF wystąpi problem, wszystkie dane użytkownika mogą zostać utracone. |
Kod referencyjny
Kod referencyjny implementacji Weavera w bezpiecznych elementach zgodnych z ISO/IEC7816-4 jest dostępny w AOSP:
external/libese/.
Testowanie
Aby sprawdzić implementację Weavera, użyj
VtsHalWeaverTargetTest:
atest VtsHalWeaverTargetTest
lub:
vts-tradefed run vts -m VtsHalWeaverTargetTest