我目前正在尝试通过以下方式构建一个最小的 Linux 系统构建根我想使用 TPM 来获取密钥并在启动期间进行一些测量。最好在 bootrom 中执行此操作(即系统通电后执行的第一个代码),以便可以正确测量所有启动组件。
通常,Buildroot 使用 U-Boot,它有可用的 TPM 驱动程序,因此我可以在那里使用它们,当然也可以在 Linux 内核中使用它们。但由于 TPM 设备首先需要在引导加载程序代码(即 U-Boot)中的某个地方激活,这是否标志着“不可测量”代码的边界?
我是否可以以某种方式从 bootrom 与 TPM 进行交互?如果不行,那么真正的安全启动实现如何处理这个问题?
答案1
在普通电脑上,它始终是“平台”(即 bootrom 或通过 bootrom 验证的固件)–不是引导加载程序——调用 TPM2_Startup。在引导加载程序可以测量操作系统文件时,TPM 已在运行,并且已经测量了固件和引导加载程序本身(前者进入 PCR 0,后者进入 PCR 4)。看一下TCG PC 客户端特定平台固件配置文件规范,其中提到了“SRTM”。
因此,通常在 PC 上,系统固件(如今通常由 CPU 进行数字签名和验证)会测量自身进入 PCR 0,然后固件会测量每个 EFI 可执行文件进入 PCR 4(引导加载程序、Linux EFI 存根等)——如果使用 SB,则测量其安全启动证书进入 PCR 7——然后引导加载程序才会测量操作系统内核。Linux initrd 和命令行的测量因内核版本而异。
请注意,TPM 测量大多独立于 UEFI“安全启动”。安全启动状态和配置被测量到 PCR 7 中,但这就是它们相互作用的范围。