Weryfikacja podczas uruchamiania

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 bootdtbo, które są odczytywane tylko raz, są zwykle weryfikowane przez załadowanie całej zawartości do pamięci, a następnie obliczenie jej wartości hash. Obliczona wartość skrótu jest następnie porównywana z oczekiwaną wartością skrótu. Jeśli wartość nie będzie się zgadzać, Android nie zostanie załadowany. 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 ręczne zainstalowanie starszej, bardziej podatnej na ataki wersji Androida za pomocą nieutrwalonego exploita jądra Androida, ponowne uruchomienie urządzenia w tej wersji, a następnie użycie jej do zainstalowania trwałego exploita. W ten sposób atakujący uzyskuje trwałą kontrolę nad urządzeniem i może robić wszystko, w tym wyłączać aktualizacje.

Ochrona przed tego typu atakami nosi nazwę Rollback Protection (Ochrona przed wycofaniem). Ochrona przed wycofaniem jest zwykle realizowana 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 w przypadku poszczególnych partycji.

Więcej informacji o tym, jak AVB obsługuje ochronę przed wycofaniem, znajdziesz w pliku README dotyczącym AVB.

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 z informacją, że wykryto uszkodzenie i urządzenie może nie działać prawidłowo. Ekran będzie wyświetlany, dopóki użytkownik go nie 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 przeniesienia z urządzenia jak największej ilości danych. Po zainstalowaniu nowego systemu operacyjnego program rozruchowy wykrywa nowo zainstalowany system operacyjny i przełącza się z powrotem do trybu restart.