Weryfikacja podczas uruchamiania wymaga weryfikacji kryptograficznej całego kodu wykonywalnego i danych, które są częścią wersji Androida uruchamianej przed użyciem. Obejmuje to jądro (ładowane z partycji boot), drzewo urządzenia (ładowane z partycji dtbo), partycję system, partycję vendor itd.
Małe partycje, takie jak boot i dtbo, które są odczytywane tylko raz, są zwykle weryfikowane przez wczytanie całej zawartości do pamięci, a następnie obliczenie jej skrótu. Obliczona wartość skrótu jest następnie porównywana z oczekiwaną wartością skrótu. Jeśli wartość się nie zgadza, Android się nie wczyta.
Więcej informacji znajdziesz w artykule Proces uruchamiania.
Większe partycje, które nie mieszczą się w pamięci (np. systemy plików), mogą używać drzewa skrótów, w którym weryfikacja jest ciągłym procesem, który odbywa się podczas wczytywania danych do pamięci. W tym przypadku korzeń drzewa skrótów jest obliczany w czasie wykonywania działania i porównywany z oczekiwaną wartością skrótu głównego. Android zawiera sterownik dm-verity, który weryfikuje większe partycje. Jeśli w jakimś momencie obliczony korzeń skrótów nie będzie zgodny z oczekiwaną wartością korzenia skrótów, dane nie zostaną użyte, a Android przejdzie w stan błędu. Więcej informacji znajdziesz w artykule Uszkodzenie pliku dm-verity.
Oczekiwane wartości hasz są zwykle przechowywane na końcu lub na początku każdej zweryfikowanej partycji, w dedykowanej partycji lub w obu tych miejscach. Co ważne, te wartości są podpisane (bezpośrednio lub pośrednio) przez zaufanego głównego urzędu certyfikacji. Na przykład implementacja AVB obsługuje oba podejścia. Więcej informacji znajdziesz w artykule Weryfikacja podczas uruchamiania na Androidzie.
Ochrona przed cofnięciem
Nawet w przypadku całkowicie bezpiecznego procesu aktualizacji możliwe jest, że nieutrwalony exploit jądra Androida ręcznie zainstaluje starszą, bardziej podatną na ataki wersję Androida, uruchomi ją, a następnie użyje jej do zainstalowania trwałego exploita. W ten sposób atakujący na stałe przejmuje kontrolę nad urządzeniem i może robić wszystko, w tym wyłączyć aktualizacje.
Ochrona przed tego typu atakami nazywa się ochroną przed cofnięciem. Ochrona przed cofnięciem jest zwykle implementowana przez użycie pamięci odpornej na manipulacje do zapisania najnowszej wersji Androida i odmowę uruchomienia Androida, jeśli jest on starszy niż zapisana wersja. Wersje są zwykle śledzone na poziomie partycji.
Więcej informacji o tym, jak AVB obsługuje ochronę przed cofnięciem, znajdziesz w pliku AVB README.
Obsługa błędów weryfikacji
Weryfikacja może się nie udać podczas uruchamiania (np. gdy obliczony hasz na partycji boot nie pasuje do oczekiwanego hasza) lub w czasie działania (np. gdy dm-verity napotka błąd weryfikacji na partycji system). Jeśli weryfikacja nie powiedzie się podczas uruchamiania, urządzenie nie uruchomi się, a użytkownik będzie musiał wykonać czynności mające na celu przywrócenie urządzenia do działania.
Jeśli weryfikacja nie powiedzie się w czasie działania, proces będzie nieco bardziej skomplikowany. Jeśli urządzenie korzysta z dm-verity, powinno być skonfigurowane w trybie restart. W trybie restart, jeśli wystąpi błąd weryfikacji, urządzenie zostanie natychmiast ponownie uruchomione z określoną flagą wskazującą przyczynę. Bootloader powinien zauważyć tę flagę, przełączyć dm-verity na tryb błędu I/O (eio) i pozostać w tym trybie do momentu zainstalowania nowej aktualizacji.
Podczas uruchamiania w trybie eio na urządzeniu wyświetla się ekran błędu informujący użytkownika o wykryciu uszkodzenia i o tym, że urządzenie może nie działać prawidłowo. Ekran jest wyświetlany do momentu, aż użytkownik go zamknie. W trybie eio sterownik dm-verity nie uruchomi ponownie urządzenia, jeśli wystąpi błąd weryfikacji. Zamiast tego zwracany jest błąd EIO, a aplikacja musi sobie z nim poradzić.
Celem jest uruchomienie narzędzia do aktualizacji systemu (aby można było zainstalować nowy system operacyjny bez błędów uszkodzenia) lub umożliwienie użytkownikowi skopiowania z urządzenia jak największej ilości danych. Po zainstalowaniu nowego systemu operacyjnego bootloader zauważy nowo zainstalowany system operacyjny i przełączy się z powrotem na tryb restart.