Je viens d'installer Marshmallow sur un Nexus 5 via une mise à jour poussée. Je suis confus quant au fonctionnement du cryptage. J'ai une bonne connaissance technique du chiffrement sur les ordinateurs. Je voudrais acquérir des connaissances similaires sur Android 6.
Ce qui suit est ce que j'ai fait et comment je suis devenu confus. Après une réinitialisation d'usine, j'ai configuré un code PIN puis crypté l'appareil. Au démarrage, il m'a demandé mon code PIN, ce qui était attendu. J'ai ensuite supprimé le code PIN et redémarré l'appareil. Il n'a pas demandé de code PIN au démarrage, mais l'appareil s'est toujours signalé comme crypté dans le menu de configuration. Ce dernier est ce qui m'embrouille car je m'attendais à ce que le code PIN déverrouille la clé de déchiffrement.
Des questions:
- Dans le cas d'un chiffrement sans code PIN, d'où vient la clé de déchiffrement? Je suppose qu'il est stocké sur une puce similaire à un TPM, est-ce correct? Si oui, qu'est-ce qui empêche un pirate de demander cette clé à la puce? Vérifie-t-il le hachage du firmware? Rien d'autre? Des détails techniques seraient très appréciés.
- Dans le cas du cryptage avec un code PIN, le code PIN est-il utilisé comme jeton supplémentaire pour accéder à la clé de décryptage? Ou le processus de décryptage fonctionne-t-il exactement comme s'il n'y avait pas de code PIN.
Réponse TL; DL:
La clé de déchiffrement est déverrouillée avec tous les éléments suivants:
- Le code PIN (ou mot de passe, etc.) ou un mot de passe par défaut s'il n'y en a pas
- Un TEE (un générateur de signature soutenu par du matériel qui utilise des clés qui ne peuvent pas être extraites)
- Un sel (facilement disponible mais prévenant les attaques des tables arc-en-ciel)
la source
Réponses:
Je cite le manuel Android ici , mais:
REMARQUE:
La source que j'ai utilisée n'est pas directement pertinente pour Marshmallow mais concerne Lollipop et les versions supérieures.
TL: DR
Je vais répondre aux questions du PO maintenant. Les détails techniques suivront.
La clé de chiffrement par défaut provient d'une source matérielle (une puce similaire à un TPM) et du mot de passe par défaut d'AOSP défini comme
default_password
dans lecryptfs.c
fichier source, voir ci-dessous.Oui, pas seulement la valeur par défaut, mais tout mot de passe est transformé en clé et est stocké sur une puce de type TPM, appelée TEE (abréviation de "Trusted Execution Environment", voir ci-dessous pour plus de détails).
Un pirate disposant d'un accès UART / JTAG aux puces sur le SoC de l'appareil pourrait techniquement avoir accès à la clé TEE, ou un noyau personnalisé peut divulguer ces informations à un pirate. Certaines agences à 3 lettres dans les théories du complot peuvent éventuellement s'associer avec l'OEM pour obtenir ces noyaux non sécurisés utilisés dans les appareils de production, mais je ne mettrais pas beaucoup de magasins à côté. Encore une fois, consultez la dernière section de cette réponse pour plus de détails.
La seule chose qui empêche un pirate d'accéder à la clé est la quantité d'efforts nécessaires pour le faire.
dm-verity
. Cependant, cela est indépendant du statut de chiffrement.Source: guide de sécurité AOSP ici .
Aperçu
Au premier démarrage, l'appareil crée une clé principale de 128 bits générée de manière aléatoire, puis la hache avec un mot de passe par défaut et du sel stocké. Le mot de passe par défaut est: "default_password" Cependant, le hachage résultant est également signé via un TEE (tel que TrustZone), qui utilise un hachage de la signature pour crypter la clé principale.
Vous pouvez trouver le mot de passe par défaut défini dans le fichier cryptfs.c du projet Open Source Android .
Lorsque l'utilisateur définit le code PIN / passe ou le mot de passe sur l'appareil, seule la clé de 128 bits est rechiffrée et stockée. (c.-à-d. que les changements de code PIN / passe / modèle utilisateur ne provoquent PAS le rechiffrement de la partition de données utilisateur.)
Démarrage d'un appareil chiffré avec le chiffrement par défaut
C'est ce qui se produit lorsque vous démarrez un appareil chiffré sans mot de passe. Étant donné que les appareils Android 5.0 sont chiffrés au premier démarrage, aucun mot de passe ne doit être défini et il s'agit donc de l'état de chiffrement par défaut.
Détectez que l'appareil Android est crypté car / data ne peut pas être monté et l'un des indicateurs
encryptable
ouforceencrypt
est défini.vold
définitvold.decrypt
surtrigger_default_encryption
, qui démarre ledefaultcrypto
service.trigger_default_encryption
vérifie le type de cryptage pour voir si / data est crypté avec ou sans mot de passe.Crée le
dm-crypt
périphérique sur le périphérique bloc afin que le périphérique soit prêt à être utilisé.vold
monte ensuite la partition réelle / données déchiffrée, puis prépare la nouvelle partition. Il définit la propriétévold.post_fs_data_done
sur0
puis définitvold.decrypt
surtrigger_post_fs_data
. Cela provoque l'init.rc
exécution de sespost-fs-data
commandes. Ils vont créer des répertoires ou des liens nécessaires et misvold.post_fs_data_done
à1
.Une fois
vold
voit le 1 dans cette propriété, il définit la propriétévold.decrypt
à:trigger_restart_framework
. Cela provoqueinit.rc
le redémarrage des services dans la classemain
et le démarrage des services dans la classe late_start pour la première fois depuis le démarrage.Maintenant, le framework démarre tous ses services en utilisant les données décryptées et le système est prêt à l'emploi.
Démarrage d'un appareil chiffré sans chiffrement par défaut
C'est ce qui se produit lorsque vous démarrez un appareil crypté avec un mot de passe défini. Le mot de passe de l'appareil peut être une broche, un motif ou un mot de passe.
Détectez que l'appareil Android est crypté car l'indicateur
ro.crypto.state = "encrypted"
vold
est définivold.decrypt
surtrigger_restart_min_framework
/ data est crypté avec un mot de passe.init
définit cinq propriétés pour enregistrer les options de montage initiales données pour / data avec des paramètres transmis depuisinit.rc
.vold
utilise ces propriétés pour configurer le mappage cryptographique:ro.crypto.fs_type
ro.crypto.fs_real_blkdev
ro.crypto.fs_mnt_point
ro.crypto.fs_options
ro.crypto.fs_flags
(Numéro hexadécimal ASCII à 8 chiffres précédé de 0x)Le cadre démarre et voit qu'il
vold.decrypt
est réglé surtrigger_restart_min_framework
. Cela indique au framework qu'il démarre sur untmpfs /data
disque et qu'il doit obtenir le mot de passe utilisateur.Cependant, il doit d'abord s'assurer que le disque a été correctement chiffré. Il envoie la commande
cryptfs cryptocomplete
àvold
.vold
renvoie 0 si le cryptage s'est terminé avec succès, -1 en cas d'erreur interne ou -2 si le cryptage n'a pas été effectué avec succès.vold
détermine cela en recherchant leCRYPTO_ENCRYPTION_IN_PROGRESS
drapeau dans les métadonnées cryptographiques . S'il est défini, le processus de cryptage a été interrompu et il n'y a pas de données utilisables sur l'appareil.Si
vold
renvoie une erreur, l'interface utilisateur doit afficher un message à l'utilisateur pour redémarrer et réinitialiser le périphérique en usine, et donner à l'utilisateur un bouton à appuyer pour le faire.Une fois
cryptfs cryptocomplete
réussi, le framework affiche une interface utilisateur demandant le mot de passe du disque. L'interface utilisateur vérifie le mot de passe en envoyant la commandecryptfs checkpw
àvold
. Si le mot de passe est correct (qui est déterminé en montant avec succès le déchiffré/data
à un emplacement temporaire, puis en le démontant), vold enregistre le nom du périphérique de bloc déchiffré dans la propriétéro.crypto.fs_crypto_blkdev
et renvoie l'état 0 à l'interface utilisateur. Si le mot de passe est incorrect, il renvoie -1 à l'interface utilisateur.L'interface utilisateur met en place un graphique de démarrage crypto, puis appelle vold avec la commande
cryptfs restart
.vold
définit la propriétévold.decrypt
àtrigger_reset_main
, ce qui provoque leinit.rc
faireclass_reset main
. Cela arrête tous les services de lamain
classe, ce qui permet de lestmpfs /data
démonter.vold
monte ensuite la/data
partition réelle déchiffrée et prépare la nouvelle partition (qui n'aurait peut-être jamais été préparée si elle avait été chiffrée avec l'option d'effacement, qui n'est pas prise en charge dans la première version). Il définit la propriétévold.post_fs_data_done
sur0
puis définitvold.decrypt
surtrigger_post_fs_data
. Cela provoque l'init.rc
exécution de sonpost-fs-data commands
. Ils vont créer des répertoires ou des liens nécessaires et misvold.post_fs_data_done
à1
. Une fois que levold
voit1
dans cette propriété, il définit la propriétévold.decrypt
surtrigger_restart_framework
. Cela provoqueinit.rc
le redémarrage des services en classemain
et le démarrage des services en classelate_start
pour la première fois depuis le démarrage.Maintenant, le framework démarre tous ses services en utilisant le système de fichiers décrypté / données, et le système est prêt à l'emploi.
Stockage de la clé cryptée
La clé chiffrée est stockée dans les métadonnées cryptographiques. La sauvegarde matérielle est implémentée à l'aide de la capacité de signature de Trusted Execution Environment (TEE). Auparavant, nous cryptions la clé principale avec une clé générée en appliquant
scrypt
au mot de passe de l'utilisateur et au sel stocké.Afin de rendre la clé résistante aux attaques hors boîte, nous étendons cet algorithme en signant la clé résultante avec une clé TEE stockée. La signature résultante est ensuite transformée en une clé de longueur appropriée par une autre application de
scrypt
. Cette clé est ensuite utilisée pour chiffrer et déchiffrer la clé principale. Pour stocker cette clé:scrypt
au mot de passe utilisateur et au sel pour produire la clé intermédiaire 32 octets 1 (IK1).scrypt
sur IK2 et sel (même sel que l'étape 2) pour produire IK3 32 octets.la source