使用 TPM 进行全盘加密的正确方法

信息安全 磁盘加密 卢克斯 tpm 比特锁
2021-08-24 06:00:30

我目前正在使用 TPM 和 LUKS 设置等效的 BitLocker。我已经掌握了基本知识,并且能够测量启动过程并使用 TPM 密封 FDE 密钥。

每次更新敏感部分(固件、引导加载程序、内核)时,都会使用以下命令将加密密钥密封到新的系统状态:

tpm_sealdata -p 0 -p 1 ... -p 11 -p 13 -i <keyfile> -o <sealed keyfile>

当系统启动时,以下内容用于解封密钥,然后将其传递给 LUKS 以安装加密卷:

tpm_unsealdata -i <sealed keyfile> -o <temporary keyfile stored in RAM>

这有效并且具有所需的行为 - 如果引导过程已被篡改(假设添加init=/bin/sh到内核​​命令行以绕过 root 密码),TPM 拒绝解封密钥,因此系统是安全的。

但是,我有几个问题:

首先,TPM 每次执行密封/开封操作时都需要 SRK 密码。我想避免这种情况,让它的行为就像 BitLocker 一样透明且不提示任何内容。我曾考虑过使用默认的 SRK 密码,但显然它是不安全的,但答案无法说明如果 PCR 与密钥被密封时的状态不匹配,知道密码的攻击者是否可以解封密钥。

另一个问题是我应该使用哪种方式来密封密钥 - 我的方式涉及tpm_sealdata/tpm_unsealdata但另一个项目tpm-luks使用tpm-nvread/tpm-nvwrite代替。我想知道区别以及一种方式是否比另一种更安全。

1个回答

首先:没有系统是 100% 安全的,但是使用 TPM 总比没有 TPM 好。TPM 芯片只是某种加密存储,它驻留在支持可信平台环境的计算机主板上,并准备好处理它的 BIOS。

TPM_ExtendPCR 是具有通过操作处理的特定功能的寄存器。它们不能被“设置”,只能扩展(new_hash = [old_hash||new_measurement])。

TPM 具有静态测量信任根 (SRTM) 和动态测量信任根 (DRTM),两者的结合创建了安全环境。这家伙很好地解释了这是如何完成的。它是固定项和动态项之间的信任链。

回到 PCR,它们是独立于平台的寄存器,最常见的是:

PCR 0 to 3 for the BIOS, ROMS...
PCR 4 - MBR information and stage1
PCR 8 - bootloader information stage2 part1
PCR 9 - bootloader information stage2 part2
PCR 12 - all commandline arguments from menu.lst and those entered in the shell
PCR 13 - all files checked via the checkfile-routine
PCR 14 - all files which are actually loaded (e.g., Linux kernel, initramfs, modules...)
PCR 15 to 23 are not used 

基于 Intel 的笔记本电脑通常使用前 16 个寄存器,但它可以扩展到其他软件/用途。

在将信息(密封)写入 TPM 时,您可以添加存储根密钥 (SRK),它在某种程度上是“管理密钥”,用于将其他密钥添加到此存储。根据手册页,使用-z将设置TSS_WELL_KNOWN_SECRET (20 zero bytes)

-z, --well-known
    Use TSS_WELL_KNOWN_SECRET (20 zero bytes) as the SRK password. 
    You will not be prompted for the SRK password with this option. 

因此,将此 SRK 设置为默认密钥 ( TSS_WELL_KNOWN_SECRET) 不足以攻击某人,因为只有当当前 PCR 与用于密封数据的 PCR 匹配时,TPM 才能被解封。此外,一些 PCR 处理发生在启动时 (BIOS),并且很难操纵这些处理并因此创建“假”PCR。BIOS 是唯一一个在其余过程发生之前将 PCR 视为零的地方。

唯一可行的攻击是旨在将 BIOS 和 PCR 之间的 MITM 通信归零 PCR 而不重新启动机器以将系统置于“受信任”状态的攻击。这种攻击称为TPM 重置攻击

攻击

因此,鉴于我们在上面看到的一切,只要 BIOS 进行最初的几次测量,就应该很难伪造一个受信任的引导过程。这里的关键假设是,如果不重新启动 TPM 所在的整个平台,就无法轻松重置 PCR。如果攻击者能够监控由 BIOS 发送到 PCR 的测量值(例如使用逻辑分析仪,请参阅本文),并且能够在不重新启动机器的情况下将 PCR 归零,那么她可以在任何配置并将其置于“受信任”状态。因此,困难的部分是在不关闭整台机器的情况下重置 TPM。值得一提的是,我们还研究了在测量后插入内存和其他类似的东西来改变正在运行的系统,但是由于内存和硬盘驱动器所在的总线的速度,这是一项棘手的工作。攻击较慢的总线要容易得多。

TPM 通常驻留在低引脚数 (LPC) 总线上。LPC 总线支持接地驱动复位线。这意味着当总线上的这条特定线路被驱动接地时,该总线上的每个设备都应该复位。连接到此总线的其他设备包括 BIOS 以及传统的键盘和鼠标控制器。下面的视频展示了驾驶这条线确实是可能的,而且相当容易做到。请注意,在视频中,我们正在通过远程 ssh 会话访问相关计算机。这是因为当我们驱动复位引脚时,键盘和鼠标控制器会复位,但网卡没有。这种攻击(和其他!)的更多细节可以在我的高级荣誉论文中看到:可信平台模块的安全评估,达特茅斯学院计算机科学技术报告 TR2007-597。

请注意,这是涉及可信计算的所有事物的过度简化版本请查看TPMv2 的体系结构文档,以获取有关在设置可信环境期间在 bios、硬件和软件之间发生的所有操作的更多信息。

tl;dr:使用默认存储根密钥(20 个零字节)不足以创建不安全的系统。

相关资料: