如何以编程方式从 UEFI 读取 ThunderBolt 固件

问题描述

ThunderBolt 固件存储在其自己的 SPI 闪存中,并可从操作系统更新。系统的 UEFI 固件还可以访问闪存中的配置数据 - 用户可以在预启动期间从固件设置菜单更改 ThunderBolt 安全级别 (SL)。这意味着肯定有某种方法可以通过某些 UEFI 协议访问 ThunderBolt 固件,但我尝试过的任何方法似乎都不起作用。

我的尝试

我能够使用 EFI_PCI_IO_PROTOCOL 根据供应商 ID 和设备 ID 成功识别 ThunderBolt 设备。

我最初认为固件是一个可选的 ROM,所以应该可以通过 EFI_PCI_IO_PROTOCOL.RomImage 访问它。但是该值为 0。然后我认为 PCI 配置空间内的扩展 ROM 基地址寄存器 (XROMBAR) 可能有它。但是 XROMBAR 也是 0。通过使用硬件编程器读取 SPI flash 提取固件,我发现它在任何地方都没有 0xAA55 和“PCIR”的选项 ROM 签名。所以看起来固件不是可选ROM。

然后我认为它可以存储在固件卷中,因此应该可以通过 EFI_FIRMWARE_VOLUME2_PROTOCOL 访问。我搜索了所有固件卷,找到了一些可选 ROM,但它们都不属于 ThunderBolt(从它们的供应商 ID 和设备 ID 来看)。

背景

我查看了 ThunderSpy 漏洞,报告指出 ThunderBolt 固件在启动期间未经过验证。我认为这是不寻常的,因为我当时的想法是固件应该是一个选项 ROM,并且选项 ROM 必须在每次启动期间通过安全启动进行签名和验证。从我目前的发现来看,固件似乎不是可选 ROM,很可能直接在 ThunderBolt 控制器芯片上执行,而不是在 cpu 上执行,因此它不在安全启动的范围内。我正在尝试以编程方式访问固件,以查看是否有办法防御类似 ThunderSpy 的攻击,这些攻击对固件进行了恶意修改

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)