TPM 事件日志

本文档简要介绍了 TPM 日志是什么以及它如何从预启动固件移交给操作系统。

引言

预启动固件维护一个事件日志,每次有内容被哈希到任何 PCR 寄存器时,都会生成新的条目。这些事件按类型分类,并包含哈希后的 PCR 寄存器值。通常,预启动固件会哈希那些将移交执行权的组件或与启动过程相关的操作。

其主要应用是远程认证,其有用之处在 [1] 的第一节中得到了很好的阐述

“认证用于向挑战者提供有关平台状态的信息。然而,PCR 内容难以解释;因此,当 PCR 内容附带测量日志时,认证通常更有用。虽然测量日志本身不可信,但它包含比 PCR 内容更丰富的信息集。PCR 内容用于提供测量日志的验证。”

UEFI 事件日志

UEFI 提供的事件日志有一些奇怪的特性。

在调用 ExitBootServices() 之前,Linux EFI 桩程序会将事件日志复制到由桩程序自身定义的自定义配置表中。不幸的是,由 ExitBootServices() 生成的事件不会出现在该表中。

固件提供了所谓的“最终事件配置表”来解决这个问题。事件在第一次调用 EFI_TCG2_PROTOCOL.GetEventLog() 后会被镜像到此表中。

这带来了另一个问题:无法保证在 Linux EFI 桩程序运行之前不调用它。因此,在桩程序仍在运行时,它需要计算并保存最终事件表的大小到自定义配置表中,以便 TPM 驱动程序在将事件日志的两个部分(来自自定义配置表和最终事件表)连接起来时,可以跳过这些事件。

参考文献