In Android 11, gli aggiornamenti OTA possono essere applicati utilizzando i meccanismi di aggiornamento A/B o di aggiornamento A/B virtuale , combinati con i metodi della classe RecoverySystem . Dopo il riavvio di un dispositivo per applicare un aggiornamento OTA, Resume-on-Reboot (RoR) sblocca l' archiviazione con crittografia delle credenziali (CE) del dispositivo.
Sebbene i partner possano associare questo processo a una funzionalità di sistema OTA che applica gli aggiornamenti quando il dispositivo dovrebbe essere inattivo in Android 11, in Android 12 i partner non hanno bisogno di una funzionalità di sistema OTA aggiuntiva. Il processo RoR offre maggiore sicurezza e praticità agli utenti perché gli aggiornamenti possono essere effettuati durante i periodi di inattività del dispositivo, mentre le funzionalità di aggiornamento multi-client e basate su server di Android 12 insieme forniscono sicurezza a livello di hardware del dispositivo.
Sebbene sia necessario fornire l'autorizzazione del dispositivo affinché la funzionalità android.hardware.reboot_escrow
supporti RoR in Android 11, non è necessario farlo per abilitare RoR basato su server in Android 12 e versioni successive, perché non usano l'HAL.
Sfondo
A partire da Android 7, Android supporta Direct Boot , che consente l'avvio delle app su un dispositivo prima che l'archiviazione CE venga sbloccata dall'utente. L'implementazione del supporto per l'avvio diretto ha fornito agli utenti un'esperienza migliore prima che fosse necessario inserire il fattore di conoscenza della schermata di blocco (LSKF) dopo l'avvio.
RoR consente di sbloccare l'archiviazione CE di tutte le app su un dispositivo, comprese quelle che non supportano l'avvio diretto, quando viene avviato un riavvio dopo un aggiornamento OTA. Questa funzione consente agli utenti di ricevere notifiche da tutte le app installate, dopo il riavvio.
Modello di minaccia
Un'implementazione del RoR deve garantire che quando un dispositivo cade nelle mani di un utente malintenzionato, è estremamente difficile per l'utente malintenzionato recuperare i dati crittografati CE dell'utente, anche se il dispositivo è acceso, l'archiviazione CE è sbloccata e il dispositivo è sbloccato da l'utente dopo aver ricevuto un aggiornamento OTA. La resistenza agli attacchi interni deve essere efficace anche se l'aggressore ottiene l'accesso alle chiavi di firma crittografica trasmesse.
Nello specifico, l'archiviazione CE non deve essere letta da un utente malintenzionato che possiede fisicamente il dispositivo e presenta queste funzionalità e limitazioni:
Capacità
- Può utilizzare la chiave di firma di qualsiasi fornitore o azienda per firmare messaggi arbitrari.
- Può far sì che il dispositivo riceva un aggiornamento OTA.
- Può modificare il funzionamento di qualsiasi hardware (come un processore applicativo o una memoria flash), ad eccezione di quanto specificato in Limitazioni di seguito. (Tuttavia, tale modifica comporta sia un ritardo di almeno un'ora, sia un ciclo di spegnimento che distrugge il contenuto della RAM.)
Limitazioni
- Non è possibile modificare il funzionamento dell'hardware a prova di manomissione (ad esempio, un Titan M).
- Impossibile leggere la RAM del dispositivo live.
- Impossibile indovinare le credenziali dell'utente (PIN, sequenza, password) o altrimenti farle inserire.
Soluzione
Il sistema di aggiornamento RoR di Android 12 fornisce sicurezza contro aggressori molto sofisticati e lo fa mentre le password e i PIN sul dispositivo rimangono sul dispositivo, non vengono mai inviati o archiviati sui server di Google. Questa è una panoramica del processo che garantisce che i livelli di sicurezza forniti siano simili a un sistema RoR basato su hardware a livello di dispositivo:
- Android applica protezioni crittografiche ai dati archiviati su un dispositivo.
- Tutti i dati sono protetti da chiavi memorizzate nel Trusted Execution Environment (TEE).
- Il TEE rilascia le chiavi solo se il sistema operativo in esecuzione supera l'autenticazione crittografica ( avvio verificato ).
- Il servizio RoR in esecuzione sui server di Google protegge i dati CE memorizzando un segreto che può essere recuperato solo per un periodo di tempo limitato . Funziona in tutto l'ecosistema Android.
- Una chiave crittografica, protetta dal PIN di un utente, viene utilizzata per sbloccare il dispositivo e decrittografare l'archiviazione CE.
- Quando è pianificato un riavvio notturno, Android richiede all'utente di inserire il proprio PIN, quindi calcola una password sintetica (SP).
- Quindi crittografa l'SP due volte: una volta con una chiave
K_s
memorizzata nella RAM e di nuovo con una chiaveK_k
memorizzata in TEE. - L'SP con doppia crittografia viene archiviato su disco e l'SP viene cancellato dalla RAM. Entrambe le chiavi sono appena generate e utilizzate per un solo riavvio .
- Quando è il momento di riavviare, Android affida
K_s
al server. La ricevuta conK_k
viene crittografata prima di essere archiviata su disco. - Dopo il riavvio, Android utilizza
K_k
per decrittografare la ricevuta, quindi la invia al server per recuperareK_s
.-
K_k
eK_s
vengono utilizzati per decrittografare l'SP archiviato su disco. - Android utilizza l'SP per sbloccare l'archiviazione CE e consentire il normale avvio dell'app.
-
K_k
eK_s
vengono scartati.
-
Gli aggiornamenti che tengono al sicuro il tuo telefono possono avvenire in un momento a te comodo: mentre dormi.
Ripetizione SIM-PIN
In determinate condizioni il codice PIN di una scheda SIM viene verificato da una cache, un processo chiamato replay SIM-PIN.
Una scheda SIM con un PIN abilitato deve anche essere sottoposta a una verifica continua del codice PIN (ripetizione SIM-PIN) dopo un riavvio non presidiato per ripristinare la connettività cellulare (necessaria per telefonate, messaggi SMS e servizi dati). Il PIN della SIM e le informazioni corrispondenti sulla scheda SIM (l'ICCID e il numero dello slot della SIM) vengono archiviati insieme in modo sicuro. Il PIN memorizzato può essere recuperato e utilizzato per la verifica solo dopo un riavvio automatico riuscito. Se il dispositivo è protetto, il PIN della SIM viene memorizzato con chiavi protette da LSKF. Se la SIM ha il PIN abilitato, l'interazione con il server RoR richiede una connessione WiFi per l'aggiornamento OTA e un RoR basato su server, che garantisce funzionalità di base (con connettività cellulare) dopo il riavvio.
Il PIN della SIM viene nuovamente crittografato e archiviato ogni volta che l'utente lo abilita, lo verifica o lo modifica correttamente. Il PIN della SIM viene scartato se si verifica una delle seguenti condizioni:
- La SIM viene rimossa o reimpostata.
- L'utente disabilita il PIN.
- Si è verificato un riavvio non avviato da RoR.
Il PIN SIM memorizzato può essere utilizzato solo una volta dopo il riavvio avviato da RoR e solo per un periodo di tempo molto breve (20 secondi), se i dettagli della scheda SIM corrispondono. Il PIN SIM memorizzato non lascia mai l'app TelephonyManager e non può essere recuperato da moduli esterni.
Linee guida per l'attuazione
In Android 12, le funzioni RoR multi-client e basate su server forniscono un carico più leggero ai partner quando inviano aggiornamenti OTA. Gli aggiornamenti necessari possono verificarsi durante i tempi di inattività del dispositivo, ad esempio durante le ore di sonno designate.
Per garantire che gli aggiornamenti OTA durante tali periodi di tempo non interrompano gli utenti, utilizza la modalità oscura per mitigare le emissioni di luce. Per fare ciò, chiedi al bootloader del dispositivo di cercare la stringa reason unattended
. Se unattended
è true
, imposta il dispositivo in modalità oscura. Si noti che è responsabilità di ciascun OEM mitigare le emissioni sonore e luminose.
Se esegui l'aggiornamento ad Android 12 o avvii dispositivi Android 12, non devi fare nulla per implementare la nuova funzionalità RoR.
C'è una nuova chiamata nel flusso multi-client, isPreparedForUnattendedUpdate
, mostrato di seguito:
@RequiresPermission(anyOf = {android.Manifest.permission.RECOVERY,
android.Manifest.permission.REBOOT})
public static boolean isPreparedForUnattendedUpdate(@NonNull Context context)
Non è necessario implementarlo, perché l'HAL è deprecato a partire da Android 12.
Gestore di telefonia
Il client OTA richiama l'API di sistema TelephonyManager
quando è imminente un riavvio in Android 12. Questa API sposta tutti i codici PIN memorizzati nella cache dallo stato AVAILABLE
allo stato REBOOT_READY
. L'API di sistema TelephonyManager
è protetta dall'autorizzazione REBOOT
Manifest esistente.
/**
* 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()
L'API di sistema TelephonyManager viene utilizzata dagli APK con privilegi.
Test
Per testare la nuova API, esegui questo comando:
adb shell cmd phone unattended-reboot
Questo comando funziona solo quando la shell è in esecuzione come root ( adb root
).
Solo Android 11
Il resto di questa pagina si applica ad Android 11.
A partire da luglio 2020, le implementazioni di RoR HAL rientrano in due categorie:
- Se l'hardware SoC supporta la persistenza della RAM tra i riavvii, gli OEM possono utilizzare l'implementazione predefinita in AOSP ( Default RAM Escrow ).
- Se l'hardware o il SoC del dispositivo supporta un'enclave hardware sicura (un coprocessore di sicurezza discreto con RAM e ROM proprie), deve inoltre eseguire le seguenti operazioni:
- Essere in grado di rilevare un riavvio della CPU principale.
- Avere un'origine del timer hardware che persiste durante i riavvii. In altre parole, l'enclave deve essere in grado di rilevare il riavvio e far scadere un timer impostato prima del riavvio.
- Supporta l'archiviazione di una chiave depositata nella RAM/ROM dell'enclave in modo tale che non possa essere recuperata con attacchi offline. Deve memorizzare la chiave RoR in un modo che ne renda impossibile il recupero da parte di addetti ai lavori o aggressori.
Impegno RAM predefinito
AOSP ha un'implementazione dell'HAL RoR che utilizza la persistenza della RAM. Perché funzioni, gli OEM devono assicurarsi che i loro SoC supportino la persistenza della RAM durante i riavvii. Alcuni SoC non sono in grado di rendere persistenti i contenuti della RAM durante un riavvio, pertanto si consiglia agli OEM di consultare i propri partner SoC prima di abilitare questo HAL predefinito. Il riferimento canonico per questo nella sezione seguente.
Flusso dell'aggiornamento OTA tramite RoR
L'app client OTA sul telefono deve disporre delle autorizzazioni Manifest.permission.REBOOT e Manifest.permission.RECOVERY
per chiamare i metodi necessari per implementare RoR. Con tale prerequisito in atto, il flusso di un aggiornamento segue questi passaggi:
- L'app client OTA scarica l'aggiornamento.
- L'app client OTA chiama
RecoverySystem#prepareForUnattendedUpdate
che fa sì che all'utente venga richiesto il PIN, la sequenza o la password sulla schermata di blocco durante lo sblocco successivo. - L'utente sblocca il dispositivo nella schermata di blocco e il dispositivo è pronto per l'applicazione dell'aggiornamento.
- L'app client OTA chiama a
RecoverySystem#rebootAndApply
, che attiva immediatamente un riavvio.
Al termine di questo flusso, il dispositivo si riavvia e il meccanismo RoR sblocca l'archiviazione crittografata con credenziali (CE). Per le app, questo appare come un normale sblocco utente, quindi ricevono tutti i segnali, come ACTION_LOCKED_BOOT_COMPLETED e ACTION_BOOT_COMPLETED che fanno normalmente.
Modificare le configurazioni del prodotto
Un prodotto contrassegnato come supporto della funzionalità RoR in Android 11 deve includere un'implementazione dell'HAL RebootEscrow e includere il file XML dell'indicatore di funzionalità. L'implementazione predefinita funziona bene sui dispositivi che utilizzano il riavvio a caldo (quando l'alimentazione alla DRAM rimane attiva durante il riavvio).
Riavvia l'indicatore della funzione di deposito a garanzia
Deve essere presente anche l'indicatore di caratteristica:
PRODUCT_COPY_FILES += \
frameworks/native/data/etc/android.hardware.reboot_escrow.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.reboot_escrow.xml
Implementazione predefinita dell'HAL di deposito a garanzia del riavvio
Per utilizzare l'implementazione predefinita, è necessario riservare 65536 (0x10000) byte. Non scrivere mai questi byte nella memoria non volatile per garantire che le proprietà di sicurezza persistano.
Modifiche all'albero dei dispositivi del kernel Linux
Nell'albero dei dispositivi del kernel Linux, è necessario riservare memoria per una regione pmem
. L'esempio seguente mostra 0x50000000
riservato:
reserved-memory {
my_reservation@0x50000000 {
no-map;
reg = <0x50000000 0x10000>;
}
}
reboot_escrow@0 {
compatible = "pmem-region";
reg = <0x50000000 0x10000>;
};
Verifica di avere un nuovo dispositivo nella directory block con un nome come /dev/block/pmem0
(come pmem1
o pmem2
).
Device.mk cambia
Supponendo che il tuo nuovo dispositivo dal passaggio precedente sia denominato pmem0
, devi assicurarti che le seguenti nuove voci vengano aggiunte a vendor/<oem>/<product>/device.mk
:
# Resume on Reboot support
PRODUCT_PROPERTY_OVERRIDES += \
ro.rebootescrow.device=/dev/block/pmem0
PRODUCT_PACKAGES += \
android.hardware.rebootescrow-service.default
Regole di SELinux
Aggiungi queste nuove voci ai file_contexts
del dispositivo :
/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