Android 7.0 y versiones posteriores son compatibles con encriptación basada en archivos (FBE). FBE Permite encriptar distintos archivos con diferentes claves que se pueden desbloquear de forma independiente. Estas claves se usan para encriptar contenidos y nombres de 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 en el inicio encripta lo que sea el contenido no está encriptado por FBE. Esta clave está protegida por Keymaster, que, en turno está protegido por el inicio verificado.
La encriptación de metadatos siempre está habilitada en el almacenamiento adoptable siempre que el FBE esté habilitado. La encriptación de metadatos también se puede habilitar en el almacenamiento interno. Dispositivos lanzados con Android 11 o versiones posteriores debe tener encriptación de metadatos en el almacenamiento interno habilitado.
Implementación en el almacenamiento interno
Puedes configurar la encriptación de metadatos en el almacenamiento interno de los dispositivos nuevos de las siguientes maneras:
configurar el sistema de archivos metadata
, cambiar la secuencia de inicio y
habilitar 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. Por lo tanto, esta función solo está disponible para dispositivos nuevos. no es algo que una OTA debería cambiar.
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 hardware y
framework de encriptación independiente del 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 intercalada (hardware que
que encripta/desencripta datos mientras están en el camino hacia/desde el dispositivo de almacenamiento) cuando
disponibles. Si no usarás hardware de encriptación intercalada, es
también es necesario para 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
para implementar dm-default-key
.
Configura el sistema de archivos de metadatos
Debido a que no se puede leer nada en la partición userdata hasta que los metadatos clave de encriptación, la tabla particionada debe reservar un bloque separado partición llamada “partición de metadatos” para almacenar los BLOB de keymaster que proteger 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 en el momento del inicio El
El sistema de archivos f2fs no funciona en particiones más pequeñas; recomendamos usar la extensión 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, se debe ejecutar vold
antes
Se activó /data
. Para asegurarte de que se inicie con suficiente antelació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 el comando init intente activarse.
/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
Activando 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 Esto se puede anular estableciendo la
metadata_encryption
, también en la
Columna fs_mgr_flags:
- En los dispositivos sin aceleración AES, es posible que se aplique 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 el siguiente comando: de prueba que se describen a continuación. También ten en cuenta las problemas que se describen a continuación.
Pruebas
Comienza ejecutando el siguiente comando para verificar que la encriptación de metadatos esté habilitado 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 diferirá un poco del anterior. Por ejemplo, si habilitaste la encriptación Adiantum, el tercero
campo será 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 los metadatos encriptados
La partición /data
, init
ejecuta la herramienta vdc. La VDC
La herramienta se conecta a vold
mediante binder
para configurar la
con encriptación de metadatos y activar la partición. Mientras dure este
llamada, init
se bloquea y, luego, intenta leer o configurar
Se bloquearán las propiedades init
hasta que finalice mount_all
.
Si, en esta etapa, cualquier parte del trabajo de vold
está directamente o
Se bloqueará indirectamente durante la lectura o configuración de una propiedad y se producirá un interbloqueo. Sí
importante para asegurarse de que vold
pueda completar el trabajo de lectura del
claves, la interacción con Keymaster y la activación del directorio de datos sin
interactuando aún más con init
.
Si Keymaster no se inicia por completo cuando se ejecuta mount_all
, no se completará
responde a vold
hasta que haya leído ciertas propiedades de
init
, que da como resultado exactamente el interbloqueo descrito Ubicación
exec_start wait_for_keymaster
por encima del valor relevante
La invocación de mount_all
como se indica garantiza que Keymaster esté completamente
se ejecute con anticipación y, por lo tanto, evita este interbloqueo.
Configuración del 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 definir las siguientes propiedades del sistema para forzar el uso de la nueva método de encriptación de metadatos de volumen (y la nueva versión de política de FBE predeterminada) 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
módulo de kernel, al igual que en el almacenamiento interno. Consulta los requisitos previos anteriores para saber qué configuración de kernel
que habilitar. Ten en cuenta que el hardware de encriptación integrada que funciona
el almacenamiento interno del dispositivo no esté disponible en el almacenamiento adoptable y, por lo tanto,
Es posible que el campo CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y
sea obligatorio.
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. El
se puede anular con la configuración
Propiedad del sistema ro.crypto.volume.metadata.encryption
. Esta
el valor de la propiedad tiene la misma sintaxis que metadata_encryption
.
fstab descrita anteriormente. Por ejemplo, en dispositivos sin AES
aceleración, encriptación Adiantum
puede habilitarse estableciendo
ro.crypto.volume.metadata.encryption=adiantum
Método heredado
En dispositivos que se lanzan con Android 10 o versiones anteriores, los metadatos
la encriptación 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 personalizar el kernel para evitar la duplicación
encriptación, en particular, implementando
allow_encrypt_override
a la que pasará Android
dm-crypt
cuando la propiedad del sistema
ro.crypto.allow_encrypt_override
se establece en true
.
Estas personalizaciones no son compatibles con el kernel común de Android.
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. Esta
se puede anular configurando las siguientes propiedades del sistema (que también
para 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 la no tenga aceleración AES.ro.crypto.fde_sector_size
selecciona el tamaño del sector de las criptomonedas. Las opciones son 512, 1024, 2048 y 4096. Para la encriptación Adiantum, usa 4,096.