Android 7.0 e versioni successive supportano la crittografia basata su file (FBE). FBE consente di crittografare file diversi con chiavi diverse che possono essere sbloccate in modo indipendente. Queste chiavi vengono utilizzate per crittografare sia i contenuti dei file che i nomi dei file. Quando si utilizza FBE, altre informazioni, come layout di directory, dimensioni dei file, autorizzazioni e tempi di creazione/modifica, non vengono crittografate. Collettivamente, queste altre informazioni sono note come metadati del filesystem.
Android 9 ha introdotto il supporto per la crittografia dei metadati. Con la crittografia dei metadati, una singola chiave presente al momento dell'avvio crittografa qualunque contenuto non sia crittografato da FBE. Questa chiave è protetta da Keymaster, che a sua volta è protetta da un avvio verificato.
La crittografia dei metadati è sempre abilitata sull'archiviazione adottabile ogni volta che FBE è abilitato. La crittografia dei metadati può essere abilitata anche sulla memoria interna. I dispositivi lanciati con Android 11 o versioni successive devono avere la crittografia dei metadati sulla memoria interna abilitata.
Implementazione su memoria interna
È possibile impostare la crittografia dei metadati sull'archiviazione interna dei nuovi dispositivi impostando il filesystem metadata
, modificando la sequenza di init e abilitando la crittografia dei metadati nel file fstab del dispositivo.
Prerequisiti
La crittografia dei metadati può essere impostata solo quando la partizione dati viene formattata per la prima volta. Di conseguenza, questa funzione è solo per i nuovi dispositivi; questo non è qualcosa che un OTA dovrebbe cambiare.
La crittografia dei metadati richiede che il modulo dm-default-key
sia abilitato nel kernel. In Android 11 e versioni successive, dm-default-key
è supportato dai kernel comuni di Android, versione 4.14 e successive. Questa versione di dm-default-key
utilizza un framework di crittografia hardware e indipendente dal fornitore chiamato blk-crypto .
Per abilitare dm-default-key
, usa:
CONFIG_BLK_INLINE_ENCRYPTION=y CONFIG_FS_ENCRYPTION_INLINE_CRYPT=y CONFIG_DM_DEFAULT_KEY=y
dm-default-key
utilizza l'hardware di crittografia in linea (hardware che crittografa/decrittografa i dati mentre è in viaggio verso/dal dispositivo di archiviazione) quando disponibile. Se non utilizzerai l'hardware di crittografia in linea, è anche necessario abilitare un fallback all'API di crittografia del kernel:
CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y
Quando non si utilizza l'hardware di crittografia in linea, è necessario abilitare anche qualsiasi accelerazione basata sulla CPU disponibile, come consigliato nella documentazione FBE .
In Android 10 e versioni precedenti, dm-default-key
non era supportato dal kernel comune di Android. Spettava quindi ai fornitori implementare dm-default-key
.
Imposta il filesystem dei metadati
Poiché nulla nella partizione userdata può essere letto fino a quando non è presente la chiave di crittografia dei metadati, la tabella delle partizioni deve mettere da parte una partizione separata denominata "partizione metadati" per l'archiviazione dei BLOB keymaster che proteggono questa chiave. La partizione dei metadati dovrebbe essere di 16 MB.
fstab.hardware
deve includere una voce per il filesystem dei metadati che vive su quella partizione montandolo in /metadata
, incluso il flag formattable
per assicurarsi che sia formattato al momento dell'avvio. Il filesystem f2fs non funziona su partizioni più piccole; si consiglia invece di utilizzare ext4. Per esempio:
/dev/block/bootdevice/by-name/metadata /metadata ext4 noatime,nosuid,nodev,discard wait,check,formattable
Per assicurarti che il punto di montaggio /metadata
esista, aggiungi la seguente riga a BoardConfig-common.mk
:
BOARD_USES_METADATA_PARTITION := true
Modifiche alla sequenza init
Quando viene utilizzata la crittografia dei metadati, vold
deve essere in esecuzione prima che venga montato /data
. Per assicurarti che venga avviato abbastanza presto, aggiungi la seguente stanza a init.hardware.rc
:
# We need vold early for metadata encryption on early-fs start vold
Keymaster deve essere in esecuzione e pronto prima che init tenti di montare /data
.
init.hardware.rc
dovrebbe già contenere un'istruzione mount_all
che monta /data
stesso nella stanza on late-fs
. Prima di questa riga, aggiungi la direttiva per eseguire il servizio wait_for_keymaster
:
on late-fs … # Wait for keymaster exec_start wait_for_keymaster # Mount RW partitions which need run fsck mount_all /vendor/etc/fstab.${ro.boot.hardware.platform} --late
Attivazione della crittografia dei metadati
Infine aggiungi keydirectory=/metadata/vold/metadata_encryption
alla colonna fs_mgr_flags della voce fstab
per userdata
. Ad esempio, una riga fstab completa potrebbe essere simile a:
/dev/block/bootdevice/by-name/userdata /data f2fs noatime,nosuid,nodev,discard,inlinecrypt latemount,wait,check,fileencryption=aes-256-xts:aes-256-cts:inlinecrypt_optimized,keydirectory=/metadata/vold/metadata_encryption,quota,formattable
Per impostazione predefinita, l'algoritmo di crittografia dei metadati sulla memoria interna è AES-256-XTS. Questo può essere ignorato impostando l'opzione metadata_encryption
, anche nella colonna fs_mgr_flags :
- Sui dispositivi privi di accelerazione AES, la crittografia Adiantum può essere abilitata impostando
metadata_encryption=adiantum
. - Sui dispositivi che supportano chiavi con wrapping hardware , la chiave di crittografia dei metadati può essere codificata con hardware impostando
metadata_encryption=aes-256-xts:wrappedkey_v0
(o equivalentementemetadata_encryption=:wrappedkey_v0
, poichéaes-256-xts
è l'algoritmo predefinito).
Poiché l'interfaccia del kernel per dm-default-key
è cambiata in Android 11, devi anche assicurarti di aver impostato il valore corretto per PRODUCT_SHIPPING_API_LEVEL
in device.mk
. Ad esempio, se il tuo dispositivo viene avviato con Android 11 (livello API 30), device.mk
dovrebbe contenere:
PRODUCT_SHIPPING_API_LEVEL := 30
Puoi anche impostare la seguente proprietà di sistema per forzare l'uso della nuova API dm-default-key
indipendentemente dal livello dell'API di spedizione:
PRODUCT_PROPERTY_OVERRIDES += \ ro.crypto.dm_default_key.options_format.version=2
Convalida
Per verificare che la crittografia dei metadati sia abilitata e funzioni correttamente, eseguire i test descritti di seguito. Inoltre, tieni presente i problemi comuni descritti di seguito.
Test
Inizia eseguendo il seguente comando per verificare che la crittografia dei metadati sia abilitata nella memoria interna:
adb root
adb shell dmctl table userdata
L'output dovrebbe essere simile a:
Targets in the device-mapper table for userdata: 0-4194304: default-key, aes-xts-plain64 - 0 252:2 0 3 allow_discards sector_size:4096 iv_large_sectors
Se hai ignorato le impostazioni di crittografia predefinite impostando l'opzione metadata_encryption
nel fstab
del dispositivo, l'output sarà leggermente diverso da quanto sopra. Ad esempio, se hai abilitato la crittografia Adiantum , il terzo campo sarà xchacha12,aes-adiantum-plain64
invece di aes-xts-plain64
.
Successivamente, esegui vts_kernel_encryption_test per verificare la correttezza della crittografia dei metadati e FBE:
atest vts_kernel_encryption_test
O:
vts-tradefed run vts -m vts_kernel_encryption_test
Problemi comuni
Durante la chiamata a mount_all
, che monta la partizione /data
crittografata con metadati, init
esegue lo strumento vdc. Lo strumento vdc si connette a vold
over binder
per configurare il dispositivo crittografato con metadati e montare la partizione. Per la durata di questa chiamata, init
è bloccato e i tentativi di leggere o impostare le proprietà init
si bloccheranno fino al termine di mount_all
. Se, in questa fase, qualsiasi parte del lavoro di vold
è direttamente o indirettamente bloccata durante la lettura o l'impostazione di una proprietà, si verificherà un deadlock. È importante assicurarsi che vold
possa completare il lavoro di lettura delle chiavi, interazione con Keymaster e montaggio della directory dei dati senza interagire ulteriormente con init
.
Se Keymaster non è completamente avviato durante l'esecuzione mount_all
, non risponderà a vold
fino a quando non avrà letto determinate proprietà da init
, risultando esattamente nel deadlock descritto. L'inserimento exec_start wait_for_keymaster
sopra l'invocazione mount_all
pertinente come stabilito garantisce che Keymaster sia completamente in esecuzione in anticipo e quindi eviti questo deadlock.
Configurazione su memoria adottabile
A partire da Android 9, una forma di crittografia dei metadati è sempre abilitata sull'archiviazione adottabile ogni volta che FBE è abilitato, anche quando la crittografia dei metadati non è abilitata sull'archiviazione interna.
In AOSP, esistono due implementazioni della crittografia dei metadati sull'archiviazione adottabile: una deprecata basata su dm-crypt
e una più recente basata su dm-default-key
. Per assicurarti che sia selezionata l'implementazione corretta per il tuo dispositivo, assicurati di aver impostato il valore corretto per PRODUCT_SHIPPING_API_LEVEL
in device.mk
. Ad esempio, se il tuo dispositivo viene avviato con Android 11 (livello API 30), device.mk
dovrebbe contenere:
PRODUCT_SHIPPING_API_LEVEL := 30
Puoi anche impostare le seguenti proprietà di sistema per forzare l'uso del nuovo metodo di crittografia dei metadati del volume (e la nuova versione predefinita della policy FBE) indipendentemente dal livello dell'API di spedizione:
PRODUCT_PROPERTY_OVERRIDES += \ ro.crypto.volume.metadata.method=dm-default-key \ ro.crypto.dm_default_key.options_format.version=2 \ ro.crypto.volume.options=::v2
Metodo corrente
Sui dispositivi che si avviano con Android 11 o versioni successive, la crittografia dei metadati nell'archiviazione adottabile utilizza il modulo kernel dm-default-key
, proprio come nell'archiviazione interna. Vedere i prerequisiti sopra per quali opzioni di configurazione del kernel abilitare. Si noti che l'hardware di crittografia in linea che funziona sulla memoria interna del dispositivo potrebbe non essere disponibile sulla memoria adottabile, e quindi CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y
potrebbe essere richiesto.
Per impostazione predefinita, il metodo di crittografia dei metadati del volume dm-default-key
utilizza l'algoritmo di crittografia AES-256-XTS con settori crittografici da 4096 byte. L'algoritmo può essere sovrascritto impostando la proprietà di sistema ro.crypto.volume.metadata.encryption
. Il valore di questa proprietà ha la stessa sintassi dell'opzione metadata_encryption
fstab descritta sopra. Ad esempio, su dispositivi privi di accelerazione AES, la crittografia Adiantum può essere abilitata impostando ro.crypto.volume.metadata.encryption=adiantum
.
Metodo ereditario
Sui dispositivi che si avviano con Android 10 o versioni precedenti, la crittografia dei metadati sull'archiviazione adottabile utilizza il modulo del kernel dm-crypt
anziché dm-default-key
:
CONFIG_DM_CRYPT=y
A differenza del metodo dm-default-key
, il metodo dm-crypt
fa sì che il contenuto del file venga crittografato due volte: una volta con una chiave FBE e una volta con la chiave di crittografia dei metadati. Questa doppia crittografia riduce le prestazioni e non è necessaria per raggiungere gli obiettivi di sicurezza della crittografia dei metadati, poiché Android garantisce che le chiavi FBE siano difficili da compromettere almeno quanto la chiave di crittografia dei metadati. I fornitori possono effettuare personalizzazioni del kernel per evitare la doppia crittografia, in particolare implementando l'opzione allow_encrypt_override
che Android passerà a dm-crypt
quando la proprietà di sistema ro.crypto.allow_encrypt_override
è impostata su true
. Queste personalizzazioni non sono supportate dal kernel comune di Android.
Per impostazione predefinita, il metodo di crittografia dei metadati del volume dm-crypt
utilizza l'algoritmo di crittografia AES-128-CBC con settori crittografici ESSIV e 512 byte. Questo può essere ignorato impostando le seguenti proprietà di sistema (utilizzate anche per FDE):
-
ro.crypto.fde_algorithm
seleziona l'algoritmo di crittografia dei metadati. Le scelte sonoaes-128-cbc
eadiantum
. Adiantum può essere utilizzato solo se il dispositivo è privo di accelerazione AES. -
ro.crypto.fde_sector_size
seleziona la dimensione del settore crittografico. Le scelte sono 512, 1024, 2048 e 4096. Per la crittografia Adiantum, utilizzare 4096.