J'essaie de savoir comment le TPM effectue une mesure d'intégrité sur un système. Il est bien documenté dans la spécification TPM comment il scelle les données qu'il a mesurées dans les PCR et comment il est mis à jour. Mais ce que je ne trouve pas expliqué, c'est comment le TPM effectue réellement les mesures d'intégrité qu'il scelle en premier lieu. Pour savoir si le système est dans un état donné ou non, il doit le mesurer, mais comment fait-il cela? Et qu'est-ce qu'il mesure réellement? La plupart des articles semblent masquer cela, et j'ai l'impression que les données prêtes à être stockées dans la PCR apparaissent juste à l'improviste.
Il y a essentiellement deux façons de procéder;
[~ # ~] srtm [~ # ~] a lieu au démarrage du système. La première chose exécutée au démarrage est appelée la racine principale de confiance pour les mesures (CRTM) aka le bloc de démarrage du BIOS mesurera le BIOS et enverra la valeur ( hachage ) au TPM dans un emplacement appelé Platform Registre des configurations (PCR) 0 avant de l'exécuter. Ensuite, le BIOS mesure la prochaine chose dans la chaîne de démarrage et stocke à nouveau la valeur dans un PCR du TPM. Ce processus est exécuté pour chaque composant de la séquence de démarrage (ROM option PCI, chargeur de démarrage, etc.).
TrustedGrub est un chargeur de démarrage compatible avec le TPM qui enverra les mesures appropriées au TPM. Il est utilisé pour continuer la chaîne de mesures (SRTM) du BIOS jusqu'au noyau.
[~ # ~] drtm [~ # ~] est très différent car il se passe quelque chose pendant que le système fonctionne. L'implémentation d'Intel s'appelle Trusted Execution Technology ( TXT ) tandis qu'AMD utilise le nom Secure Virtual Machine (SVM). L'objectif de DRTM est de créer un environnement de confiance à partir d'un état non approuvé. Techniquement, il crée un état sécurisé/propre et rendra compte (fournir des mesures - hachages dans les PCR) sur un morceau de code que quelqu'un veut exécuter (aka Measured Launched Environment - MLE). En règle générale, le MLE est un système d'exploitation (noyau, espace utilisateur, etc.).
Sans entrer dans les détails, le DRTM d'Intel fonctionne en appelant un ensemble de nouvelles instructions CPU (SMX) qui indique au CPU et au chipset d'effectuer un ensemble de tâches très spécifique (GETSEC) qui garantissent que rien d'autre qu'un code spécial ne peut s'exécuter, c'est-à-dire SINIT Module de code authentifié ( ACM ). Cette partie comprend la désactivation de tous les CPU sauf un et le blocage/arrêt de tout ce qui est en cours d'exécution: tous les autres processus, interruptions et E/S (via IOMMU , par exemple pour éviter = DMA attaques). Ensuite, tous les CPU se rejoignent dans un état propre - tout ce qui était exécuté avant est rejeté. À ce stade, la signature de ce code spécial (SINIT ACM) est validée et son identité (mesure de hachage) est envoyé au TPM dans le PCR 17. Ensuite, l'exécution est transmise à l'ACM qui mesure ensuite le MLE et envoie la mesure au TPM dans le PCR 18. Enfin, l'exécution est passée au MLE.
Tboot est un outil créé par Intel pour faire exactement cela (DRTM) et une alternative à TrustedGrub (SRTM).
Voici un exemple de ce à quoi ressemblent les valeurs de PCR avec SRTM (BIOS compatible TPM) mais sans chargeur de démarrage compatible TPM (par exemple TrustedGrub) et sans DRTM (par exemple Tboot):
# cat /sys/devices/pnp0/00:09/pcrs
PCR-00: A8 5A 84 B7 38 FC C0 CF 3A 44 7A 5A A7 03 83 0B BE E7 BD D9
PCR-01: 11 40 C1 7D 0D 25 51 9E 28 53 A5 22 B7 1F 12 24 47 91 15 CB
PCR-02: A3 82 9A 64 61 85 2C C1 43 ED 75 83 48 35 90 4F 07 A9 D5 2C
PCR-03: B2 A8 3B 0E BF 2F 83 78 29 9A 5B 2B DF C3 1E A9 55 AD 72 36
PCR-04: 78 93 CF 58 0E E1 A3 8F DA 6F E0 3B C9 53 76 28 12 93 EF 82
PCR-05: 72 A7 A9 6C 96 39 38 52 D5 9B D9 12 39 75 86 44 3E 20 10 2F
PCR-06: 92 20 EB AC 21 CE BA 8A C0 AB 92 0E D0 27 E4 F8 91 C9 03 EE
PCR-07: B2 A8 3B 04 BF 2F 83 74 29 9A 5B 4B DF C3 1E A9 55 AD 72 36
PCR-08: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
PCR-09: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
PCR-10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
PCR-11: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
PCR-12: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
PCR-13: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
PCR-14: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
PCR-15: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
PCR-16: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
PCR-17: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
PCR-18: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
PCR-19: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
PCR-20: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
PCR-21: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
PCR-22: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
PCR-23: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Comme vous pouvez le voir, la PCR 0-7 est remplie mais de la PCR 8 à la 15, elle est vide - elles sont toujours réinitialisées à 0. Puisque DRTM n'a pas été utilisé, les PCR 17-22 sont remplies avec 1s (f).
La sécurité de ces mécanismes repose sur le fait que les valeurs de PCR ne peuvent pas être définies (ou falsifiées) mais uniquement étendues (TPM_Extend()
). Cela signifie que chaque fois qu'une mesure est envoyée à un TPM, le hachage de la concaténation de la valeur actuelle d'un PCR et la nouvelle mesure est stockée (c'est-à-dire new_value = Hash(old_value || new_measurement)
). De toute évidence, il y a un début à tout cela:
Il est important de comprendre que pendant que le TPM collecte ces mesures, il n'agit pas sur elles - en fait, il ne peut pas =. La valeur de ces mesures ne peut être vue qu'avec les opérations seal()
/unseal()
/quote()
: Maintenant que nous avons des mesures dans les PCR du TPM, nous pouvons utiliser le unseal()
opération pour révéler un secret qui n'est accessible que si les bonnes valeurs de PCR sont dans le TPM - elles sont utilisées comme clés de chiffrement. Cela signifie essentiellement qu'un secret n'est accessible que si l'environnement approprié a été chargé via SRTM (BIOS, chargeur de démarrage, noyau, etc.) ou DRTM (SINIT et MLE (noyau, etc.)). Voir ceci réponse pour plus d'informations.
Pour plus d'informations, je vous suggère de lire this 101 puis this document.
La spécification principale du TPM est censée être indépendante de la plate-forme. C'est pourquoi aucun détail sur ce qui est réellement mesuré au démarrage n'est contenu, car évidemment les composants diffèrent d'une plateforme à l'autre. Si vous êtes intéressé par ce qui est mesuré pendant le démarrage d'un PC, vous devriez jeter un œil à la section 1.3 (Présentation du processus de mesure) du Spécification de mise en œuvre spécifique au client TCG PC pour le BIOS conventionnel .
Les détails sur la façon dont les mesures sont traitées et stockées dans les PCR se trouvent dans TPM Main Specification . La partie 1, section 4.4 (Registre de configuration de la plate-forme (PCR)) pourrait être un bon point de départ.
Je recommanderais également de jeter un œil à l'aperçu de l'architecture du TCG pour avoir une vue d'ensemble, mais cela n'est pas directement lié à votre question.
La réponse la plus directe à votre question est que le TPM ne fait pas les mesures . Les mesures et les valeurs de PCR sont entièrement propriétaires de la plate-forme dans laquelle le TPM est installé.
Les autres réponses sont excellentes pour décrire ce processus pour certains systèmes bien établis, mais en bref, le module de plateforme sécurisée ne stocke/met à jour que 160 bits SHA hachages et scelle les clés contre ces hachages. ils veulent dire, pour autant que je sache.
Voici une excellente présentation sur ce sujet: http://opensecuritytraining.info/IntroToTrustedComputing.html
Obtenez les diapositives et voyez les premières diapositives dans Day2-1-auth-and-att.pdf
.