TPM 事件日志

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

简介

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

此操作的主要应用是远程证明,其用途在 [1] 的第一节中得到了很好的阐述

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

UEFI 事件日志

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

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

固件提供所谓的最终事件配置表来解决此问题。事件在首次调用 EFI_TCG2_PROTOCOL.GetEventLog() 后被镜像到该表中。

这又引入了另一个问题:无法保证在 Linux EFI stub 运行之前没有被调用。因此,它需要计算并保存最终事件表的大小,同时 stub 仍在运行到自定义配置表中,以便 TPM 驱动程序以后可以在从自定义配置表和最终事件表中连接事件日志的两半时跳过这些事件。

参考资料