TPM攻击:通过 LPC 总线旁路嗅探硬件 TPM 的密钥

前言

本文对这篇文章的改动已经不能叫做翻译了,因此算作编译吧。其实在这篇文章发布出来不久,我就在 NuSX 上验证了这篇文章。当时最大的困难是给 TPM 芯片飞线,我拜托了一个做硬件的朋友帮我远程飞的线,并使用这篇文章获得了密码。

SEGA 果然还是日本厂商,在硬件平台之上的 Windows IoT 系统还是一如既往的留有设计缺陷,导致了这个密码可以用很久。

扯的有点远了,我们来开始看看它说了什么吧。

背景

TPM (全名:Trusted Platform Module)是一种计算机系统的扩展模块,用于提供安全相关的功能。其中, TPM 芯片是一种硬件安全的加密处理器,可以安全生成、储存密钥,并用来保护其他加密密钥。目前市面上流行的 TPM 主要是两个版本:1.2 和 2.0。在 2019 年的时候,有安全团队发现了部分 TPM 1.2 和 2.0 芯片,甚至是一些 Intel 平台的软件 TPM 的设计缺陷,会导致 TPM 硬件内存储的密钥信息发生泄漏。

这一攻击方法已经在2020年的29届Usenix安全大会上由一些安全研究员公开,并展示了利用这一攻击进行 IPSec 网络认证攻击,在他们的论文中表明,只需要至多45,000次攻击,即可在目标系统内获取认证密钥。

除了网络认证,TPM 的一个重要落地应用是 Windows Bitlocker ,Windows Bitlocker 是 Windows 系统内置的硬盘分区保护工具,可以以用户定义密码或透明加密的方式保护用户硬盘分区内的数据,防止任何非法访问。

在基于时序的软件攻击外,很多没有在协议上做额外保护的 TPM 模块还存在着协议旁听漏洞,这使得很多可以物理访问但软件有保护的硬件系统存在着更多的风险。比如,街机领域内的软件厂商为了防止自己软件被泄漏或非法修改,对于分发的产品内的整块硬盘采用了 TPM + Bitlocker 加密的方式。

Bitlocker 101

上图是微软官方介绍的 Windows Bitlocker 保护方式,核心是图中的 Volume Master Key(VMK),由两类来源生成,两者在解密作用上是等价的:

一是密码,密码可以是单纯的用户指定的密钥,也可以是单纯的 TPM 密钥(透明加密),或者是两者混合的方式。

另一个是恢复密钥,这一密钥在加密完成后会给出到用户或者存储到用户的 Microsoft Account 内,在用户忘记密码的场合,可以使用恢复密钥来解除保护并访问内部的文件。

通过Volume Master Key,衍生出Validation Info 和 Full Volumn Encryption Key(FVEK)。Validation Info 除密钥特征外还跟当前系统的硬件信息、启动信息做绑定,如果硬件或启动信息不匹配,会进入到恢复模式,要求用户给出恢复信息。这样的设计是防止旁路攻击,即恶意用户拿到硬盘镜像后通过其他系统进行硬盘访问。

而 FVEK 是加密硬盘的主密钥,它本身被 VMK 所保护。所以,在透明加密模式下,如果解密 VMK 的来源(TPM)被攻击产生泄漏,那么接下来的链条都会被攻击。

TPM 简单介绍

微软的官方网站上提供了大量的 TPM 基础知识,因此我们不会再展开太多篇幅来介绍 TPM 的设计和其他基础信息。但是有一点需要说明的是,可能会有朋友认为既然目标系统存在保护,在有硬件的前提下我另外启动一个系统(比如 Ubuntu或者别的Windows)就可以获取 TPM 密钥,但其实 TPM 模块本身对于密钥生成的目标系统有一个叫做“启动状态”的存储标志位,这一标志位类似于 uuid ,是目标系统初始化加密时候生成的唯一值,理论上无法被碰撞。因此很难通过旁路系统进行 TPM 攻击。

TPM 与系统之间的通讯一般是 LPC SPI 或者 I2C 总线。在本次分享内我们会对于基于 LPC 总线的模块的攻击方式,如果想在线下自行复现本文攻击,需要确定自己使用的 TPM 硬件模块的通讯协议,具体方式可以去查看对应型号 TPM 芯片型号的白皮书,然后跟本文一样通过一台逻辑分析仪来进行分析。

上手逻辑分析仪:原作者的 TPM1.2 攻击和分析记录

作者使用了一块 SLB93650 TPM 1.2 芯片来进行攻击示范,这一芯片使用的是 LPC 通讯协议。在它的生产厂商官方网站我们很容易就能找到它的针脚定义:

要嗅探 LPC 协议一共需要7根电线:LCLK(时钟)、LFRAME、LAD0、LAD1、LAD2、LDA3、GND(接地)。首先,使用飞线在主板的这一芯片上直接将这7根引脚飞线出来:

然后,我们来找点东西来阅读 LPC 协议信息。

作者使用了注释6中的逻辑分析仪来进行逻辑分析,配套的软件是 DSLogic。DSLogic 和 PulseView 都使用了 libsigrokdecode,因此是通用的。由于 LPC 是 33Mhz 频率运行的,因此使用 100Mhz 采样可以尽可能的放慢信号并进行解析。

在作者的首次捕获中遇到了两个问题:第一个是解码器将 TPM 消息报告为保留消息,并没有正确解码它们,第二个是逻辑分析仪没有足够的存储空间来捕获完整会话,只看到了启动通讯消息。因此,需要修正时钟讯号来支持自动解码,否则解码的工作量将会是天文数字。

首先,作者解决的是识别问题。这是一个 DSLogic 的逻辑问题,阅读设计文档很容易发现 TPM LPC 协议是有协议头的: START(0101) ,因此进行对应修复就可以。

另一个问题作者的解决手段有一点歪道。毕竟直接更换逻辑分析仪成本还是比较高的,于是作者采用单通道分别捕获多个独立通道的信息,然后再将它们混合。于是,就获得了所有信号。

检索 VMK(Volume Master Key)

完成上面的工作后, LPC 消息就被成功解码了。剩下的就是在转储的数据里面找到 VMK 。搜索方法也很简单(去读 Bitlocker 协议的定义),就可以知道搜索 VMK 的标志位:0x2c 0x00 0x00 0x00。

作者运气不错,第一次就捕获到了完整的信号,他给出的截图,VMK消息位于 0x00000024 的 TPM 获取命令中。

来展开看下这个消息:

用计算器转换下:

然后就是重复直到 VMK 长度的消息:

使用 FPGA + 脚本读取 TPM2.0

好用的逻辑分析仪也需要捕获+解码的过程,一旦整体流程跑通,那我们就可以使用 FPGA开发板+脚本程序来自动化这个过程。Lattice ICEStick 是一款廉价易得的开发版,配合脚本就可以很快简化这个步骤。

需要特别说明的是,TPM 2.0 协议中增加了对于发送、接收指令的校验,可以一定程度上防止消息截获,但是 Bitlocker 在使用 TPM 芯片的时候并没有启用这一功能。

举个例子,SEGA ALLS HX1 ,是一款世嘉于2019年推出的街机基板平台。它搭载了 英飞凌 SLB9665 TPM2.0 芯片,根据上面的介绍,很轻松就可以找到这一芯片的定义:

我们也来简单飞个线:

然后就可以获得信息了。

原文附录:

READING

HARDWARE

SOFTWARE

Comments

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据