Android 7.0 y versiones posteriores son compatibles con encriptación basada en archivos (FBE). La FBE permite que diferentes archivos se encripten con diferentes claves que se pueden desbloquear de forma independiente. Estas claves se usan para encriptar el contenido y los nombres de los archivos. Cuando se usa FBE, otra información, como los diseños de directorio, el tamaño de los archivos y los horarios de creación o modificación, no está encriptado. En conjunto, esta otra información se conoce como metadatos del sistema de archivos.
En Android 9, se introdujo compatibilidad con la encriptación de metadatos. Con la encriptación de metadatos, una sola clave presente al momento del inicio encripta todo el contenido que no encripta la FBE. Esta clave está protegida por Keymaster, que, a su vez, está protegida por el inicio verificado.
La encriptación de metadatos siempre está habilitada en el almacenamiento adoptable cuando se habilita la FBE. La encriptación de metadatos también se puede habilitar en el almacenamiento interno. Los dispositivos que se inician con Android 11 o versiones posteriores deben tener habilitada la encriptación de metadatos en el almacenamiento interno.
Implementación en el almacenamiento interno
Para configurar la encriptación de metadatos en el almacenamiento interno de dispositivos nuevos, configura el sistema de archivos metadata
, cambia la secuencia de init y habilita la encriptación de metadatos en el archivo fstab del dispositivo.
Requisitos previos
La encriptación de metadatos solo se puede configurar cuando se inicia la partición de datos por primera vez con formato. Como resultado, esta función solo es para dispositivos nuevos; no es algo que deba cambiar una actualización inalámbrica.
La encriptación de metadatos requiere que el módulo dm-default-key
se
habilitado en tu kernel. En Android 11 y versiones posteriores, dm-default-key
es compatible con los kernels comunes de Android, versión 4.14 y versiones posteriores. Esta versión de dm-default-key
usa un framework de encriptación independiente del hardware y el proveedor llamado blk-crypto.
Para habilitar dm-default-key
, usa lo siguiente:
CONFIG_BLK_INLINE_ENCRYPTION=y CONFIG_FS_ENCRYPTION_INLINE_CRYPT=y CONFIG_DM_DEFAULT_KEY=y
dm-default-key
usa hardware de encriptación intercalado (hardware que encripta o desencripta datos mientras se envían o reciben desde el dispositivo de almacenamiento) cuando está disponible. Si no usas hardware de encriptación intercalado, también es necesario habilitar un resguardo a la API de criptografía del kernel:
CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y
Cuando no uses hardware de encriptación intercalada, también debes habilitar cualquier Aceleración basada en la CPU, como se recomienda en la documentación de FBE
En Android 10 y versiones anteriores, dm-default-key
no era compatible con el kernel común de Android. Por lo tanto, dependía de los proveedores implementar dm-default-key
.
Configura el sistema de archivos de metadatos
Debido a que no se puede leer nada en la partición de datos del usuario hasta que esté presente la clave de encriptación de metadatos, la tabla de particiones debe reservar una partición independiente llamada "partición de metadatos" para almacenar los fragmentos de Keymaster que protegen esta clave. La partición de metadatos debe ser de 16 MB.
fstab.hardware
debe incluir una entrada para el sistema de archivos de metadatos.
que se encuentra en esa partición y la activa en /metadata
, lo que incluye
la marca formattable
para garantizar que tenga formato al momento del inicio El
El sistema de archivos f2fs no funciona en particiones más pequeñas; recomendamos usar ext4
en su lugar. Por ejemplo:
/dev/block/bootdevice/by-name/metadata /metadata ext4 noatime,nosuid,nodev,discard wait,check,formattable
Para asegurarte de que exista el punto de activación /metadata
, agrega la siguiente línea
a BoardConfig-common.mk
:
BOARD_USES_METADATA_PARTITION := true
Cambios en la secuencia de inicio
Cuando se usa la encriptación de metadatos, vold
debe estar en ejecución antes de que se monte /data
. Para asegurarte de que se inicie con suficiente anticipación, agrega la siguiente estrofa a init.hardware.rc
:
# We need vold early for metadata encryption on early-fs start vold
Keymaster debe estar en ejecución y listo antes de que init intente activar /data
.
init.hardware.rc
ya debe contener un mount_all
.
instrucción que activa /data
en la estrofa on
late-fs
. Antes de esta línea, agrega la directiva para ejecutar la
Servicio 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
Activa la encriptación de metadatos
Por último, agrega keydirectory=/metadata/vold/metadata_encryption
al
la columna fs_mgr_flags de la entrada fstab
para
userdata
Por ejemplo, una línea fstab completa se vería de la siguiente manera:
/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
De forma predeterminada, el algoritmo de encriptación de metadatos
AES-256-XTS Para anular esta configuración, establece la opción metadata_encryption
, también en la columna fs_mgr_flags:
- En los dispositivos sin aceleración AES, se puede aplicar la encriptación Adiantum
habilitado mediante la configuración de
metadata_encryption=adiantum
. - En dispositivos que admiten llaves unidas en hardware,
la clave de encriptación de metadatos puede unirse al hardware estableciendo
metadata_encryption=aes-256-xts:wrappedkey_v0
(o equivalente ametadata_encryption=:wrappedkey_v0
, ya queaes-256-xts
es el algoritmo predeterminado).
Debido a que la interfaz del kernel a dm-default-key
cambió en Android 11, también debes asegurarte de haber establecido el valor correcto para PRODUCT_SHIPPING_API_LEVEL
en device.mk
. Por ejemplo, si tu dispositivo se inicia con Android
11 (nivel de API 30), device.mk
debería
contienen:
PRODUCT_SHIPPING_API_LEVEL := 30
También puedes establecer la siguiente propiedad del sistema para forzar el uso de la nueva
API de dm-default-key
, independientemente del nivel de API de envío:
PRODUCT_PROPERTY_OVERRIDES += \ ro.crypto.dm_default_key.options_format.version=2
Validación
Para verificar que la encriptación de metadatos esté habilitada y funcione correctamente, ejecuta las pruebas que se describen a continuación. Además, ten en cuenta los problemas comunes que se describen a continuación.
Pruebas
Para comenzar, ejecuta el siguiente comando para verificar que la encriptación de metadatos esté habilitada en el almacenamiento interno:
adb root
adb shell dmctl table userdata
El resultado debería ser similar al siguiente:
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
Si anulaste la configuración de encriptación predeterminada al establecer
la opción metadata_encryption
en el fstab
del dispositivo y, luego,
el resultado difiere un poco del anterior. Por ejemplo, si habilitaste la encriptación Adiantum, el tercero
campo es xchacha12,aes-adiantum-plain64
en lugar de
aes-xts-plain64
A continuación, ejecuta vts_kernel_encryption_test para verificar la precisión de la encriptación de metadatos y el FBE:
atest vts_kernel_encryption_test
O bien:
vts-tradefed run vts -m vts_kernel_encryption_test
Problemas comunes
Durante la llamada a mount_all
, que activa la partición /data
encriptada con metadatos, init
ejecuta la herramienta vdc. La herramienta vdc se conecta a vold
a través de binder
para configurar el dispositivo encriptado con metadatos y activar la partición. Durante esta llamada, init
está bloqueado y se intenta leer o establecer el bloque de propiedades init
hasta que finaliza mount_all
.
Si, en esta etapa, alguna parte del trabajo de vold
está bloqueada directa o indirectamente para leer o establecer una propiedad, se produce un interbloqueo. Es
importante asegurarse de que vold
pueda completar el trabajo de leer las
llaves, interactuar con Keymaster y activar el directorio de datos sin
interactuar más con init
.
Si Keymaster no se inicia por completo cuando se ejecuta mount_all
, no
responde a vold
hasta que haya leído ciertas propiedades de
init
, que da como resultado exactamente el interbloqueo descrito Colocar exec_start wait_for_keymaster
sobre la invocación mount_all
relevante como se establece garantiza que Keymaster se ejecute por completo de antemano y, por lo tanto, evita este interbloqueo.
Configuración en el almacenamiento adoptable
A partir de Android 9, una forma de encriptación de metadatos es Siempre se habilita en el almacenamiento adoptable. siempre que FBE esté habilitada, incluso cuando la encriptación de metadatos no esté habilitada almacenamiento interno.
En el AOSP, hay dos implementaciones de encriptación de metadatos
almacenamiento: uno obsoleto basado en dm-crypt
y uno más reciente basado en
en dm-default-key
. Para garantizar que se realice
para tu dispositivo, asegúrate de haber establecido el valor correcto para
PRODUCT_SHIPPING_API_LEVEL
en device.mk
. Por ejemplo, si tu dispositivo se inicia con Android 11 (nivel de API 30), device.mk
debe contener lo siguiente:
PRODUCT_SHIPPING_API_LEVEL := 30
También puedes establecer las siguientes propiedades del sistema para forzar el uso del nuevo método de encriptación de metadatos de volumen (y la nueva versión predeterminada de la política de FBE) independientemente del nivel de API de envío:
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
Método actual
En los dispositivos que se lanzan con Android 11 o versiones posteriores, haz lo siguiente:
la encriptación de metadatos en el almacenamiento adoptable utiliza el dm-default-key
de código abierto, tal como en el almacenamiento interno. Consulta los requisitos previos anteriores para saber qué opciones de configuración del kernel debes habilitar. Ten en cuenta que el hardware de encriptación intercalado que funciona en el almacenamiento interno del dispositivo podría no estar disponible en el almacenamiento adoptable, por lo que podría ser necesario CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y
.
De forma predeterminada, el método de encriptación de metadatos del volumen dm-default-key
usa el algoritmo de encriptación AES-256-XTS con sectores criptográficos de 4,096 bytes. Para anular el algoritmo, configura la propiedad del sistema ro.crypto.volume.metadata.encryption
. El valor de esta propiedad tiene la misma sintaxis que la opción fstab metadata_encryption
que se describió anteriormente. Por ejemplo, en dispositivos que no tienen aceleración de AES, se puede habilitar la encriptación Adiantum configurando ro.crypto.volume.metadata.encryption=adiantum
.
Método heredado
En los dispositivos que se inician con Android 10 o versiones anteriores, la encriptación de metadatos en el almacenamiento adoptable usa el módulo de kernel dm-crypt
en lugar de dm-default-key
:
CONFIG_DM_CRYPT=y
A diferencia del método dm-default-key
, el método dm-crypt
hace que el contenido del archivo se encripte dos veces: una con una clave FBE y otra con
la clave de encriptación de metadatos. Esta doble encriptación reduce el rendimiento y es
no es necesario para lograr los objetivos de seguridad de la encriptación de metadatos, ya que Android
garantiza que las claves de FBE sean al menos tan difíciles de comprometer como los metadatos
clave de encriptación. Los proveedores pueden realizar personalizaciones del kernel para evitar la doble encriptación, en particular, implementando la opción allow_encrypt_override
que Android pasa a dm-crypt
cuando la propiedad del sistema ro.crypto.allow_encrypt_override
se establece en true
.
El kernel común de Android no admite estas personalizaciones.
De forma predeterminada, el método de encriptación de metadatos del volumen dm-crypt
usa el
Algoritmo de encriptación AES-128-CBC con sectores ESSIV y criptográficos de 512 bytes. Para anular esta opción, configura las siguientes propiedades del sistema (que también se usan para la FDE):
ro.crypto.fde_algorithm
selecciona la encriptación de metadatos. de codificador-decodificador. Las opciones sonaes-128-cbc
yadiantum
. Adiantum solo se puede usar si el dispositivo no tiene aceleración de AES.ro.crypto.fde_sector_size
selecciona el tamaño del sector de criptomonedas. Las opciones son 512, 1024, 2048 y 4096. Para la encriptación Adiantum, usa 4096.