Wznawianie po ponownym uruchomieniu

W Androidzie 11 aktualizacje OTA można stosować przy użyciu aktualizacji A/B. lub wirtualnej aktualizacji A/B w połączeniu z przy użyciu systemu RecoverySystem i metod klas. Gdy urządzenie zrestartuje się i zainstaluje aktualizację OTA, Funkcja wznawiania przy ponownym uruchomieniu (RoR) odblokowuje pamięć szyfrowaną za pomocą danych uwierzytelniających (CE).

Partnerzy mogą połączyć ten proces z funkcją systemu OTA, która ma zastosowanie jest aktualizowany, gdy urządzenie z Androidem 11 jest bezczynne, w Partnerzy Androida 12 nie potrzebują dodatkowego systemu OTA funkcji. Proces RoR zapewnia użytkownikom dodatkowe bezpieczeństwo i wygodę, ponieważ aktualizacje można wprowadzać w czasie bezczynności urządzenia, a Android 12 funkcje aktualizacji bazujące na serwerze i multiklientach pozwalają na poziomie sprzętowym.

chociaż musisz udzielić zgody na korzystanie z urządzenia android.hardware.reboot_escrow obsługuje RoR w Androidzie 11, nie musisz tego robić, oparte na serwerach RoR w Androidzie 12 i nowszych, ponieważ nie używaj HAL.

Tło

Począwszy od Androida 7, bezpośredni rozruch obsługiwany przez Androida, który umożliwia uruchamianie aplikacji na urządzeniu przed odblokowaniem pamięci CE przez użytkownika. Wdrożenie funkcji bezpośredniego rozruchu zapewniło użytkownikom przed podaniem współczynnika wiedzy na ekranie blokady (LSKF). po rozruchu.

dyrektywa RoR umożliwia odblokowanie pamięci CE wszystkich aplikacji na urządzeniu, w tym tych, które nie obsługują bezpośredniego rozruchu, po zainicjowaniu ponownego uruchomienia po aktualizacja OTA. Funkcja ta umożliwia użytkownikom otrzymywanie powiadomień ze wszystkich swoich zainstalowane aplikacje, po ponownym uruchomieniu.

Model zagrożeń

Implementacja RoR musi zagwarantować, że w razie ataku urządzenia będzie bardzo trudno odzyskać kod CE. zaszyfrowanych danych, nawet jeśli urządzenie jest włączone, pamięć CE jest odblokowana; urządzenie jest odblokowane przez użytkownika po otrzymaniu aktualizacji OTA. Zespół wewnętrzny odporność na atak musi być skuteczna, nawet jeśli atakujący uzyska dostęp do przesyłanie kryptograficznych kluczy podpisywania.

W szczególności pamięć CE nie może być odczytywana przez osobę przeprowadzającą atak, która fizycznie oraz ma te możliwości i ograniczenia:

Potencjał

  • Może podpisywać dowolne wiadomości kluczem podpisywania dowolnego dostawcy lub firmy.
  • Może powodować otrzymywanie aktualizacji OTA.
  • Mogą modyfikować działanie dowolnego sprzętu (takiego jak procesor aplikacji, lub pamięci flash) z wyjątkiem przypadków opisanych w Ograniczenia poniżej. (Taka modyfikacja wiąże się jednak zarówno z opóźnieniem co najmniej godzinnym, jak i cykl zasilania, który niszczy zawartość pamięci RAM).

Ograniczenia

  • Nie mogą zmienić działania sprzętu odpornego na manipulacje (np. Titan M).
  • Nie można odczytać pamięci RAM aktywnego urządzenia.
  • nie są w stanie odgadnąć danych logowania użytkownika (kodu PIN, wzoru, hasła) ani z innych powodów ich dane.

Rozwiązanie

