3 votes

Comment la protection dm-verity d'Android valide-t-elle les blocs avec un arbre de hachage ?

Je suis en train d'apprendre la protection dm-verity d'Android et j'essaie de comprendre comment le dm-verity d'Android utilise l'arbre de hachage pour la validation du "single block".

https://source.Android.com/security/verifiedboot/dm-verity dit :

Au lieu de cela, dm-verity vérifie les blocs individuellement et seulement lorsque chacun d'eux est accédé. Lorsqu'il est lu en mémoire, le bloc est haché en parallèle. Le hachage est ensuite vérifié dans l'arbre. Et puisque la lecture du bloc est une opération si coûteuse, la latence introduite par cette vérification au niveau du bloc est comparativement nominale.

Une fois le bloc lu et haché, il est vérifié en haut de l'arbre. Mais comment puis-je vérifier le hachage de Root, alors que je n'ai pas lu tous les blocs ? Je peux vérifier uniquement la partie de l'arbre que j'ai lue, et cela signifie que je n'ai pas besoin d'aller jusqu'au hachage des racines.

Je ne comprends pas pourquoi nous utilisons un arbre de hachage. Fil de discussion StackOverflow dit que la principale raison d'utiliser les arbres de hachage est que le hachage est calculé pour chaque bloc et ensuite pour tout le fichier à nouveau, je ne comprends pas pourquoi il est utilisé ici.

Comment cela est-il mis en œuvre ? Mon hypothèse est que lorsque le bloc est chargé en mémoire, Android vérifie seulement la branche particulière et le reste des valeurs sont prises dans l'arbre de hachage pré-calculé. Mais je ne vois pas la raison d'utiliser l'arbre. Je voudrais juste stocker les valeurs de hachage du bloc et après avoir lu le bloc et le hachage comparer juste le hachage.

Edit : Supposons cette implémentation :

  1. diviser l'ensemble du dispositif de blocs en blocs de taille 4K.
  2. hacher chaque bloc particulier et concaténer les hachages (créer la couche 0 de dm-verity)
  3. stocker les hachages (couche 0) à la fin du dispositif de bloc Maintenant, lorsque je veux vérifier le bloc 4K chargé dans la mémoire, je trouve la position du bloc et je compare le hachage du bloc chargé avec le hachage stocké.

Dans la situation telle que ce L'utilisation d'un arbre a du sens, car vous n'avez que la racine de Merkle disponible, mais dans Android, nous avons l'arbre entier, alors pourquoi ne pas utiliser la couche 0 (implémentation ci-dessus) et jeter le reste.

Et en écrivant, je pense avoir trouvé une réponse. Android stocke l'arbre de hachage complet à la fin. Mais l'arbre n'est pas signé, seulement la table dm-verity (métadonnées) qui contient le hash Root. Donc, dans mon implémentation, je devrais signer toute la couche 0. Et c'est probablement un gaspillage de ressources, donc il est préférable d'utiliser l'arbre.

3voto

rascalking Points 1422

"Mais comment puis-je vérifier le hachage de Root, alors que je n'ai pas lu tous les blocs ?"

"En substance, les feuilles de l'arbre sont des pages contenant des valeurs de hachage ; chaque niveau supérieur de l'arbre contient les hachages des blocs situés en dessous." Référence

"Un chemin de merkle est utilisé pour prouver l'inclusion d'un élément de données. Un nœud peut prouver qu'une transaction K est incluse dans le bloc en produisant un chemin merkle qui ne comporte que quatre hachages de 32 octets (128 octets au total). Le chemin est constitué des quatre hachages (illustrés par un arrière-plan ombragé dans Un chemin de merkle utilisé pour prouver l'inclusion d'un élément de données) HL, HIJ, HMNOP et HABCDEFGH. Avec ces quatre hachages fournis comme chemin d'authentification, n'importe quel nœud peut prouver que HK (avec un fond noir en bas du diagramme) est inclus dans la racine de merkle en calculant quatre hachages supplémentaires par paires HKL, HIJKL, HIJKLMNOP, et la racine de l'arbre de merkle ." merkle tree Référence

"Je voudrais juste stocker les valeurs de hachage des blocs et après avoir lu le bloc et le hachage comparer juste le hachage."

Il ne faut pas oublier que les téléphones portables ont une quantité limitée de ressources. Votre façon de faire consiste à lire tout le bloc et à comparer pour vérifier la validité avant. Avec l'arbre, il suffit d'en lire une partie pour en vérifier la validité.

"Cependant, la vérification d'un bloc entier peut prendre beaucoup de temps et consommer une grande partie de l'énergie du dispositif. Les dispositifs prendraient de longues périodes pour démarrer et seraient ensuite considérablement vidés avant d'être utilisés." Référence

Pour vous aider dans vos recherches, je pense qu'il serait important de connaître la théorie de l'arbre de hachage. Elle s'appelle la Merkle tree brevetée pour la première fois par Ralph Merkle

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X