Android 7.0 e versioni successive supportano la crittografia basata su file (FBE). La crittografia basata su file consente di criptare file diversi con chiavi diverse che possono essere sbloccate indipendentemente.
Questo articolo descrive come attivare la crittografia basata su file sui nuovi dispositivi e come le app di sistema possono utilizzare le API Direct Boot per offrire agli utenti l'esperienza migliore e più sicura possibile.
Tutti i dispositivi lanciati con Android 10 e versioni successive devono utilizzare la crittografia basata su file.
Avvio diretto
La crittografia basata su file abilita una nuova funzionalità introdotta in Android 7.0 chiamata Avvio diretto. L'avvio diretto consente ai dispositivi criptati di avviarsi direttamente alla schermata di blocco. In precedenza, sui dispositivi criptati che utilizzavano la crittografia completa del disco (FDE), gli utenti dovevano fornire le credenziali prima di poter accedere ai dati, impedendo allo smartphone di eseguire tutte le operazioni tranne quelle più basilari. Ad esempio, le sveglie non potevano funzionare, i servizi di accessibilità non erano disponibili e gli smartphone non potevano ricevere chiamate, ma erano limitati solo alle operazioni di base del tastierino di emergenza.
Con l'introduzione della crittografia basata su file (FBE) e di nuove API per rendere le app consapevoli della crittografia, è possibile che queste app funzionino in un contesto limitato. Ciò può accadere prima che gli utenti forniscano le proprie credenziali, proteggendo al contempo le informazioni private degli utenti.
Su un dispositivo abilitato a FBE, ogni utente del dispositivo ha due posizioni di archiviazione disponibili per le app:
- Spazio di archiviazione Credential Encrypted (CE), che è la posizione di archiviazione predefinita e disponibile solo dopo che l'utente ha sbloccato il dispositivo.
- Spazio di archiviazione con crittografia del dispositivo (DE), ovvero una posizione di archiviazione disponibile sia durante la modalità Avvio diretto sia dopo che l'utente ha sbloccato il dispositivo.
Questa separazione rende i profili di lavoro più sicuri perché consente di proteggere più di un utente alla volta, in quanto la crittografia non si basa più solo su una password di avvio.
L'API Direct Boot consente alle app compatibili con la crittografia di accedere a ciascuna di queste aree. Sono state apportate modifiche al ciclo di vita dell'app per soddisfare la necessità di notificare alle app quando l'archivio CE di un utente viene sbloccato in risposta all'inserimento iniziale delle credenziali nella schermata di blocco o, nel caso del profilo di lavoro, alla fornitura di una sfida di lavoro. I dispositivi con Android 7.0 devono supportare queste nuove API e cicli di vita indipendentemente dall'implementazione o meno di FBE. Tuttavia, senza FBE, DE e CE sono sempre in stato di sblocco.
Un'implementazione completa della crittografia basata su file nei file system Ext4 e F2FS è fornita in Android Open Source Project (AOSP) e deve essere abilitata solo sui dispositivi che soddisfano i requisiti. I produttori che scelgono di utilizzare FBE possono esplorare modi per ottimizzare la funzionalità in base al system on chip (SoC) utilizzato.
Tutti i pacchetti necessari in AOSP sono stati aggiornati per supportare l'avvio diretto. Tuttavia, laddove i produttori di dispositivi utilizzano versioni personalizzate di queste app, vogliono assicurarsi che almeno siano presenti pacchetti compatibili con l'avvio diretto che forniscono i seguenti servizi:
- Servizi di telefonia e tastierino
- Metodo di inserimento per inserire le password nella schermata di blocco
Esempi e fonte
Android fornisce un'implementazione di riferimento della crittografia basata su file, in cui vold (system/vold) fornisce la funzionalità per la gestione di dispositivi di archiviazione e volumi su Android. L'aggiunta di FBE fornisce a vold diversi nuovi comandi per supportare la gestione delle chiavi per le chiavi CE e DE di più utenti. Oltre alle modifiche principali per utilizzare le funzionalità di crittografia basata su file nel kernel, molti pacchetti di sistema, tra cui la schermata di blocco e SystemUI, sono stati modificati per supportare le funzionalità FBE e Avvio diretto. come le seguenti.
- AOSP Dialer (packages/apps/Dialer)
- Orologio (packages/apps/DeskClock)
- LatinIME (packages/inputmethods/LatinIME)*
- App Impostazioni (pacchetti/app/Impostazioni)*
- SystemUI (frameworks/base/packages/SystemUI)*
* App di sistema che utilizzano l'attributo manifest defaultToDeviceProtectedStorage
Altri esempi di app e servizi che riconoscono la crittografia possono essere
trovati eseguendo il comando mangrep directBootAware
nella
directory dei framework o dei pacchetti dell'albero
dei sorgenti AOSP.
Dipendenze
Per utilizzare in modo sicuro l'implementazione AOSP di FBE, un dispositivo deve soddisfare le seguenti dipendenze:
- Supporto del kernel per la crittografia Ext4 o F2FS.
- Supporto di KeyMint (o Keymaster 1.0 o versioni successive). Non è supportato Keymaster 0.3, in quanto non fornisce le funzionalità necessarie né garantisce una protezione sufficiente per le chiavi di crittografia.
- KeyMint/Keymaster e Gatekeeper devono essere implementati in un Trusted Execution Environment (TEE) per fornire protezione per le chiavi DE in modo che un sistema operativo non autorizzato (sistema operativo personalizzato installato sul dispositivo) non possa semplicemente richiedere le chiavi DE.
- Hardware Root of Trust e Avvio verificato vincolati all'inizializzazione di KeyMint sono necessari per garantire che le chiavi DE non siano accessibili da un sistema operativo non autorizzato.
Implementazione
Innanzitutto, le app come sveglie, telefono e funzionalità di accessibilità devono essere rese android:directBootAware in base alla documentazione per sviluppatori relativa all'avvio diretto.
Supporto del kernel
Il supporto del kernel per la crittografia Ext4 e F2FS è disponibile nei kernel comuni di Android, versione 3.18 e successive. Per abilitarlo in un kernel versione 5.1 o successive, utilizza:
CONFIG_FS_ENCRYPTION=y
Per i kernel precedenti, utilizza CONFIG_EXT4_ENCRYPTION=y
se il file system userdata
del tuo dispositivo è Ext4 oppure utilizza CONFIG_F2FS_FS_ENCRYPTION=y
se il file system userdata
del tuo dispositivo è F2FS.
Se il tuo dispositivo supporta lo spazio di archiviazione adottabile o utilizza la crittografia dei metadati sullo spazio di archiviazione interno, attiva anche le opzioni di configurazione del kernel necessarie per la crittografia dei metadati, come descritto nella documentazione sulla crittografia dei metadati.
Oltre al supporto funzionale per la crittografia Ext4 o F2FS, i produttori di dispositivi devono anche attivare l'accelerazione crittografica per velocizzare la crittografia basata su file e migliorare l'esperienza utente. Ad esempio, sui dispositivi basati su ARM64, l'accelerazione ARMv8 CE (Cryptography Extensions) può essere abilitata impostando le seguenti opzioni di configurazione del kernel:
CONFIG_CRYPTO_AES_ARM64_CE_BLK=y CONFIG_CRYPTO_SHA2_ARM64_CE=y
Per migliorare ulteriormente le prestazioni e ridurre il consumo energetico, i produttori di dispositivi potrebbero anche prendere in considerazione l'implementazione dell'hardware di crittografia in linea, che cripta/decripta i dati mentre sono in transito verso/da un dispositivo di archiviazione. I kernel comuni di Android (versione 4.14 e successive) contengono un framework che consente di utilizzare la crittografia in linea quando è disponibile il supporto dell'hardware e del driver del fornitore. Il framework di crittografia inline può essere attivato impostando le seguenti opzioni di configurazione del kernel:
CONFIG_BLK_INLINE_ENCRYPTION=y CONFIG_FS_ENCRYPTION=y CONFIG_FS_ENCRYPTION_INLINE_CRYPT=y
Se il tuo dispositivo utilizza l'archiviazione basata su UFS, attiva anche:
CONFIG_SCSI_UFS_CRYPTO=y
Se il tuo dispositivo utilizza lo spazio di archiviazione basato su eMMC, attiva anche:
CONFIG_MMC_CRYPTO=y
Attiva la crittografia basata su file
L'attivazione di FBE su un dispositivo richiede l'attivazione sulla memoria interna
(userdata
). In questo modo, FBE viene attivato automaticamente anche sullo spazio di archiviazione
adottabile; tuttavia, il formato di crittografia sullo spazio di archiviazione adottabile può essere sostituito
se necessario.
Memoria interna
FBE viene attivato aggiungendo l'opzione
fileencryption=contents_encryption_mode[:filenames_encryption_mode[:flags]]
alla colonna fs_mgr_flags della riga fstab
per
userdata
. Questa opzione definisce il formato di crittografia
sullo spazio di archiviazione interno. Contiene fino a tre parametri separati da due punti:
- Il parametro
contents_encryption_mode
definisce quale algoritmo crittografico viene utilizzato per criptare i contenuti dei file. Può essereaes-256-xts
oadiantum
. A partire da Android 11, può anche essere lasciato vuoto per specificare l'algoritmo predefinito, ovveroaes-256-xts
. - Il parametro
filenames_encryption_mode
definisce quale algoritmo crittografico viene utilizzato per criptare i nomi dei file. Può essereaes-256-cts
,aes-256-heh
,adiantum
oaes-256-hctr2
. Se non specificato, il valore predefinito èaes-256-cts
secontents_encryption_mode
èaes-256-xts
oppureadiantum
secontents_encryption_mode
èadiantum
. - Il parametro
flags
, nuovo in Android 11, è un elenco di flag separati dal carattere+
. Sono supportati i seguenti flag:- Il flag
v1
seleziona le norme di crittografia della versione 1, mentre il flagv2
seleziona le norme di crittografia della versione 2. Le norme di crittografia della versione 2 utilizzano una funzione di derivazione della chiave più sicura e flessibile. Il valore predefinito è v2 se il dispositivo è stato lanciato su Android 11 o versioni successive (come determinato daro.product.first_api_level
) o v1 se il dispositivo è stato lanciato su Android 10 e versioni precedenti. - Il flag
inlinecrypt_optimized
seleziona un formato di crittografia ottimizzato per l'hardware di crittografia inline che non gestisce in modo efficiente un gran numero di chiavi. Lo fa derivando una sola chiave di crittografia dei contenuti del file per ogni chiave CE o DE, anziché una per file. La generazione di IV (vettori di inizializzazione) viene modificata di conseguenza. - Il flag
emmc_optimized
è simile ainlinecrypt_optimized
, ma seleziona anche un metodo di generazione IV che limita gli IV a 32 bit. Questo flag deve essere utilizzato solo su hardware di crittografia inline conforme alla specifica JEDEC eMMC v5.2 e pertanto supporta solo IV a 32 bit. Su altro hardware di crittografia inline, utilizzainlinecrypt_optimized
. Questo flag non deve mai essere utilizzato su spazio di archiviazione basato su UFS; la specifica UFS consente l'utilizzo di IV a 64 bit. - Sui dispositivi che supportano le chiavi
protette dall'hardware, il flag
wrappedkey_v0
consente l'utilizzo di chiavi protette dall'hardware per FBE. Può essere utilizzato solo in combinazione con l'opzione di montaggioinlinecrypt
e con il flaginlinecrypt_optimized
oemmc_optimized
. - Il flag
dusize_4k
forza la dimensione dell'unità di dati di crittografia a 4096 byte anche quando la dimensione del blocco del file system non è 4096 byte. Le dimensioni dell'unità di dati di crittografia sono la granularità della crittografia dei contenuti dei file. Questo flag è disponibile a partire da Android 15. Questo flag deve essere utilizzato solo per attivare l'utilizzo di hardware di crittografia inline che non supporta unità di dati più grandi di 4096 byte, su un dispositivo che utilizza una dimensione della pagina superiore a 4096 byte e che utilizza il file system f2fs.
- Il flag
Se non utilizzi hardware di crittografia inline, l'impostazione consigliata per la maggior parte dei
dispositivi è fileencryption=aes-256-xts
. Se utilizzi hardware di crittografia
in linea, l'impostazione consigliata per la maggior parte dei dispositivi è
fileencryption=aes-256-xts:aes-256-cts:inlinecrypt_optimized
(o equivalentemente fileencryption=::inlinecrypt_optimized
). Sui
dispositivi senza alcuna forma di accelerazione AES, è possibile utilizzare Adiantum al posto di AES
impostando fileencryption=adiantum
.
A partire da Android 14, AES-HCTR2 è la modalità preferita di crittografia dei nomi file
per i dispositivi con istruzioni di crittografia accelerate. Tuttavia, solo i kernel Android più recenti supportano
AES-HCTR2. In una futura release di Android, è previsto che diventi la modalità predefinita per la crittografia dei nomi dei file. Se il kernel supporta AES-HCTR2, è possibile attivarlo per la crittografia dei nomi dei file
impostando filenames_encryption_mode
su aes-256-hctr2
. Nel caso più semplice,
questo viene fatto con fileencryption=aes-256-xts:aes-256-hctr2
.
Sui dispositivi lanciati con Android 10 e versioni precedenti,
fileencryption=ice
è accettato anche per specificare l'utilizzo della
modalità di crittografia dei contenuti del file FSCRYPT_MODE_PRIVATE
. Questa modalità non è implementata dai kernel comuni di Android, ma potrebbe essere implementata dai fornitori utilizzando patch del kernel personalizzate. Il formato su disco prodotto da questa modalità
era specifico del fornitore. Sui dispositivi lanciati con Android
11 o versioni successive, questa modalità non è più consentita e deve essere utilizzato un
formato di crittografia standard.
Per impostazione predefinita, la crittografia dei contenuti dei file viene eseguita utilizzando l'API di crittografia del kernel Linux. Se invece vuoi utilizzare l'hardware di crittografia in linea, aggiungi anche l'opzione di montaggio inlinecrypt
. Ad esempio, una riga fstab
completa potrebbe avere il seguente aspetto:
/dev/block/by-name/userdata /data f2fs nodev,noatime,nosuid,errors=panic,inlinecrypt wait,fileencryption=aes-256-xts:aes-256-cts:inlinecrypt_optimized
Memoria adottabile
A partire da Android 9, FBE e spazio di archiviazione adattabile possono essere utilizzati insieme.
Se specifichi l'opzione fileencryption
fstab per userdata
, vengono attivate automaticamente sia la crittografia basata su file (FBE) sia la crittografia dei metadati sullo spazio di archiviazione adottabile. Tuttavia, puoi ignorare i formati di crittografia FBE o dei metadati
sull'archivio adottabile impostando le proprietà in
PRODUCT_PROPERTY_OVERRIDES
.
Sui dispositivi lanciati con Android 11 o versioni successive, utilizza le seguenti proprietà:
ro.crypto.volume.options
(novità di Android 11) seleziona il formato di crittografia FBE nella memoria utilizzabile. Ha la stessa sintassi dell'argomento dell'opzionefileencryption
fstab e utilizza gli stessi valori predefiniti. Per sapere cosa utilizzare qui, consulta i consigli perfileencryption
riportati sopra.ro.crypto.volume.metadata.encryption
seleziona il formato di crittografia dei metadati nella memoria utilizzabile. Consulta la documentazione sulla crittografia dei metadati.
Sui dispositivi lanciati con Android 10 e versioni precedenti, utilizza le seguenti proprietà:
ro.crypto.volume.contents_mode
seleziona la modalità di crittografia dei contenuti. Equivale al primo campo separato da due punti diro.crypto.volume.options
.ro.crypto.volume.filenames_mode
seleziona la modalità di crittografia dei nomi dei file. Questo campo è equivalente al secondo campo separato da due punti diro.crypto.volume.options
, tranne per il fatto che il valore predefinito sui dispositivi lanciati con Android 10 e versioni precedenti èaes-256-heh
. Sulla maggior parte dei dispositivi, questo valore deve essere esplicitamente sostituito conaes-256-cts
.ro.crypto.fde_algorithm
ero.crypto.fde_sector_size
seleziona il formato di crittografia dei metadati nella memoria utilizzabile. Consulta la documentazione sulla crittografia dei metadati.
Integrazione con KeyMint
L'HAL KeyMint deve essere avviato come parte della classe early_hal
.
Questo perché FBE richiede che KeyMint sia pronto a gestire le richieste entro la
fase di avvio post-fs-data
, ovvero quando vold
configura
le chiavi iniziali.
Escludere directory
init
applica la chiave DE di sistema a
tutte le directory di primo livello di /data
, ad eccezione delle directory che
devono essere non criptate, come la directory che contiene la chiave DE di sistema
stessa e le directory che contengono directory CE o DE utente. Le chiavi di crittografia vengono applicate in modo ricorsivo e non possono essere sostituite dalle sottodirectory.
In Android 11 e versioni successive, la chiave che
init
si applica alle directory può essere controllata dall'argomento
encryption=<action>
del comando mkdir
negli script init. I valori possibili di <action>
sono
documentati nel
README per il linguaggio di inizializzazione di Android.
In Android 10, le azioni di crittografia init
sono state codificate nel seguente percorso:
/system/extras/libfscrypt/fscrypt_init_extensions.cpp
In Android 9 e versioni precedenti, la posizione era:
/system/extras/ext4_utils/ext4_crypt_init_extensions.cpp
È possibile aggiungere eccezioni per impedire la crittografia di determinate directory. Se vengono apportate modifiche di questo tipo, il produttore del dispositivo deve includere norme SELinux che concedono l'accesso solo alle app che devono utilizzare la directory non criptata. In questo modo dovrebbero essere escluse tutte le app non attendibili.
L'unico caso d'uso accettabile noto è a supporto delle funzionalità OTA legacy.
Supportare l'avvio diretto nelle app di sistema
Rendere le app compatibili con l'avvio diretto
Per facilitare la migrazione rapida delle app di sistema, sono disponibili due nuovi attributi che
possono essere impostati a livello di app. L'attributo
defaultToDeviceProtectedStorage
è disponibile solo per
le app di sistema. L'attributo directBootAware
è disponibile per tutti.
<application android:directBootAware="true" android:defaultToDeviceProtectedStorage="true">
L'attributo directBootAware
a livello di app è un modo rapido per contrassegnare
tutti i componenti dell'app come compatibili con la crittografia.
L'attributo defaultToDeviceProtectedStorage
reindirizza la posizione di archiviazione
predefinita dell'app in modo che punti all'archiviazione DE anziché all'archiviazione CE.
Le app di sistema che utilizzano questo flag devono controllare attentamente tutti i dati archiviati nella posizione predefinita e modificare i percorsi dei dati sensibili in modo che utilizzino l'archivio CE. I produttori di dispositivi che utilizzano questa opzione devono ispezionare attentamente i dati che archiviano per assicurarsi che non contengano informazioni personali.
Quando viene eseguito in questa modalità, le seguenti API di sistema sono disponibili per gestire in modo esplicito un contesto supportato dall'archiviazione CE quando necessario, che sono equivalenti alle controparti protette dal dispositivo.
Context.createCredentialProtectedStorageContext()
Context.isCredentialProtectedStorage()
Supportare più utenti
Ogni utente in un ambiente multiutente riceve una chiave di crittografia separata. Ogni utente riceve due chiavi: una DE e una CE. L'utente 0 deve accedere per primo al dispositivo perché è un utente speciale. Questo è pertinente per gli utilizzi di amministrazione dei dispositivi.
Le app che riconoscono le criptovalute interagiscono tra gli utenti in questo modo:
INTERACT_ACROSS_USERS
e INTERACT_ACROSS_USERS_FULL
consentono a un'app di agire per tutti gli utenti sul dispositivo. Tuttavia, queste
app possono accedere solo alle directory criptate con CE per gli utenti
già sbloccati.
Un'app potrebbe essere in grado di interagire liberamente nelle aree DE, ma lo sblocco di un utente non significa che tutti gli utenti sul dispositivo siano sbloccati. L'app deve controllare questo stato prima di tentare di accedere a queste aree.
A ogni ID utente del profilo di lavoro vengono assegnate anche due chiavi: DE e CE. Quando la sfida di lavoro viene soddisfatta, l'utente del profilo viene sbloccato e KeyMint (in TEE) può fornire la chiave TEE del profilo.
Gestire gli aggiornamenti
La partizione di ripristino non è in grado di accedere allo spazio di archiviazione protetto da DE nella partizione userdata. I dispositivi che implementano FBE sono fortemente consigliati per supportare gli aggiornamenti OTA utilizzando gli aggiornamenti di sistema A/B. Poiché l'aggiornamento OTA può essere applicato durante il normale funzionamento, non è necessario il ripristino per accedere ai dati sull'unità criptata.
Quando utilizzi una soluzione OTA legacy, che richiede il ripristino per accedere al file OTA
nella partizione userdata
:
- Crea una directory di primo livello (ad esempio
misc_ne
) nella partizioneuserdata
. - Configura questa directory di primo livello in modo che non sia criptata (vedi Esclusione di directory).
- Crea una directory all'interno della directory di primo livello per contenere i pacchetti OTA.
- Aggiungi una regola SELinux e contesti di file per controllare l'accesso a questa directory e ai suoi contenuti. Solo il processo o le app che ricevono aggiornamenti OTA devono essere in grado di leggere e scrivere in questa directory. Nessun'altra app o processo deve avere accesso a questa directory.
Convalida
Per assicurarti che la versione implementata della funzionalità funzioni come previsto, esegui prima i numerosi test di crittografia CTS, ad esempio DirectBootHostTest e EncryptionTest.
Se il dispositivo esegue Android 11 o versioni successive, esegui anche vts_kernel_encryption_test:
atest vts_kernel_encryption_test
oppure:
vts-tradefed run vts -m vts_kernel_encryption_test
Inoltre, i produttori di dispositivi possono eseguire i seguenti test manuali. Su un dispositivo con crittografia basata su file abilitata:
- Verifica che
ro.crypto.state
esista- Assicurati che
ro.crypto.state
sia criptato
- Assicurati che
- Verifica che
ro.crypto.type
esista- Assicurati che
ro.crypto.type
sia impostato sufile
.
- Assicurati che
Inoltre, i tester possono verificare che l'archivio CE sia bloccato prima che il dispositivo sia
stato sbloccato per la prima volta dopo l'avvio. Per farlo, utilizza una build userdebug
o eng
, imposta un PIN, una sequenza o una password per l'utente principale e riavvia il dispositivo. Prima di sbloccare il dispositivo,
esegui il comando seguente per controllare lo spazio di archiviazione CE dell'utente principale. Se il
dispositivo utilizza la modalità utente
headless (la maggior parte dei dispositivi per il settore automobilistico), l'utente principale è l'utente 10, quindi esegui:
adb root; adb shell ls /data/user/10
Su altri dispositivi (la maggior parte dei dispositivi non Automotive), l'utente principale è l'utente 0, quindi esegui:
adb root; adb shell ls /data/user/0
Verifica che i nomi dei file elencati siano codificati in Base64, il che indica che i nomi dei file sono criptati e la chiave per decriptarli non è ancora disponibile. Se i nomi dei file sono elencati in testo normale, qualcosa non va.
I produttori di dispositivi sono inoltre invitati a esplorare l'esecuzione dei test Linux upstream per fscrypt sui propri dispositivi o kernel. Questi test fanno parte della suite di test del file system xfstests. Tuttavia, questi test upstream non sono supportati ufficialmente da Android.
Dettagli di implementazione AOSP
Questa sezione fornisce dettagli sull'implementazione di AOSP e descrive il funzionamento della crittografia basata su file. I produttori di dispositivi non dovrebbero dover apportare modifiche per utilizzare la crittografia basata su file e l'avvio diretto sui propri dispositivi.
Crittografia fscrypt
L'implementazione AOSP utilizza la crittografia "fscrypt" (supportata da ext4 e f2fs) nel kernel e normalmente è configurata per:
- Criptare i contenuti dei file con AES-256 in modalità XTS
- Criptare i nomi dei file con AES-256 in modalità CBC-CTS
È supportata anche la crittografia Adiantum. Quando la crittografia Adiantum è attivata, sia i contenuti dei file sia i nomi dei file vengono criptati con Adiantum.
fscrypt supporta due versioni delle norme di crittografia: la versione 1 e la versione 2. La versione 1 è ritirata e i requisiti CDD per i dispositivi lanciati con Android 11 e versioni successive sono compatibili solo con la versione 2. I criteri di crittografia della versione 2 utilizzano HKDF-SHA512 per derivare le chiavi di crittografia effettive dalle chiavi fornite dallo spazio utente.
Per saperne di più su fscrypt, consulta la documentazione del kernel upstream.
Classi di archiviazione
La tabella seguente elenca le chiavi FBE e le directory che proteggono in modo più dettagliato:
Classe di archiviazione | Descrizione | Elenchi |
---|---|---|
Non criptato | Directory in /data che non possono o non devono essere
protette da FBE. Sui dispositivi che utilizzano la crittografia
dei metadati, queste directory non sono realmente non criptate, ma sono protette dalla chiave di crittografia dei metadati, che è equivalente alla crittografia del sistema. |
|
System DE | Dati criptati sul dispositivo non associati a un utente specifico |
|
Per avvio | File di sistema effimeri che non devono sopravvivere a un riavvio | /data/per_boot |
User CE (internal) | Dati criptati con credenziali per utente nello spazio di archiviazione interno |
|
Utente DE (interno) | Dati criptati per dispositivo per utente nell'archivio interno |
|
User CE (adoptable) | Dati criptati con credenziali per utente nello spazio di archiviazione adottabile |
|
Utente DE (adottabile) | Dati criptati per dispositivo per utente nello spazio di archiviazione adattabile |
|
Archiviazione e protezione delle chiavi
Tutte le chiavi FBE sono gestite da vold
e vengono archiviate criptate su disco,
ad eccezione della chiave per avvio, che non viene archiviata. La tabella seguente
elenca le posizioni in cui sono archiviate le varie chiavi FBE:
Tipo di chiave | Posizione della chiave | Classe di archiviazione della posizione della chiave |
---|---|---|
Chiave DE del sistema | /data/unencrypted |
Non criptato |
Chiavi CE (interna) utente | /data/misc/vold/user_keys/ce/${user_id} |
System DE |
Chiavi DE (interne) utente | /data/misc/vold/user_keys/de/${user_id} |
System DE |
Chiavi CE (adottabili) utente | /data/misc_ce/${user_id}/vold/volume_keys/${volume_uuid} |
User CE (internal) |
Chiavi DE (adottabili) utente | /data/misc_de/${user_id}/vold/volume_keys/${volume_uuid} |
Utente DE (interno) |
Come mostrato nella tabella precedente, la maggior parte delle chiavi FBE viene archiviata in directory crittografate da un'altra chiave FBE. Le chiavi non possono essere sbloccate finché non viene sbloccata la classe di archiviazione che le contiene.
vold
applica anche un livello di crittografia a tutte le chiavi FBE. Ogni chiave
tranne le chiavi CE per l'archiviazione interna è criptata con AES-256-GCM utilizzando la propria chiave
Keystore che non è
esposta al di fuori del TEE. In questo modo, le chiavi FBE non possono essere sbloccate a meno che non sia stato avviato un sistema operativo attendibile, come imposto dall'Avvio verificato. La resistenza al rollback viene richiesta anche per la chiave Keystore, il che consente di eliminare in modo sicuro le chiavi FBE sui dispositivi in cui KeyMint supporta la resistenza al rollback. Come
fallback di tipo best-effort per i casi in cui la resistenza al rollback non è disponibile, viene utilizzato l'hash SHA-512 di 16384 byte casuali archiviati nel file secdiscardable
memorizzato
insieme alla chiave come Tag::APPLICATION_ID
della chiave Keystore. Per recuperare una chiave FBE, è necessario recuperare tutti questi byte.
Le chiavi CE per l'archivio interno ricevono un livello di protezione più elevato che garantisce che non possano essere sbloccate senza conoscere il fattore di conoscenza della schermata di blocco (LSKF) (PIN, sequenza o password) dell'utente, un token di reimpostazione del passcode sicuro o entrambe le chiavi lato client e lato server per un'operazione di Ripresa al riavvio. I token di reimpostazione del passcode possono essere creati solo per i profili di lavoro e i dispositivi completamente gestiti.
Per raggiungere questo obiettivo, vold
cripta ogni chiave CE per l'archiviazione interna
utilizzando una chiave AES-256-GCM derivata dalla password sintetica dell'utente.
La password sintetica è un segreto crittografico ad alta entropia immutabile che viene
generato in modo casuale per ogni utente. LockSettingsService
in
system_server
gestisce la password sintetica e i modi in cui
è protetta.
Per proteggere la password sintetica con LSKF,
LockSettingsService
prima allunga LSKF passandolo attraverso
scrypt
, con un tempo di circa 25 ms e un
utilizzo di memoria di circa 2 MiB. Poiché le LSKF sono in genere brevi, questo passaggio di solito
non offre molta sicurezza. Il livello principale di sicurezza è l'elemento
sicuro (SE) o la limitazione della frequenza imposta da TEE descritta di seguito.
Se il dispositivo ha un Secure Element (SE), LockSettingsService
mappa l'LSKF esteso a un secret casuale ad alta entropia memorizzato nel SE utilizzando
l'HAL Weaver. LockSettingsService
quindi cripta
la password sintetica due volte: prima con una chiave software derivata dalla
LSKF estesa e dal segreto di Weaver e poi con una chiave Keystore non associata all'autenticazione. Ciò fornisce la limitazione della frequenza applicata da SE delle ipotesi LSKF.
Se il dispositivo non ha un SE, LockSettingsService
utilizza invece
l'LSKF esteso come password Gatekeeper. LockSettingsService
cripta due volte la password sintetica: prima con una chiave software derivata dalla LSKF estesa e dall'hash di un file secdiscardable e poi con una chiave Keystore associata all'autenticazione della registrazione di Gatekeeper. Ciò fornisce la limitazione della frequenza di tentativi di indovinare LSKF imposta da TEE.
Quando viene modificata la LSKF, LockSettingsService
elimina tutte le informazioni associate al binding della password sintetica alla vecchia LSKF. Sui dispositivi che supportano le chiavi Keystore resistenti a Weaver o al rollback, questo
garantisce l'eliminazione sicura del vecchio binding. Per questo motivo, le protezioni
descritte qui vengono applicate anche quando l'utente non ha un LSKF.