在这篇博文中,@astralvx 将描述一种物理硬件攻击,以捕获通过 SPI 总线传输的 Bitlocker 密钥。这里的所有信息都以某种形式公开,不属于专有信息。我们将讨论 Bitlocker 的详细信息,从预启动到操作系统的引导流程,TPM 2.0 和 SPI 总线的介绍,焊接到引脚上,逻辑分析仪,如何分析 SPI 流,使用提取的 VMK 解密 Bitlocker 受保护的卷,最后一些缓解措施。
Bitlocker 简介
Bitlocker 是微软的全卷加密,注意它不是全盘加密。卷上的数据(例如 C:\)将使用完整卷加密密钥(FVEK)进行加密,并且 FVEK 存储在磁盘卷的元数据中。FVEK 本身使用卷主密钥(VMK)进行加密,而此 VMK 存储在 TPM 中。密钥保护程序(KP)可用于从 TPM 中解封 VMK。有关更多详细信息,请参阅 Bitlocker FIPS 140-2 文档[1]。
图 1 - Bitlocker 中涉及的加密密钥
启动流程
精简列表。由于重点是 TPM,将跳过有关 ACM、DRTM 等方面的更多重要内容。
信任根 - 信任链的过程是以此为锚定,对于 OEM 供应商来说,这将是嵌入式控制器(EC)及其对 EFI 初始引导块的完整性检查
测量启动 - UEFI BIOS 加载并执行 EFI 组件(可执行固件)的加密哈希,并将哈希扩展(附加)到 TPM PCR 银行中。
启动管理器(bootmgfw.efi - 包含初始 Bitlocker 代码)在未加密的 SYSTEM 分区上启动
引导管理器读取 NVRAM 变量以查找操作系统引导程序路径(例如 C:\windows\system32\winload.efi)
引导管理器要求 TPM 解封 VMK。TPM 在第 2 步“测量引导”后通过检查 PCR 寄存器来分析信任链,如果它们是预期值,则释放 VMK。 因此,对固件的任何修改都将破坏这种信任链,停止执行,并提示 Bitlocker 恢复屏幕
引导管理器与 VMK 解密 FVEK 以解密整个操作系统卷(C:\)
引导管理器然后验证引导加载程序(winload.efi)的完整性并执行它。
引导加载程序将 NT 内核(ntoskrnl.exe)加载到内存中
引导加载程序加载到内存中:HAL,SYSTEM 注册表(%SystemRoot%\System32\config\SYSTEM),SERVICEBOOTSTART 驱动程序
引导加载程序然后执行 NT 内核(ntoskrnl.exe)
引导加载程序最后调用 ExitBootServices(),并回收在 EFI 引导阶段使用的内存,从而结束引导阶段,操作系统内核开始运行
TPM 简介
可信平台模块(TPM)是一个密码处理器。它保存加密密钥,包括持久性存储器中的 VMK、认可密钥(EK)、存储根密钥(SRK),以及易失性存储器中的 PCR、AIK、SK。
TPM 类型:
离散 TPM - 专用芯片,英飞凌,新唐,意法半导体等
集成 TPM - 另一芯片的一部分,所有支持 TXT 的英特尔芯片
固件 TPM - AMD 平台安全处理器(PSP)具有 TPM 2.0(fTPM)、英特尔平台信任技术(PTT)、高通 fTPM
Hypervisor TPM - 依赖于虚拟机监控程序实现隔离执行环境,对虚拟机隐藏
软件 TPM - 通过操作系统软件模拟 TPM,安全性最低
当启用 Bitlocker 时,PCR 7 和 11 用于安全启动完整性验证。
CPU 通过 PCH 与 TPM 通信,在现代系统中通常通过 SPI 总线。
图 2 - 许多 TPM 供应商的常见引脚配置[2]
SPI 总线介绍
串行外围接口(SPI)是一种通信协议
OEM 供应商通常为公共 SPI 芯片和 TPM 共享一个 SPI 总线
SPI 总线指定了四个逻辑信号:
SCLK: 串行时钟(主机输出)
MOSI:主输出从输入(主机输出的数据)
MISO:主从输出(从从机输出的数据)
CS/SS: 芯片/从机选择(低电平有效,主机输出以指示数据正在发送)
图 3 - 共享 SPI 总线
由于 SPI 总线是共享的,如图 3 所示,从 TPM 发送到 CPU 的数据可以被其他 SPI 设备看到。典型的 PG-VQFN-32-13 封装的 TPM 具有非常细的引脚(0.5mm 间距),很难焊接,然而公共 SPI 芯片更容易进行焊接,如图 4 所示。
焊接
TPM 在图 2 中看到的腿宽为 0.5 毫米,很难焊接调试探针,除非你有显微镜和稳定的手。具有 BIOS 的公共 SPI 芯片通常很容易连接,因为它在 SOIC-8 封装上。如果在网上搜索制造商的板数据表,就可以准确找到在顶层暴露出感兴趣信号的地方焊接飞线。现代笔记本通常具有 10 层 PCB(使焊接变得极其繁琐),具有通孔(从一层到另一层提供电气访问的孔)如图 4 所示,不同层传输不同信号,例如 PCIe(M.2,WWAN,PCI 等),SPI,I2C,RF,NFC,音频,EMMC,HDMI,传感器,内存总线,USB,PD 等。
图 4 - 信号通过顶层的通孔暴露
逻辑分析仪
一旦调试线焊接上,Saleae 逻辑分析仪可以连接到 SPICLK、SPICS、SPISO、SPISI,如图 5 所示。由于信号完整性问题,读取时可能会遇到潜在的错误数据 - 由于不完美的焊接导致通道之间的串扰,或者由于调试电缆过长(因此增加更多的铜/电阻)导致阻抗等等。
图 5 - Saleae 逻辑分析仪连接到 SPI 芯片上的调试探针
SPI 流
一旦逻辑分析仪连接好,将采样率更改为超过 TPM SPI 时钟速度的 4 倍以上。这种过采样是为了保持名义带宽,否则会发生混叠,导致错误采样的字节。图 2 中的英飞凌赛能 TPM 在 3.3V 下运行,并具有最大 SPI 时钟速度为 43 MHz,因此我们需要以 43*4=172 MS/s(百万样本每秒)进行采样,或者使用 Saleae 逻辑分析仪提供的固定采样率 250 MS/s。
当您启动笔记本电脑并经历引导阶段时,请参考“引导流程”部分。预引导 UEFI 中的引导管理器(bootmgfw.efi)要求 TPM 解封 VMK。如果 PCR 处于正确状态并且保护程序已验证,则 VMK 将被解封并通过 SPI 总线从 TPM 发送到平台控制中心(PCH)又名芯片组。这将导致一个类似于图 6 中所示的捕获 SPI 流,并且其中将包含 32 字节的 VMK。
图 6 - POST 到 OS 加载的 SPI 流
放大到单个 SPI 事务,如图 7 所示。具体来说,TPM 正在返回字节 0xC1。请注意,TPM_CS 被断言,因此它是共享 SPI 总线上的活动从设备。在此事务中,总共有 40 个周期== 40 位== 5 字节,具体如下:
PCH 向 TPM 发送 4 个字节,请求为 80h D4h 00h 24h,通过 MOSI 发送,TPM 通过 MISO 回应为 C1h。阅读 TCG 规范可以帮助您理解命令格式。
0x80 = 读取(MSB 设置),位 5:0 是后续数据大小,0 = 1 字节事务。
0xD40024 = TPMDATAFIFO_0。在 MOSI 线上(主机发送命令数据到 TPM)。0x0024 = 主机和 TPM 之间 FIFO 数据缓冲区的 TPM 寄存器,用于命令或响应。Bitlocker 仅使用 Locality 0,因此 0024。Locality 1 使用 1024,Locality 2 使用 2024 等。
0xC1(1 字节响应)= MISO(主机输入/ CPU 从 TPM 接收响应数据)
这样做 32 次将导致从 TPM 发送到 PCH 的 32 字节,因此 AES-256 VMK。然而,在我们当前的情况下,我们将捕获数十万字节的 SPI 流,因此您将需要解剖并获取这 32 个字节。
图 7 - TPM 读取命令的 SPI 周期
暴力破解
一旦您可靠地捕获了数据流,就可以对数十万个 SPI 字节中的每个 32 字节组合进行穷举以找到密钥。
从您已捕获 SPI 流的目标机器中移除 Bitlocker 加密的 M.2 SSD,并使用 USBC-M.2 适配器将该 M.2 SSD 连接到运行 Linux 的机器。
Dislocker 是一个开源的 Linux 驱动程序,用于读取 Bitlocker 加密分区,它支持使用 VMK 进行解密。将您流中的每个 32 字节通信传递给这个 Dislocker 工具,在几千次尝试后,最终会成功获取密钥。
使用 ntfs-3g 挂载解密的 Dislocker NTFS 文件,然后就完成了。图 8 显示了插入到另一台 Linux 机器的 Bitlocker 加密驱动器的解密和挂载内容。
图 8 - 在另一个单元上找到 VMK 并挂载了 Bitlocker 加密驱动器
缓解措施
启用诸如字母数字 PIN 码或 USB 启动密钥之类的关键保护程序,因此,如果 SSD 被盗,攻击者需要具备这些额外信息;TPM 具有防止暴力破解的反锤击功能。不要使用离散的 TPM,而是使用由 AMD PSP 提供的固件 TPM(fTPM),它在 SOC 本身具有 TPM IP 块,因此使用内部芯片通信,而不使用公共 SPI 总线。让微软在 Bitlocker 中启用 TPM 参数加密,以在预启动时使用 authsession 加密命令和响应。
如果你是一个车联网攻防的长期主义者,欢迎加入我的知识星球,我们一起往前走,每日都会更新,微信识别二维码付费即可加入,如不满意,72 小时内可在 App 内无条件自助退款。