所有信息仅供参考学习之用。请自行承担遵循这些说明的风险。作者及其雇主均不对任何个人或组织因根据本页所含信息采取或未采取行动而导致的直接或间接损害或损失负责。
简介
所需软件
生成载荷
生成解锁令牌
准备 SPI Flash 镜像
将文件集成到固件镜像
禁用 OEM 签名
构建固件镜像
启动主 CPU
将镜像写入 SPI Flash
准备 USB 调试线
修补 OpenIPC 配置文件
解密 OpenIPC 配置文件
将 LMT Core 添加到配置
设置 IPC_PATH 环境变量
执行 JTAG 可操作性的初始检查
显示 CPU ME 线程
暂停核心
ME 调试:快速入门
读取任意内存
读取 ROM
为什么选择 TXE?
已测试平台列表
作者
许可证
漏洞 INTEL-SA-00086 允许为 Intel Management Engine 核心激活 JTAG。我们为 Gigabyte Brix GP-BPCE-3350C 平台开发了我们的 [JTAG PoC][8]。虽然我们建议新手研究人员使用相同的平台,但其他厂商搭载 Intel Apollo Lake 芯片组的平台也应支持该 PoC(适用于 TXE 版本 3.0.1.1107)。
漏洞 INTEL-SA-00086 涉及在处理存储在 MFS([内部 ME 文件系统][6])上的文件时发生缓冲区溢出。完整文件路径是 /home/bup/ct。您需要使用 Intel Flash Image Tool (FIT) 将其集成到 ME 固件中,该工具是英特尔向基于 Intel PCH 芯片组硬件的 OEM 提供的 Intel 系统工具之一。 以下是 Intel 系统工具包根目录的结构:

Intel ME (TXE, SPS) 系统工具实用程序并非面向最终用户,因此您无法在英特尔官方网站上找到它们。然而,一些 OEM 会将其作为软件更新的一部分与设备驱动程序一起发布。因此,要将我们的 PoC 集成,您需要 Intel TXE System Tools 3.x 版本,该版本可以在网上找到。
您需要安装 Intel System Studio,其试用版可从英特尔网站下载。在我们的实验中,我们使用了 Intel System Studio 2018。
该 PoC 针对 Intel TXE 固件版本 3.0.1.1107。Gigabyte GB-BPCE-3350C 版本 F5 的 SPI Flash 镜像包含所需的固件版本。
我们所有的脚本均使用 Python 编写。我们建议使用 Python 2.7。 此外,脚本需要 pycrypto 包。要安装 pycrypto,请运行以下命令:
pip install pycrypto
仅当您需要启动 CPU 时才需要此实用程序。
EFI 人机界面基础设施 (Human Interface Infrastructure, HII) 是一种在 UEFI 中创建用户界面以及处理和管理用户输入的特殊机制。EFI HII 为所有选项(包括隐藏选项)标识默认值。一旦找到与 DCI 相关的选项,就可以为默认配置激活它,并通过恢复 BIOS 出厂设置来启用 DCI。要启动主 CPU,您需要 AMI BIOS Configuration Program 5.xx 版本,该版本也可以在线找到。
运行脚本 me_exp_bxtp.py:
me_exp_bxtp.py -f <file_name>
该脚本生成必要的数据并将其导出到指定文件(请指明完整文件路径,或在当前目录内仅提供名称,默认为 ct.bin)。此文件稍后将被 FIT 使用。
运行脚本 me_utok_bxtp.py:
me_utok_bxtp.py -f <file_name>
该脚本生成必要的数据并将其导出到指定文件(请指明完整文件路径,或在当前目录内仅提供名称,默认为 utok.bin)。此文件稍后将被 FIT 使用。
如果您不需要启动 CPU,可跳过此步骤。
要激活 DCI Enable 选项,请运行 AMIBCP 实用程序,并使用它打开您平台附带的 SPI 固件镜像。对于 Gigabyte Brix GP-BPCE-3350C,请打开从上述 Gigabyte 链接下载的文件(归档中的镜像文件路径:F5/image.bin)。

现在我们需要在 Setup Configuration 选项卡中启用 HDCIEN 选项。
要集成 ct.bin 和 utok.bin 文件,请运行 FIT 实用程序(fit.exe),并使用它打开 SPI 固件镜像。

