Android 7.0 et versions ultérieures sont compatibles avec le chiffrement basé sur les fichiers (FBE, File-Based Encryption). Le FBE permet de chiffrer différents fichiers avec des clés différentes qui peuvent être déverrouillées indépendamment. Ces clés sont utilisées pour chiffrer à la fois le contenu et les noms des fichiers. Lorsque le FBE est utilisé, d'autres informations, telles que les mises en page des répertoires, les tailles de fichiers, les autorisations et les heures de création/modification, ne sont pas chiffrées. Collectivement, ces autres informations sont appelées métadonnées du système de fichiers.
Android 9 a introduit la prise en charge du chiffrement des métadonnées. Avec le chiffrement des métadonnées, une seule clé présente au moment du démarrage chiffre tout contenu non chiffré par le FBE. Cette clé est protégée par KeyMint (anciennement Keymaster), qui est elle-même protégée par le démarrage validé.
Le chiffrement des métadonnées est toujours activé sur le stockage adoptable lorsque le FBE est activé. Le chiffrement des métadonnées peut également être activé sur le stockage interne. Les appareils lancés avec Android 11 ou version ultérieure doivent avoir le chiffrement des métadonnées activé sur la mémoire de stockage interne.
Implémentation sur la mémoire de stockage interne
Vous pouvez configurer le chiffrement des métadonnées sur la mémoire de stockage interne des nouveaux appareils en configurant le système de fichiers metadata, en modifiant la séquence d'initialisation et en activant le chiffrement des métadonnées dans le fichier fstab de l'appareil.
Prérequis
Le chiffrement des métadonnées ne peut être configuré que lors du premier formatage de la partition de données. Par conséquent, cette fonctionnalité est réservée aux nouveaux appareils. Elle ne doit pas être modifiée par une mise à jour OTA.
Le chiffrement des métadonnées nécessite que le module dm-default-key soit activé dans votre noyau. Dans Android 11 et versions ultérieures, dm-default-key est compatible avec les noyaux communs Android, version 4.14 et ultérieures. Cette version de dm-default-key utilise un framework de chiffrement indépendant du matériel et du fournisseur appelé blk-crypto.
Pour activer dm-default-key, utilisez :
CONFIG_BLK_INLINE_ENCRYPTION=y CONFIG_FS_ENCRYPTION_INLINE_CRYPT=y CONFIG_DM_DEFAULT_KEY=y
dm-default-key utilise le matériel de chiffrement intégré (matériel qui chiffre/déchiffre les données lors de leur transfert vers/depuis le périphérique de stockage) lorsqu'il est disponible. Si vous n'utilisez pas de matériel de chiffrement intégré, il est également nécessaire d'activer un retour à l'API de chiffrement du noyau :
CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y
Lorsque vous n'utilisez pas de matériel de chiffrement intégré, vous devez également activer toute accélération disponible basée sur le processeur, comme recommandé dans la documentation FBE.
Dans Android 10 et versions antérieures, dm-default-key n'était pas compatible avec le noyau commun Android. Il appartenait donc aux fournisseurs d'implémenter dm-default-key.
Configurer le système de fichiers de métadonnées
Étant donné que rien ne peut être lu dans la partition userdata tant que la clé de chiffrement des métadonnées n'est pas présente, la table de partition doit mettre de côté une partition distincte appelée partition de métadonnées pour stocker les blobs KeyMint qui protègent cette clé. La partition de métadonnées doit être de 16 Mo.
fstab.hardware doit inclure une entrée pour le système de fichiers de métadonnées qui réside sur cette partition, en la montant sur /metadata, y compris l'indicateur formattable pour s'assurer qu'elle est formatée au moment du démarrage. Le système de fichiers f2fs ne fonctionne pas sur les partitions plus petites. Nous vous recommandons d'utiliser plutôt ext4. Exemple :
/dev/block/bootdevice/by-name/metadata /metadata ext4 noatime,nosuid,nodev,discard wait,check,formattable
Pour vous assurer que le point d'installation /metadata existe, ajoutez la ligne suivante à BoardConfig-common.mk :
BOARD_USES_METADATA_PARTITION := true
Modifications apportées à la séquence d'initialisation
Lorsque le chiffrement des métadonnées est utilisé, vold doit être exécuté avant le montage de /data. Pour vous assurer qu'il démarre suffisamment tôt, ajoutez la strophe suivante à init.hardware.rc :
# We need vold early for metadata encryption
on early-fs
start vold
KeyMint doit être en cours d'exécution et prêt avant que l'initialisation ne tente de monter /data.
init.hardware.rc doit déjà contenir une mount_all
instruction qui monte /data lui-même dans la strophe on
late-fs. Avant cette ligne, ajoutez la directive pour exécuter le service 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
Activer le chiffrement des métadonnées
Enfin, ajoutez keydirectory=/metadata/vold/metadata_encryption à la colonne fs_mgr_flags de l'entrée fstab pour userdata. Par exemple, une ligne fstab complète peut se présenter comme suit :
/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
Par défaut, l'algorithme de chiffrement des métadonnées sur la mémoire de stockage interne est AES-256-XTS. Vous pouvez remplacer ce paramètre en définissant l'option metadata_encryption, également dans la colonne fs_mgr_flags :
- Sur les appareils qui ne disposent pas d'accélération AES, le chiffrement Adiantum peut être
activé en définissant
metadata_encryption=adiantum. Sur les appareils qui prennent en charge les clés de chiffrement intégrées encapsulées dans le matériel, la clé de chiffrement des métadonnées peut être encapsulée dans le matériel en définissant
metadata_encryption=aes-256-xts:wrappedkeyoumetadata_encryption=aes-256-xts:wrappedkey_v0.wrappedkeyest la version moderne.wrappedkey_v0ne doit être utilisé que sur les appareils qui ne sont pas compatibles avecwrappedkeyou qui ont déjà été lancés avecwrappedkey_v0. Pour en savoir plus, consultez Activer les clés encapsulées.Dans les deux cas,
aes-256-xtspeut être omis, car il s'agit de l' algorithme par défaut. Par exemple,metadata_encryption=:wrappedkeyéquivaut àmetadata_encryption=aes-256-xts:wrappedkey.
Étant donné que l'interface du noyau vers dm-default-key a changé dans Android 11, vous devez également vous assurer que vous avez défini la valeur correcte pour PRODUCT_SHIPPING_API_LEVEL dans device.mk. Par exemple, si votre appareil est lancé avec Android 11 (niveau d'API 30), device.mk doit contenir :
PRODUCT_SHIPPING_API_LEVEL := 30
Vous pouvez également définir la propriété système suivante pour forcer l'utilisation de la nouvelle API dm-default-key, quel que soit le niveau d'API de livraison :
PRODUCT_PROPERTY_OVERRIDES += \
ro.crypto.dm_default_key.options_format.version=2
Validation
Pour vérifier que le chiffrement des métadonnées est activé et fonctionne correctement, exécutez les tests décrits ci-dessous. Tenez également compte des problèmes courants décrits ci-dessous.
Tests
Commencez par exécuter la commande suivante pour vérifier que le chiffrement des métadonnées est activé sur la mémoire de stockage interne :
adb rootadb shell dmctl table userdata
Le résultat doit être semblable à ceci :
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 vous avez remplacé les paramètres de chiffrement par défaut en définissant l'option metadata_encryption dans le fichier fstab de l'appareil, le résultat est légèrement différent de celui ci-dessus. Par exemple, si vous avez activé le chiffrement Adiantum, le troisième
champ est xchacha12,aes-adiantum-plain64 au lieu de
aes-xts-plain64.
Ensuite, exécutez vts_kernel_encryption_test pour vérifier l'exactitude du chiffrement des métadonnées et du FBE :
atest vts_kernel_encryption_test
ou :
vts-tradefed run vts -m vts_kernel_encryption_test
Problèmes courants
Lors de l'appel à mount_all, qui monte la partition /data chiffrée par métadonnées, init exécute l'outil vdc. L'outil vdc se connecte à vold via binder pour configurer l'appareil chiffré par métadonnées et monter la partition. Pendant la durée de cet appel, init est bloqué, et les tentatives de lecture ou de définition des propriétés init sont bloquées jusqu'à la fin de mount_all.
Si, à ce stade, une partie du travail de vold est bloquée directement ou indirectement lors de la lecture ou de la définition d'une propriété, un interblocage se produit. Il est important de s'assurer que vold peut effectuer la lecture des clés, interagir avec KeyMint et monter le répertoire de données sans interagir davantage avec init.
Si KeyMint n'est pas complètement démarré lorsque mount_all s'exécute, il ne répond pas à vold tant qu'il n'a pas lu certaines propriétés à partir de init, ce qui entraîne exactement l'interblocage décrit. Placer exec_start wait_for_keymaster au-dessus de l'appel mount_all approprié, comme indiqué, garantit que KeyMint est entièrement exécuté à l'avance et évite ainsi cet interblocage.
Configuration sur le stockage adoptable
Depuis Android 9, une forme de chiffrement des métadonnées est toujours activée sur le stockage adoptable lorsque le FBE est activé, même lorsque le chiffrement des métadonnées n'est pas activé sur le stockage interne.
Dans AOSP, il existe deux implémentations du chiffrement des métadonnées sur le stockage adoptable : une implémentation obsolète basée sur dm-crypt et une implémentation plus récente basée sur dm-default-key. Pour vous assurer que l'implémentation correcte est sélectionnée pour votre appareil, vérifiez que vous avez défini la valeur correcte pour PRODUCT_SHIPPING_API_LEVEL dans device.mk. Par exemple, si votre appareil est lancé avec Android 11 (niveau d'API 30), device.mk doit contenir :
PRODUCT_SHIPPING_API_LEVEL := 30
Vous pouvez également définir les propriétés système suivantes pour forcer l'utilisation de la nouvelle méthode de chiffrement des métadonnées de volume (et de la nouvelle version de la stratégie FBE par défaut), quel que soit le niveau d'API de livraison :
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éthode actuelle
Sur les appareils lancés avec Android 11 ou version ultérieure, le chiffrement des métadonnées sur le stockage adoptable utilise le module de noyau dm-default-key, comme sur la mémoire de stockage interne. Consultez les prérequis ci-dessus pour connaître les options de configuration du noyau
à activer. Notez que le matériel de chiffrement intégré qui fonctionne sur la mémoire de stockage interne de l'appareil peut ne pas être disponible sur le stockage adoptable. Par conséquent, CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y peut être requis.
Par défaut, la méthode de chiffrement des métadonnées de volume dm-default-key utilise l'algorithme de chiffrement AES-256-XTS avec des secteurs cryptographiques de 4 096 octets. L'algorithme peut être remplacé en définissant la propriété système ro.crypto.volume.metadata.encryption. La valeur de cette propriété a la même syntaxe que l'option fstab metadata_encryption décrite ci-dessus. Par exemple, sur les appareils qui ne disposent pas d'accélération AES, le chiffrement Adiantum
peut être activé en définissant
ro.crypto.volume.metadata.encryption=adiantum.
Ancienne méthode
Sur les appareils lancés avec Android 10 et versions antérieures, le chiffrement des métadonnées sur le stockage adoptable utilise le module de noyau dm-crypt plutôt que dm-default-key :
CONFIG_DM_CRYPT=y
Contrairement à la méthode dm-default-key, la méthode dm-crypt entraîne le chiffrement du contenu des fichiers deux fois : une fois avec une clé FBE et une fois avec la clé de chiffrement des métadonnées. Ce double chiffrement réduit les performances et n'est pas nécessaire pour atteindre les objectifs de sécurité du chiffrement des métadonnées, car Android garantit que les clés FBE sont au moins aussi difficiles à compromettre que la clé de chiffrement des métadonnées. Les fournisseurs peuvent personnaliser le noyau pour éviter le double
chiffrement, en particulier en implémentant l'
allow_encrypt_override option qu'Android transmet à
dm-crypt lorsque la propriété système
ro.crypto.allow_encrypt_override est définie sur true.
Ces personnalisations ne sont pas compatibles avec le noyau commun Android.
Par défaut, la méthode de chiffrement des métadonnées de volume dm-crypt utilise l'algorithme de chiffrement AES-128-CBC avec ESSIV et des secteurs cryptographiques de 512 octets. Vous pouvez remplacer ce paramètre en définissant les propriétés système suivantes (qui sont également utilisées pour le FDE) :
ro.crypto.fde_algorithmsélectionne l'algorithme de chiffrement des métadonnées. Les choix sontaes-128-cbcetadiantum. Adiantum ne peut être utilisé que si l' appareil ne dispose pas d'accélération AES.ro.crypto.fde_sector_sizesélectionne la taille du secteur cryptographique. Les choix sont 512, 1024, 2048 et 4096. Pour le chiffrement Adiantum, utilisez 4096.