System aktualizacji Androida 12 RoR zapewnia bezpieczeństwo przed bardzo zaawansowanymi atakami. Czyli tylko hasła na urządzeniu Kody PIN pozostają na urządzeniu – nigdy nie są wysyłane na serwery Google ani na nich przechowywane. Ten Omówienie procesu, który zapewnia poziom zabezpieczeń podobny do sprzętowego systemu RoR na poziomie urządzenia:

  • Android stosuje zabezpieczenia kryptograficzne do danych przechowywanych na urządzeniu.
  • Wszystkie dane są chronione przez klucze przechowywane w zaufanym środowisku wykonawczym (TEE).
  • TEE zwalnia klucze tylko wtedy, gdy uruchomiony system operacyjny spełnia wymagania uwierzytelnianie kryptograficzne (weryfikacja podczas uruchamiania).
  • Usługa RoR działająca na serwerach Google zabezpiecza dane CE przez przechowywanie obiektu tajnego które można pobrać tylko przez ograniczony czas. Działa to w całym ekosystemie Androida.
  • Do odblokowywania urządzenia używany jest klucz kryptograficzny chroniony kodem PIN użytkownika i odszyfrować pamięć CE.
    • Gdy zaplanowano ponowne uruchomienie w nocy, Android prosi użytkownika o wprowadzenie dla kodu PIN, a następnie oblicza hasło syntetyczne (SP).
    • Następnie dwa razy szyfruje dostawcę usług: raz za pomocą klucza K_s zapisanego w pamięci RAM i ponownie za pomocą klucza K_s z kluczem K_k zapisanym w TEE.
    • Podwójnie szyfrowany dostawca usług jest przechowywany na dysku, który jest usuwany z pamięci RAM. Oba klucze są generowane na bieżąco i służą tylko do jednego restartu.
  • Przy ponownym uruchomieniu Android powierza K_s serwerowi. Paragon z danymi K_k są szyfrowane przed zapisaniem ich na dysku.
  • Po ponownym uruchomieniu Android odszyfrowuje potwierdzenie za pomocą K_k, a następnie wysyła je na serwer, który będzie pobierać K_s.
    • K_k i K_s są używane do odszyfrowywania dostawcy usług zapisanego na dysku.
    • Android korzysta z dostawcy usług, aby odblokować pamięć CE i umożliwić normalne uruchamianie aplikacji.
    • K_k i K_s zostały odrzucone.

Aktualizacje, które chronią telefon, mogą nastąpić w dogodnym czasie dla Ciebie: podczas snu.

Ponowne odtwarzanie kodu PIN z karty SIM

W pewnych warunkach kod PIN karty SIM jest weryfikowany z pamięci podręcznej, To proces nazywany ponownym odtwarzaniem karty SIM z kodem PIN.

Karta SIM z włączonym kodem PIN również musi przejść kod PIN bez zakłóceń. weryfikacja (ponowne odtworzenie kodu SIM i kodu PIN) po ponownym uruchomieniu bez nadzoru w celu przywrócenia sieci komórkowej; połączenia (wymagane do połączeń telefonicznych, SMS-ów i usług transmisji danych); kod PIN do karty SIM i odpowiednie informacje o karcie SIM (identyfikator ICCID oraz gniazdo karty SIM); są bezpiecznie przechowywane razem. Zapisany kod PIN można pobrać i użyć do weryfikacji tylko po udanym ponownym uruchomieniu bez nadzoru. Jeśli urządzenie jest kod PIN do karty SIM jest przechowywany wraz z kluczami chronionymi przez LSKF. Jeśli na karcie SIM kod PIN jest włączony, interakcja z serwerem RoR wymaga połączenia Wi-Fi dla aktualizacji OTA i wskaźnika RoR opartego na serwerze, co zapewnia podstawowe działanie połączenia komórkowego) po zrestartowaniu urządzenia.

Kod PIN do karty SIM jest ponownie szyfrowany i zapisywany za każdym razem, gdy użytkownik włączy usługę. zweryfikować lub zmodyfikować. Kod PIN do karty SIM zostanie odrzucony w następujących przypadkach: następuje:

  • Karta SIM została wyjęta lub zresetowana.
  • użytkownik wyłączy kod PIN;
  • Ponowne uruchomienie nie zostało zainicjowane przez RoR.

Zapisany kod PIN karty SIM może zostać użyty raz po zrestartowaniu zainicjowanym przez RoR. tylko przez bardzo krótki czas (20 sekund) – jeśli dane karty SIM są szczegółowe. są takie same. Zapisany kod PIN do karty SIM nigdy nie opuszcza aplikacji TelephonyManager. nie mogą być odczytywane przez moduły zewnętrzne.

Wytyczne dotyczące implementacji

Na Androidzie 12 multiklient i serwerowy wskaźnik RoR zmniejsza obciążenie partnerom podczas przekazywania aktualizacji OTA. Niezbędne aktualizacje mogą wystąpić podczas dogodnych przerw w działaniu urządzenia, np. w określonych godzinach snu.

Aby mieć pewność, że aktualizacje OTA w takich okresach nie będą przeszkadzać użytkownikom, wdrożyliśmy tryb ciemny w celu ograniczenia emisji światła. Aby to zrobić, musisz mieć urządzenie program rozruchowy wyszuka hasło dla przyczyny unattended. Jeśli unattended to true, ustawić na urządzeniu tryb ciemny. Pamiętaj, że obowiązkiem każdego producenta OEM jest zredukować emisję dźwięku i światła.

