W programie Keymaster 1 wszystkie klucze Keymastery były powiązane kryptograficznie z urządzeniem. Źródło zaufania lub klucz zweryfikowany podczas uruchamiania. W Keymasterach 2 i 3 wszystkie są też powiązane z systemem operacyjnym i poziomem poprawek obrazu systemu. Zapewnia to, że atakujący, który odkrywa słabość w starym interfejsie systemu lub oprogramowania TEE nie można przywrócić urządzenia z powrotem i używać kluczy utworzonych w nowszej wersji. Ponadto, gdy klucz z określoną wersją i poziomem poprawek na urządzeniu, które zostało uaktualnione do nowszej wersji lub na poziomie poprawek, klucz jest uaktualniany, zanim będzie można go użyć. a poprzednia wersja klucza została unieważniona. Dzięki temu, gdy urządzenie po uaktualnieniu klucze będą „zawierać się” wraz z urządzeniem, ale każdy przywrócenie na urządzeniu poprzedniej wersji spowoduje, że klucze bezużyteczne.
Aby obsługiwać modułową strukturę Treble i przełamać powiązanie system.img z Boot.img, Keymaster 4 zmienił model wiązania wersji klucza tak, aby wprowadzał oddzielne poziomów poprawek dla każdej partycji. Dzięki temu każda partycja może być zaktualizowana niezależnie od siebie, a jednocześnie zapewnia ochronę przed wycofaniem.
Android 9: boot
, system
i vendor
każda partycja ma własny poziom poprawek.
- Urządzenia z weryfikacją podczas uruchamiania systemu Android (AVB) mogą stosować wszystkie poziomy poprawek
oraz wersję systemu w vbmeta, dzięki czemu program rozruchowy może udostępnić
Mistrz kluczy. W przypadku partycji łańcuchowej informacje o wersji będą
w łańcuchowym vbmeta. Ogólnie informacje o wersji powinny znajdować się w pliku
vbmeta struct
, który zawiera dane weryfikacyjne (zaszyfrowane lub hashtree) danej partycji. - Na urządzeniach bez AVB:
- Implementacje weryfikacji podczas uruchamiania muszą podawać hasz wersji metadanych do programu rozruchowego, tak aby program rozruchowy mógł przekazać hasz do Keymastera.
boot.img
może nadal przechowywać poziom poprawek w nagłówkusystem.img
może nadal przechowywać informacje o poziomie poprawek i wersji systemu operacyjnego w trybie tylko do odczytu usługivendor.img
przechowuje poziom poprawki we właściwości tylko do odczyturo.vendor.build.version.security_patch
- Program rozruchowy może dostarczyć hasz wszystkich danych zweryfikowanych przez weryfikację rozruchu do Keymastera.
- W Androidzie 9 należy używać tych tagów do podawania informacji o wersji
na tych partycjach:
VENDOR_PATCH_LEVEL
:vendor
partycjaBOOT_PATCH_LEVEL
:boot
partycjaOS_PATCH_LEVEL
iOS_VERSION
:system
partycja. (OS_VERSION
został usunięty z w nagłówkuboot.img
.
-
Implementacje Keymaster powinny traktować wszystkie poziomy poprawek niezależnie. Klucze są
użyte, jeśli wszystkie informacje o wersji są zgodne z wartościami powiązanymi z kluczem;
IKeymaster::upgradeDevice()
zmienia poziom na wyższy, jeśli niezbędną.
Zmiany HAL
Aby obsługiwać wiązanie wersji i atestację wersji, w Androidzie 7.1 dodano funkcję
tagi Tag::OS_VERSION
i Tag::OS_PATCHLEVEL
oraz tag
metody configure
i upgradeKey
. Tagi wersji
są automatycznie dodawane przez implementacje Keymaster 2 lub nowsze do wszystkich nowo generowanych
(lub zaktualizowanych). Ponadto każda próba użycia klucza, który nie ma systemu operacyjnego
wersja lub poziom poprawek pasujący do bieżącej wersji systemu operacyjnego lub poziomu poprawek;
jest odrzucana odpowiednio przez ErrorCode::KEY_REQUIRES_UPGRADE
.
Tag::OS_VERSION
to wartość UINT
, która reprezentuje
głównych, podrzędnych i podrzędnych elementach wersji systemu Android w formacie MMMM.
gdzie MM to wersja główna, mm to wersja podrzędna, a ss to wersja podrzędna.
wersji. Na przykład adres 6.1.2 będzie zapisany jako 060102.
Tag::OS_PATCHLEVEL
to wartość UINT
, która reprezentuje
rok i miesiąc ostatniej aktualizacji systemu w formacie RRRRMM, gdzie RRRR oznacza
czterocyfrowym rokiem, a MM oznacza miesiącem. Na przykład marzec 2016 r. będzie wyglądał tak:
w postaci 201603.
Klucz uaktualniania
Aby umożliwić uaktualnianie kluczy do nowej wersji systemu operacyjnego i poziomu poprawek systemu
, Android 7.1 dodał metodę upgradeKey
do listy HAL:
Keymaster 3
upgradeKey(vec keyBlobToUpgrade, vec upgradeParams) generates(ErrorCode error, vec upgradedKeyBlob);
Keymaster 2
keymaster_error_t (*upgrade_key)(const struct keymaster2_device* dev, const keymaster_key_blob_t* key_to_upgrade, const keymaster_key_param_set_t* upgrade_params, keymaster_key_blob_t* upgraded_key);
dev
to struktura urządzeniakeyBlobToUpgrade
to klucz, który należy uaktualnićupgradeParams
to parametry niezbędne do uaktualnienia klucza. Te będą obejmowaćTag::APPLICATION_ID
iTag::APPLICATION_DATA
, które są niezbędne do odszyfrowania klucza. blob, jeśli zostały dostarczone podczas generowania.upgradedKeyBlob
to parametr wyjściowy używany do zwracania nowego klucza blob.
Jeśli funkcja upgradeKey
jest wywoływana za pomocą klucza blob, którego nie można przeanalizować, lub
jest nieprawidłowy, zwraca wartość ErrorCode::INVALID_KEY_BLOB
. Jeśli
jest wywoływana za pomocą klucza, którego poziom poprawki jest większy niż bieżąca wartość systemowa,
zwraca ErrorCode::INVALID_ARGUMENT
. Jeśli jest wywoływane za pomocą klucza
której wersja systemu operacyjnego jest nowsza niż bieżąca wartość systemowa oraz wartość systemowa
ma wartość inną niż zero, zwraca ErrorCode::INVALID_ARGUMENT
. Wersja systemu operacyjnego
uaktualnienia z wartości innej niż 0 do 0 są dozwolone. W przypadku błędów
komunikuje się z bezpiecznym światem, zwraca odpowiednią wartość błędu (np.
ErrorCode::SECURE_HW_ACCESS_DENIED
,
ErrorCode::SECURE_HW_BUSY
). W przeciwnym razie zwraca
ErrorCode::OK
i zwraca nowy klucz blob w
upgradedKeyBlob
keyBlobToUpgrade
pozostaje ważny po upgradeKey
i teoretycznie można go użyć ponownie po przejściu na starszą wersję. W
ćwiczenie, magazyn kluczy zwykle wywołuje deleteKey
na
keyBlobToUpgrade
blob wkrótce po wywołaniu
upgradeKey
Jeśli keyBlobToUpgrade
miał(a) tag
Tag::ROLLBACK_RESISTANT
, a potem upgradedKeyBlob
powinny
i powinny być odporne na wycofanie.
Bezpieczna konfiguracja
Aby można było wdrożyć wiązanie wersji, asystent pomocy technicznej klucza musi mieć sposób bezpiecznego odbierania obecną wersję systemu operacyjnego i poziom poprawek (informacje o wersji) oraz upewnij się, że otrzymywane informacje są silnie zgodne z informacjami o uruchamianiu systemu.
Aby zapewnić bezpieczne przesyłanie informacji o wersji do doradcy klienta, OS_VERSION
Pole zostało dodane do nagłówka obrazu rozruchowego. Kompilacja obrazu rozruchowego
skrypt automatycznie wypełnia to pole. OEM i specjaliści ds. wdrażania rozwiązań technicznych
muszą współpracować przy modyfikacji programów rozruchowych urządzenia w celu wyodrębnienia wersji
z obrazu rozruchowego i przekazać je do asystenta przed niezabezpieczonym
jest uruchamiany. Dzięki temu osoby przeprowadzające atak nie będą mogły zakłócać obsługi administracyjnej
i przekazywaniu informacji o wersji.
Trzeba też dopilnować, aby obraz systemu miał tę samą wersję jako obrazu rozruchowego. W związku z tym dodaliśmy metodę konfigurowania do klucza HAL:
keymaster_error_t (*configure)(const struct keymaster2_device* dev, const keymaster_key_param_set_t* params);
Argument params
zawiera Tag::OS_VERSION
i
Tag::OS_PATCHLEVEL
Ta metoda jest wywoływana przez klienty keymaster2
po otwarciu listy HAL, ale przed wywołaniem jakichkolwiek innych metod. Jeśli jakakolwiek inna metoda
jest wywoływana przed konfiguracją, funkcja TA zwraca
ErrorCode::KEYMASTER_NOT_CONFIGURED
Przy pierwszym wywołaniu funkcji configure
po uruchomieniu urządzenia
powinien sprawdzić, czy podane informacje o wersji są zgodne z informacjami podanymi przez
programu rozruchowego. Jeśli informacje o wersji nie są zgodne,
configure
zwraca wartość ErrorCode::INVALID_ARGUMENT
i wszystkie
inne metody Keymaster są nadal zwracane
ErrorCode::KEYMASTER_NOT_CONFIGURED
Jeśli informacje będą się zgadzać,
configure
zwraca wartość ErrorCode::OK
i inną kombinację kluczy
zaczynają działać normalnie.
Kolejne wywołania funkcji configure
zwracają tę samą wartość zwracaną przez funkcję
bez zmiany stanu klucza Keymaster. Pamiętaj, że ten proces
wymaga, aby wszystkie aktualizacje OTA aktualizowały zarówno obraz systemu, jak i obrazu rozruchowego; Nie można ich zaktualizować
oddzielnie, aby aktualizować informacje o wersji.
Ponieważ system, w której znajduje się zawartość, zostanie wywołany przez system configure
ma na celu zweryfikowanie, że atakujący ma ograniczone możliwości,
zostały naruszone w obrazie systemu i wymusić na nim dostarczenie informacji o wersji,
pasuje do obrazu rozruchowego, ale nie jest to rzeczywista wersja systemu.
połączenie weryfikacji obrazu rozruchowego i weryfikacji DM-verity obrazu systemu
oraz fakt, że configure
jest wywoływany bardzo wcześnie
system uruchamiania systemu powinien utrudnić wykorzystanie tego okna możliwości.