如果您使用的是其他硬件平台且无法访问 TXE 3.0.1.1107,您可以下载 Gigabyte GB-BPCE-3350C 版本 F5 的 SPI Flash 镜像,并通过 FIT 提取 TXE 部分。FIT 在打开镜像时会提取整个 SPI 镜像的不同部分(SPI 描述符、UEFI/BIOS 固件、Intel ME 固件和解锁令牌),并将它们保存到 *"image_name"/Decomp * 文件夹中。

因此,您可以在 /Decomp/TXE Region.bin 找到包含所需 Intel TXE 固件的文件。
然后,在 FIT 中打开您特定平台的 SPI 镜像,并将包含 Intel TXE 固件的文件替换为从 GB Brix 3350c 镜像中获得的版本(Flash Layout 选项卡上的 "Intel(R) TXE Binary File"):

现在我们需要在 FIT 中指明我们为 /home/bup/ct 和 Unlock Token 生成的文件。在 FIT 的 Debug 选项卡上,您可以指定要集成到固件中的 Trace Hub Binary 和 Unlock Token。这些应该是我们已经生成的文件。

只需从 FIT 中删除 OEM Public Key Hash 字段:

通过在 Build 菜单 中选择 Build Image 来构建镜像。

忽略有关 BootGuard 设置的消息(单击 "Yes"):

如果到目前为止一切操作正确,构建过程应成功完成,FIT 会输出类似以下控制台消息:

如果您不需要启动 CPU,可跳过此步骤。
您必须激活 HAP 模式以启动 CPU。应设置偏移量 +0x102 处字节的第 0 位:

要将镜像写入 SPI flash,我们强烈建议使用 SPI 编程器。
务必备份原始固件,以便在出现问题时可以恢复!
您需要一根 USB 3.0 debug cable 来连接到平台。您可以购买专门为此目的制造的线缆,或通过隔离 USB 3.0 AM–AM 线缆的 D+、D- 和 Vcc 触点来自行改装一根。

英特尔开发并向用户提供了两个软件包,可用于平台和主 CPU 的 JTAG 调试:DAL(DFx 抽象层)和 OpenIPC。DAL 和 OpenIPC 都是 Intel System Studio 的一部分。安装 Intel System Studio 2018 后,OpenIPC 将出现在以下目录中:
Windows
C:\Intel\OpenIPC_1.1740.2381.100
Linux
/opt/intel/system_studio_2018/system_debugger_2018/debugger/openipc
OpenIPC 配置已加密且不支持 TXE 核心。因此,请解密配置并向其中添加 TXE 描述。
要解密配置文件,请使用 IDA Pro 脚本 openipc_key_extract.py 从 OpenIPC/Bin 中的 StructuredData 库(Linux:libStructuredData_x64.so,Windows:StructuredData_x64.dll)提取密钥。将该密钥(在我们的案例中为 4504fb02be0a9c4c84df2a89cf508bc3)连同 OpenIPC 目录的路径一起传递给脚本 config_decryptor.py。
config_decryptor.py –k 4504fb02be0a9c4c84df2a89cf508bc3 –p C:\Intel\OpenIPC
所提供的 OpenIPC 版本没有关于 TXE 核心的必要信息。因此,我们需要对解密后的 OpenIPC 配置文件应用补丁(patch.diff)。操作如下:
patch -p2 < patch.diff
解密并修补后,将 IPC_PATH 环境变量设置为新的 OpenIPC 目录,以便 ipccli 使用修改后的 OpenIPC 版本。例如:
Windows
set IPC_PATH=c:\Intel\OpenIPC\Bin
激活器 通过在 JTAG 激活后将 BUP 进程保持在循环中,从而阻止后续加载。启动后,平台不会显示任何生命迹象(显示器不亮,键盘指示灯不亮,没有 BIOS POST 声音)。因此,您需要通过 DCI 调试来检查平台是否已“卡”在 BUP 模块中。
与 DAL 一样,OpenIPC 库包含一个命令行界面(CLI),该界面用 Python 编写,并作为 Python 库随 Intel System Studio 提供,可以通过 pip 安装到系统上。 ipccli 的安装包位于以下路径: Windows
<Program Files(x86)>\IntelSWTools\system_debugger_2018\debugger\ipccli\ ipccli-1.1740.544.100-py2.py3-none-any.whl
Linux
/opt/intel/system_studio_2018/system_debugger_2018/debugger/ipccli/ipccli-1.1811.727.100-py2.py3-none-any.whl