Jeśli przechodzisz na Androida 12 lub wprowadzasz na rynek urządzeń z Androidem 12, nie trzeba nic robić, wdrożyć nową funkcję RoR.

W ramach procesu multikonta klientów pojawiło się jedno nowe wywołanie: isPreparedForUnattendedUpdate, poniżej:

@RequiresPermission(anyOf = {android.Manifest.permission.RECOVERY,
            android.Manifest.permission.REBOOT})
public static boolean isPreparedForUnattendedUpdate(@NonNull Context context)

Nie musisz tego stosować, ponieważ HAL jest wycofywany Android 12.

Menedżer telefonii

Klient OTA wywołuje systemowy interfejs API TelephonyManager, gdy zbliża się ponowne uruchomienie na Androidzie 12. Ten interfejs API przenosi wszystkie kody PIN zapisane w pamięci podręcznej z stan AVAILABLE na REBOOT_READY. System TelephonyManager Interfejs API jest chroniony przez dotychczasowy interfejs REBOOT Uprawnienia do pliku manifestu.

 /**
    * The unattended reboot was prepared successfully.
    * @hide
    */
   @SystemApi
   public static final int PREPARE_UNATTENDED_REBOOT_SUCCESS = 0;

   /**
    * The unattended reboot was prepared, but the user will need to manually
    * enter the PIN code of at least one SIM card present in the device.
    * @hide
    */
   @SystemApi
   public static final int PREPARE_UNATTENDED_REBOOT_PIN_REQUIRED = 1;

   /**
    * The unattended reboot was not prepared due to generic error.
    * @hide
    */
   @SystemApi
   public static final int PREPARE_UNATTENDED_REBOOT_ERROR = 2;

   /** @hide */
   @Retention(RetentionPolicy.SOURCE)
   @IntDef(prefix = {"PREPARE_UNATTENDED_REBOOT_"},
           value = {
                   PREPARE_UNATTENDED_REBOOT_SUCCESS,
                   PREPARE_UNATTENDED_REBOOT_PIN_REQUIRED,
                   PREPARE_UNATTENDED_REBOOT_ERROR
           })
   public @interface PrepareUnattendedRebootResult {}

   /**
    * Prepare TelephonyManager for an unattended reboot. The reboot is
    * required to be done shortly after the API is invoked.
    *
    * Requires system privileges.
    *
    * <p>Requires Permission:
    *   {@link android.Manifest.permission#REBOOT}
    *
    * @return {@link #PREPARE_UNATTENDED_REBOOT_SUCCESS} in case of success.
    * {@link #PREPARE_UNATTENDED_REBOOT_PIN_REQUIRED} if the device contains
    * at least one SIM card for which the user needs to manually enter the PIN
    * code after the reboot. {@link #PREPARE_UNATTENDED_REBOOT_ERROR} in case
    * of error.
    * @hide
    */
   @SystemApi
   @RequiresPermission(android.Manifest.permission.REBOOT)
   @PrepareUnattendedRebootResult
   public int prepareForUnattendedReboot()

Systemowy interfejs API TelephonyManager jest używany przez pliki APK z podwyższonymi uprawnieniami.

Testowanie

Aby przetestować nowy interfejs API, uruchom to polecenie:

    adb shell cmd phone unattended-reboot

To polecenie działa tylko wtedy, gdy powłoka jest uruchomiona jako użytkownik root (adb root).

Tylko Android 11

Pozostała część tej strony dotyczy Androida 11.

Od lipca 2020 r. implementacje RoR HAL dzielą się na 2 kategorie:

  1. Jeśli układ SoC obsługuje trwałość pamięci RAM po ponownym uruchomieniu, OEM może używać funkcji domyślna implementacja w AOSP (Default RAM Escrow).
  2. Jeśli sprzęt lub układ SOC obsługuje bezpieczną enklawę sprzętową (oddzielną przez współprocesora zabezpieczeń z własną pamięcią RAM i ROM), dodatkowo musi wykonać :
    • Mieć możliwość wykrycia ponownego uruchomienia procesora.
    • Mieć sprzętowe źródło licznika czasu, które pozostaje ustawione po ponownym uruchomieniu. Oznacza to, że enklawa musi mieć możliwość wykrycia ponownego uruchomienia i wygaśnięcia licznika czasu ustawionego przed i uruchomić go ponownie.
    • Obsługa przechowywania zdekodowanego klucza w pamięci RAM/ROM enklawy, tak aby nie można było z niego korzystać które można odzyskać za pomocą ataków offline. Klucz RoR musi być przechowywany w taki sposób, nie będzie można go odzyskać osobom wtajemniczonym lub przeprowadzającym atak.

