我试图找出 TPM 如何在系统上执行完整性测量。TPM 规范中详细记录了它如何密封它在 PCR 中测量的数据以及如何更新它。但我无法解释的是 TPM 如何实际执行它最初密封的完整性测量。要知道系统是否处于给定状态,它必须测量它,但它是如何做到的?它实际测量的是什么?大多数论文似乎都掩盖了这一点,我觉得 PCR 数据准备好存储突然出现。
TPM 如何对系统执行完整性测量?
基本上有两种方法可以做到这一点;
- SRTM(测量的静态信任根)和
- DRTM(测量的动态信任根)。
SRTM发生在系统启动时。在启动时执行的第一件事称为测量的核心信任根 (CRTM),也就是 BIOS 启动块将测量 BIOS 并将值 ( hash ) 发送到 TPM 在称为平台配置寄存器 (PCR) 0 之前的位置执行它。然后 BIOS 测量引导链中的下一件事,并再次将值存储在 TPM 的 PCR 中。此过程针对引导序列中的每个组件(PCI 选项 ROM、引导加载程序等)执行。
TrustedGrub是一个 TPM 感知引导加载程序,它将向 TPM 发送正确的测量值。它用于继续从 BIOS 到内核的测量链 (SRTM)。
DRTM非常不同,因为它是在系统运行时发生的。英特尔的实现称为可信执行技术 ( TXT ),而 AMD 使用安全虚拟机 (SVM) 的名称。DRTM 的目标是从不受信任的状态创建一个受信任的环境。从技术上讲,它创建了一个安全/干净的状态,并将报告(提供测量——PCR 中的哈希)某人想要执行的一段代码(又名测量启动环境 - MLE)。通常,MLE 是一个操作系统(内核、用户空间等)。
无需详细说明,英特尔的 DRTM 通过调用一组新的 CPU 指令 (SMX) 来工作,该指令告诉 CPU 和芯片组执行一组非常特定的任务 (GETSEC),以确保只有特殊代码才能运行,即 SINIT认证代码模块 ( ACM )。这部分包括禁用除一个 CPU 之外的所有 CPU 并阻塞/停止当前运行的所有内容:所有其他进程、中断和 I/O(通过IOMMU,例如避免 DMA 攻击)。然后,所有 CPU 以干净状态重新加入 - 之前执行的任何内容都将被丢弃。此时,此特殊代码 (SINIT ACM) 的签名得到验证,其身份(哈希测量)被发送到 PCR 17 中的 TPM。之后,执行被传递到 ACM,然后 ACM 测量 MLE 并将测量发送到PCR 18 中的 TPM。最后,将执行传递给 MLE。
Tboot是英特尔创建的用于执行此操作的工具 (DRTM),是 TrustedGrub (SRTM) 的替代品。
以下是使用 SRTM(TPM 感知 BIOS)但没有 TPM 感知引导加载程序(例如 TrustedGrub)和没有 DRTM(例如 Tboot)时 PCR 值的示例:
# 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
如您所见,PCR 0-7 已填充但从 PCR 8 到 15 它是空的 - 它们仍重置为 0。由于尚未使用 DRTM,因此 PCR 17-22 填充有 1s (f)。
这些机制的安全性依赖于 PCR 值不能设置(或伪造)而只能扩展(TPM_Extend()
)的事实。这意味着无论何时将测量值发送到 TPM,都会存储 PCR 的当前值和新测量值的串联散列(即new_value = Hash(old_value || new_measurement)
)。显然,所有这一切都有一个开始:
- 使用 SRTM,只有 CRTM 可以在启动时重置 PCR 0 到 15
- 使用 DRTM,只有 TXT 指令可以重置 PCR 17 到 20(在位置 4(SMX 操作)时)。有关详细信息,请参阅此答案、此演示文稿或规格。
重要的是要了解,虽然 TPM 收集这些测量值,但它不会对它们采取行动——实际上,它不能。这些测量值的值只能通过seal()
/ unseal()
/quote()
操作看到:现在我们在 TPM 的 PCR 中有测量值,我们可以使用该unseal()
操作来揭示一个秘密,该秘密只有在正确的 PCR 值在 TPM 中时才能访问——它们是用作加密密钥。这基本上意味着只有通过 SRTM(BIOS、引导加载程序、内核等)或 DRTM(SINIT 和 MLE(内核等))加载正确的环境才能访问机密。有关更多信息,请参阅此答案。
TPM 主要规范旨在独立于平台。这就是为什么没有包含有关启动期间实际测量的细节的原因,因为显然组件因平台而异。如果您对 PC 启动期间测量的内容感兴趣,您应该查看TCG PC Client Specific Implementation Specification for Conventional BIOS 的第 1.3 节(测量过程概述)。
有关如何在 PCR 中处理和存储测量值的详细信息,请参阅TPM 主要规范。第 1 部分,第 4.4 节(平台配置寄存器 (PCR))可能是一个不错的起点。
我还建议您查看 TCG 架构概述以了解全局,但这与您的问题没有直接关系。
对您的问题最直接的回答是TPM 不进行测量。测量值和 PCR 值完全由安装 TPM 的平台专有。
其他答案非常适合描述一些完善的系统的此过程,但简而言之,TPM 仅存储/更新 160 位 SHA 哈希并针对这些哈希密封密钥。据我所知,这对他们的意思是盲目的。
这是关于这些东西的精彩介绍:http: //opensecuritytraining.info/IntroToTrustedComputing.html
获取幻灯片并查看 中的前几张幻灯片Day2-1-auth-and-att.pdf
。