Weryfikacja rozruchu

Zweryfikowany rozruch wymaga kryptograficznej weryfikacji całego kodu wykonywalnego i danych wchodzących w skład uruchamianej wersji Androida przed jej użyciem. Obejmuje to jądro (ładowane z partycji boot ), drzewo urządzeń (ładowane z partycji dtbo ), partycję system , partycję vendor i tak dalej.

Małe partycje, takie jak boot i dtbo , które są odczytywane tylko raz, są zazwyczaj weryfikowane poprzez załadowanie 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ść nie jest zgodna, Android nie zostanie załadowany. Aby uzyskać więcej informacji, zobacz Przepływ rozruchu .

Większe partycje, które nie mieszczą się w pamięci (takie jak systemy plików), mogą używać drzewa skrótów, gdzie weryfikacja jest procesem ciągłym zachodzącym podczas ładowania danych do pamięci. W tym przypadku skrót główny drzewa mieszającego jest obliczany w czasie wykonywania i porównywany z oczekiwaną wartością skrótu głównego . Android zawiera sterownik dm-verity umożliwiający weryfikację większych partycji. Jeśli w pewnym momencie obliczony skrót główny nie będzie zgodny z oczekiwaną wartością skrótu głównego , dane nie zostaną użyte, a system Android przejdzie w stan błędu. Aby uzyskać więcej informacji, zobacz korupcja dm-verity .

Oczekiwane skróty są zazwyczaj przechowywane na końcu lub na początku każdej zweryfikowanej partycji, w dedykowanej partycji lub na obu. Co najważniejsze, te skróty są podpisane (bezpośrednio lub pośrednio) przez katalog główny zaufania. Na przykład implementacja AVB obsługuje oba podejścia. Aby uzyskać szczegółowe informacje, zobacz Android Verified Boot .

Zabezpieczenie przed cofnięciem

Nawet przy całkowicie bezpiecznym procesie aktualizacji nietrwały exploit jądra Androida może ręcznie zainstalować starszą, bardziej podatną na ataki wersję Androida, ponownie uruchomić system do wersji podatnej na ataki, a następnie użyć tej wersji Androida do zainstalowania trwałego exploita. Od tego momentu osoba atakująca jest na stałe właścicielem urządzenia i może zrobić wszystko, łącznie z wyłączeniem aktualizacji.

Ochrona przed tą klasą ataków nosi nazwę Rollback Protection . Zabezpieczenie przed wycofywaniem zmian jest zwykle wdrażane poprzez wykorzystanie pamięci umożliwiającej stwierdzenie manipulacji w celu zarejestrowania najnowszej wersji systemu Android i odmowę uruchomienia systemu Android, jeśli jest ona niższa niż wersja nagrana. Wersje są zazwyczaj śledzone dla poszczególnych partycji.

Aby uzyskać więcej informacji na temat sposobu, w jaki AVB obsługuje zabezpieczenia przed wycofywaniem zmian, zobacz AVB README .

Obsługa błędów weryfikacji

Weryfikacja może zakończyć się niepowodzeniem podczas rozruchu (np. jeśli obliczony skrót na partycji boot nie pasuje do oczekiwanego skrótu) lub w czasie wykonywania (np. jeśli dm-verity napotka błąd weryfikacji na partycji system ). Jeśli weryfikacja nie powiedzie się podczas uruchamiania, urządzenia nie można uruchomić, a użytkownik końcowy musi wykonać odpowiednie kroki, aby odzyskać urządzenie.

Jeśli weryfikacja nie powiedzie się w czasie wykonywania, przepływ jest nieco bardziej skomplikowany. Jeśli urządzenie korzysta z dm-verity, należy je skonfigurować w trybie restart . W trybie restart , jeśli napotkany zostanie błąd weryfikacji, urządzenie zostanie natychmiast uruchomione ponownie z ustawioną flagą wskazującą przyczynę. Program ładujący powinien zauważyć tę flagę i przełączyć dm-verity na tryb błędu we/wy ( eio ) i pozostać w tym trybie do czasu zainstalowania nowej aktualizacji.

Podczas uruchamiania w trybie eio urządzenie wyświetla ekran błędu informujący użytkownika, że ​​wykryto uszkodzenie i urządzenie może nie działać poprawnie. Ekran będzie wyświetlany, dopóki użytkownik go nie odrzuci. W trybie eio sterownik dm-verity nie uruchomi ponownie urządzenia w przypadku napotkania błędu weryfikacji, zamiast tego zwracany jest błąd EIO i aplikacja musi sobie z nim poradzić.

Celem jest uruchomienie aktualizatora systemu (aby można było zainstalować nowy system operacyjny bez błędów związanych z uszkodzeniem) lub umożliwienie użytkownikowi uzyskania jak największej ilości danych z urządzenia. Po zainstalowaniu nowego systemu operacyjnego moduł ładujący wykrywa nowo zainstalowany system operacyjny i przełącza się z powrotem do trybu restart .