Domyślny depozyt pamięci RAM

AOSP ma wdrożenie algorytmu RoR HAL na podstawie trwałości pamięci RAM. Aby to działało, producenci OEM muszą dbać o to, aby ich układy SOC obsługiwały trwałość pamięci RAM podczas ponownego uruchamiania. Niektóre układy SOC nie są w stanie utrwalać zawartości pamięci RAM po ponownym uruchomieniu, Zalecamy producentom OEM, aby skonsultowali się ze swoimi partnerami SoC przed włączeniem tej domyślnej wartości HAL. W poniższej sekcji znajdziesz odpowiednie materiały kanoniczne na ten temat.

Proces aktualizacji OTA za pomocą RoR

Aplikacja kliencka OTA na telefonie musi mieć Manifest.permission.REBOOT i Manifest.permission.RECOVERY do wywoływania niezbędnych metod i wdrożyć funkcję RoR. Po spełnieniu tego warunku wstępnego proces wykonaj te czynności:

  1. Aplikacja kliencka OTA pobiera aktualizację.
  2. Wywołania aplikacji klienta OTA pod adresem RecoverySystem#prepareForUnattendedUpdate, które powoduje wyświetlenie prośby o podanie kodu PIN, wzoru lub hasła na blokady ekranu podczas następnego odblokowania.
  3. Użytkownik odblokuje urządzenie na ekranie blokady, a urządzenie będzie gotowe , aby zastosować aktualizację.
  4. Klient OTA wywołuje metodę RecoverySystem#rebootAndApply, która natychmiast uruchamia restart.

Po zakończeniu tego procesu urządzenie uruchamia się ponownie, a wskaźnik pojawiający się ponownie odblokowuje magazyn danych szyfrowanych (CE). W przypadku aplikacji będzie widoczny jako odblokowany przez normalnego użytkownika, dzięki czemu będzie otrzymywać wszystkie sygnały, takie jak ACTION_LOCKED_BOOT_UKOŃCZONO oraz ACTION_BOOT_COMPLETED co zwykle.

Modyfikowanie konfiguracji produktów

Produkt oznaczony jako obsługujący funkcję RoR w Androidzie 11 musi zawierać wdrożenie kodu HAL RestartEscrow HAL i dołączenie pliku XML znacznika cech. Domyślna implementacja działa dobrze na urządzeniach, które korzystają z ponownego uruchamiania (gdy zasilanie DRAM pozostaje włączone podczas ponownego uruchamiania).

Ponowne uruchomienie znacznika funkcji depozytu

Musi być też dostępny znacznik cech:

PRODUCT_COPY_FILES += \
    frameworks/native/data/etc/android.hardware.reboot_escrow.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.reboot_escrow.xml

Domyślna implementacja HAL depozytu ponownego uruchomienia

Aby używać implementacji domyślnej, musisz zarezerwować 65 536 (0x10 000) bajtów. Nigdy zapisywać te bajty w pamięci nieulotnej, aby zapewnić, że właściwości zabezpieczeń i utrwalać się.

Zmiany drzewa urządzeń z jądrem Linuksa

W drzewie urządzenia jądra Linuksa musisz zarezerwować pamięć dla regionu pmem. Ten przykład pokazuje zarezerwowanie zasobu 0x50000000:

  reserved-memory {
    my_reservation@0x50000000 {
      no-map;
      reg = <0x50000000 0x10000>;
    }
  }

  reboot_escrow@0 {
    compatible = "pmem-region";
    reg = <0x50000000 0x10000>;
  };

Sprawdź, czy w katalogu bloków znajduje się nowe urządzenie o nazwie takiej jak /dev/block/pmem0 (np. pmem1 lub pmem2).

Zmiany na urządzeniu Device.mk

Zakładając, że nowe urządzenie z poprzedniego kroku ma nazwę pmem0, musisz upewnij się, że do vendor/<oem>/<product>/device.mk zostały dodane te nowe wpisy:

# Resume on Reboot support
PRODUCT_PROPERTY_OVERRIDES += \
    ro.rebootescrow.device=/dev/block/pmem0
PRODUCT_PACKAGES += \
    android.hardware.rebootescrow-service.default
Reguły SELinux

Dodaj nowe wpisy do sekcji file_contexts urządzenia:

/dev/block/pmem0  u:object_r:rebootescrow_device:s0
/vendor/bin/hw/android\.hardware\.rebootescrow-service\.default  u:object_r:hal_rebootescrow_default_exec:s0