文章总结: 本文详细分析了CVE-2026-0714漏洞,揭示了Moxa嵌入式工业计算机在启动过程中通过SPI总线传输LUKS解密密钥时的明文泄露风险。研究人员利用逻辑分析仪成功嗅探并提取了TPM2_NV_Read命令返回的明文密钥,进而离线解密了设备的eMMC存储。文章指出该缺陷源于未启用TPM参数加密,并建议采用加盐会话等TCG标准机制来防御物理总线嗅探攻击,为嵌入式Linux设备的物理安全防护提供了重要参考。 综合评分: 95 文章分类: 漏洞分析,IoT安全,渗透测试,实战经验
[CVE-2026-0714] 嵌入式设备上的 TPM 嗅探 LUKS 密钥
cyloq cyloq
赛博堡垒
2026年2月22日 15:22 波兰
如果您在运行依赖 TCG/TPM 的crypto-custody,必须认真对待此问题。CVE-2026-0714 是一项高严重性的漏洞(CVSS 约 7.0),于 2026 年 2 月初披露,影响特定的 Moxa 工业计算机(例如 UC-1200A 系列,如 UC-1222A Secure Edition),这些设备运行 Moxa Industrial Linux 3 并使用 TPM 支持的 LUKS 全盘加密。该缺陷源于独立的 Infineon SLB9670 TPM 2.0 芯片通过未保护的 SPI 总线连接到 CPU。在启动过程中,系统发出 TPM2_NV_Read 命令,从策略保护的 NV 索引中检索存储的 LUKS 解密密钥(与 PCR 值绑定)。虽然 TPM 强制执行适当的授权,但密钥以明文形式通过 SPI 总线返回(在 MISO 线可见)。具备物理访问权限的攻击者可以打开设备,连接逻辑分析仪或总线嗅探器,捕获流量,解码 TPM 协议,并提取完整的 LUKS 密钥,从而实现对加密 eMMC 存储的离线解密。
缓解措施
TPM 2.0 支持在授权会话中进行参数加密(例如,使用非对称密钥交换派生共享会话密钥的加盐会话),这可以在传输过程中加密敏感参数,如 NV_Read 响应数据。这防止了即使总线被嗅探也出现明文泄露,符合 TCG 关于 CPU–TPM 总线保护抵御被动攻击的指导。
像 VaultBoot(来自 HardenedVault)这样的项目多年来已经实现了这一特性(至少自 2021 年起),用于保护 TPM 交互——包括 TPM 基于的全盘加密流程——抵御此类物理总线嗅探威胁(例如,防御像 TPM Genie 这样的攻击)。
总之,尽管 Moxa 设备通过 SPI 以未保护方式传输 LUKS 密钥,但在软件堆栈中启用 TPM 参数加密提供了有效的深度防御措施,以抵御这类物理攻击。
Per Idenfeldt Okuyama & Sam Eizad
https://www.cyloq.se/en/research/cve-2026-0714-tpm-sniffing-luks-keys-on-an-embedded-device
执行摘要
受信任的平台模块(TPM 2.0)被广泛用于保护存储加密密钥,并提供硬件支持的证明。虽然针对使用 BitLocker 的 Windows 系统进行 TPM 总线嗅探攻击的文献已相当丰富,但针对非 BitLocker 目标(如使用 LUKS 的嵌入式 Linux 设备)的研究相对较少。
在本研究中,我们证明了 Moxa UC-1222A Secure Edition 在启动过程中通过与 PCR 政策绑定的 TPM2_NV_Read 操作以明文形式释放其完整的 LUKS 设备解密密钥。尽管 TPM 正确强制执行授权,但返回的密钥材料通过 SPI 接口以未加密的形式传输。通过被动监控 SoC 和独立 TPM 2.0 设备之间的 SPI 总线,可以恢复 LUKS 解密密钥,并用于解密加密的存储。
此问题已被 Moxa 认可,并分配了 CVE-2026-0714。
引言
在 2025 年 10 月,我们对基于 ARM 的 Moxa UC-1222A Secure Edition 工业计算机进行了安全评估。供应商对 UC-1200A 系列的描述如下:
UC-1200A 计算平台旨在用于嵌入式数据采集应用 […] 该小型嵌入式计算机以灵活的接口选项,是现场数据采集和处理的可靠安全网关,也是许多其他大规模部署的有用通信平台。
该设备被宣传为一个强化平台,支持由独立 TPM 2.0 芯片支持的全盘加密。
威胁模型
我们假设对手具有对设备的物理访问权限,能够在使用专业硬件工具进行探测和篡改的条件下进行攻击。
考虑到使用经 SPI 连接的独立 TPM,我们评估了在启动过程中被动总线监控是否可能暴露敏感的密钥材料。
先前研究
针对 TPM 2.0 的被动总线嗅探攻击已经在多个上下文中得以证明,特别是针对启用 BitLocker 的 Windows 系统。这些攻击通常针对 BitLocker 卷主密钥,该密钥在启动过程中由 TPM 释放,用于解密受保护的卷。
也有成功的 TPM 嗅探攻击针对非 BitLocker 目标。Jos Wetzels 演示了使用 Clevis 和独立 TPM 解锁 LUKS 加密磁盘的 Linux 设备存在 SPI 嗅探的漏洞,攻击者可以通过物理访问从 TPM SPI 流量中提取 JWK 并重建设备解密密钥。
然而,公开研究较少地考察了这类攻击是否适用于嵌入式和工业 Linux 系统。这类设备可能依赖于特定供应商的 initramfs 钩子和定制的配置逻辑,而不是使用像 Clevis 这样的解决方案。目前尚不清楚此类设备是否会通过 TPM 总线暴露密钥材料。
此外,对于在无人监控或远程环境中部署的嵌入式设备,攻击者进行长时间的物理访问可能比例如一台客户笔记本电脑更为容易。通过本研究,我们希望展示成功的嵌入式设备 TPM 嗅探攻击的可能形式。
#
TPM 2.0 架构概述
Moxa UC-1222A Secure Edition 使用独立的 TPM 2.0 设备作为证明的根信任和存储解密密钥的保护机制。TPM 在其内部非易失性存储器中维护持久的根秘密,包括形成其密钥层级基础的种子,具体如 TCG TPM 2.0 库规范(第 1 部分)所述。
设备解密密钥的保护机制
设备解密密钥不是直接存储在系统存储中,而是在设备配置期间生成,并由 TPM 根据授权政策进行保护。TPM 的内部根秘密不会离开芯片。相反,它们用于强制执行政策并保护 TPM 对象,例如设备解密密钥。
在 Moxa UC-1222 启动期间,主机 SoC 发出 TPM 命令以读取此受保护 NV 索引的内容,作为 TPM 结构化命令-响应协议的一部分。如果满足授权政策,TPM 将返回密钥材料,我们将其称为 LUKS 磁盘密钥,以解锁加密分区。
被动 TPM 总线嗅探攻击的模式
通过以下模式,被动的 TPM 总线嗅探攻击得以利用:
- 应用层的秘密(LUKS 设备密钥)在 TPM 中配置,并在启动期间由主机检索。
- 尽管 TPM 正确执行授权政策,但检索到的数据通过 SPI 接口以明文形式传输,使得具有物理访问能力的攻击者能够通过监控总线恢复该数据。
SPI 接口
串行外设接口(SPI)是一种同步串行通信总线,用于独立 TPM 与 ARM SoC 之间的通信。SoC 作为 SPI 主设备运行,而 TPM 作为 SPI 从设备工作。
SPI 通信基于四个主要信号:
-
SCLK(串行时钟)
:由主机生成,用于同步数据传输。
-
MOSI(主出,从入)
:将数据从主设备(CPU)传输到从设备(TPM)。
-
MISO(主入,从出)
:将数据从从设备(TPM)传输到主设备(CPU)。
-
SS / CS(从选择 / 芯片选择)
:由主设备断言,用于选择特定的从设备并发起transaction。
固件分析
Moxa 的固件映像可以在供应商处公开获取,链接如下。
我们提取了第一个分区,其中包含 initrd 映像,并检查了位于 moxa-initrd-init/hooks.d/ 下的启动脚本,以识别早期引导过程中执行的与 TPM 相关的操作。
我们确定 generate-keys 脚本特别相关,因为它包含处理加密密钥的逻辑。脚本的相关部分调用 tpm2_nvread 工具以访问与 LUKS 设备密钥相关的定义 NV 索引:
device_luks_key=$(tpm2_nvread -T device:"${TPM2_DEV}" -P "pcr:${PCRS_SELECTION}""${DEVICE_LUKS_KEY_INDEX}")
此命令针对由 DEVICE_LUKS_KEY_INDEX 确定的 NV 索引发出一个 TPM2_NV_Read 操作,授权与指定的 PCR 选择绑定。由于此操作会通过 SPI 接口导致结构化的命令-响应交换,因此可以在捕获的 SPI 流量中识别到响应。
硬件设置 目标 TPM
Moxa UC-1222A 使用 Infineon SLB9670 TPM 2.0 芯片进行密钥存储。该芯片的引脚分配可以在下表中查看(具体请参见官方数据手册)。
根据 SPI 部分,嗅探 SPI 总线流量所需的引脚如下:
| Pin | Signal | Description | | — | — | — | | 1 | CS# | Chip Select (active low) | | 2 | MISO | Master In, Slave Out | | 3 | MOSI | Master Out, Slave In | | 4 | SCLK | Serial Clock |
#
逻辑分析仪连接
为了进行被动总线嗅探攻击,使用了 Logic 8 Saleae 8 通道逻辑分析仪。
在下表中,可以看到 Saleae 的设置。
| Saleae Channel | TPM Pin | Signal | | — | — | — | | CH0 (Green) | 1 | CS# | | CH1 (Blue) | 4 | SCLK | | CH2 (Purple) | 2 | MISO | | CH3 (Yellow) | 3 | MOSI |
嗅探 SPI 总线
为了嗅探总线流量,使用了以下逻辑分析仪设置进行探头连接。
SPI 总线嗅探设置
CS 和 SCLK 探头连接到 Infineon TPM 的 SPI 接口,而 MISO 和 MOSI 探头则连接到同一信号网的测量点上,便于连接,而不是直接连接到 TPM 的 MISO 和 MOSI 引脚。上述图中未显示地面引脚,因为它连接到 PCB 对面的一处接地点。
Logic 2 被配置为在全启动时间内以 250 MS/s 的读取速度运行,电压为 3.3+ 伏特,启动时间大约为 50 秒。
探头连接完成并且 Logic Pro 配置好后,启动了 Moxa UC-1222A,并记录了以下流量
Logic 2 允许将捕获的流量导出为 CSV 格式。这些数据可以进行分析,以理解 TPM 与 SoC 之间的交换。为了解析数据并提取 TPM 2.0 命令,编写了两个自定义脚本。
TCG 的《TPM2 部分 2:结构》文档中的表 14 揭示了我们感兴趣的命令代码。TPM_CC_NV_Read 命令对应的命令代码为 0x0000014E。通过 tpm2_spi_decoder 脚本可以解析数据,并提供 MOSI 流的偏移量和命令代码。如果我们对 0x0000014E 进行 grep 搜索,可以看到如下内容:
python3 tpm2_spi_decoder.py digital_TPM_EXPORT_raw.csv | grep "0x0000014E"
这告诉我们发送 TPM_CC_NV_Read 命令的偏移量。为了查看响应,我们需要分析该偏移量附近的 MISO 流。tpm_spi_carve.py 脚本提供了这一功能,并可以通过以下标志使用。作为替代方案,我们还可以使用 tpmstream 程序,该程序由 tpm2-software 社区提供。
python3 tpm_spi_carve.py digital_TPM_EXPORT_raw.csv --carve-after-offset 23870 --carve-dir miso --carve-hex key.txt --carve-bin key.bin
这将生成一个二进制文件,可以使用 hexdump 工具进行查看
hexdump -C key.bin
捕获的 SPI 流包含完整的 TPM2_NV_Read 响应。在十六进制视图中,响应字节被进行颜色编码
标记值 TPM_ST_SESSIONS (0x8002) 表明响应包含参数大小字段和一个包含 TPMS_AUTH_RESPONSE 结构的会话区域。参数部分包含命令返回的 TPM2B_MAX_NV_BUFFER,而后面的会话区域则携带授权响应数据。
使用 TPM 2.0 第 2 部分 的结构定义和 第 3 部分 的命令定义,可以解析 SPI 响应,具体如下所示。十六进制视图中的每种颜色依次对应表中从上到下的每一行。
| Name | Type | Contents | Specification |
| — | — | — | — |
| tag | TPM_ST | 80 02 | TPM_ST_SESSIONS |
| responseSize | UINT32 | 00 00 00 d5 | Response Size (213 bytes) |
| responseCode | TPM_RC | 00 00 00 00 | TPM_RC_SUCCESS |
| parameterSize | UINT32 | 00 00 00 82 | Parameter Size (128 + 2 bytes) |
| data | TPM2B_MAX_NV_BUFFER | 00 80 48 69 … | Buffer size + NV Data |
| authResponse | Several | 00 20 ca 2c … | TPMS_AUTH_RESPONSE |
十六进制视图中橙色部分显示了响应数据,包含明文的 LUKS 设备密钥。经过提取后,可以查看其完整内容。
python3 tpm_spi_carve.py digital_TPM_EXPORT_raw.csv --carve-after-offset 23870 --carve-
after-length 417 --carve-count 136 --carve-dir miso --carve-hex key.txt --carve-bin key.bin ;
xxd -p key.bin | tr -d '\n' | sed 's/00000001//g' | xxd -r -p > out.bin
hexdump -C out.bin
下面的密钥可以用来解密设备上 LUKS 加密的分区,从而访问存储
Hi7geepueYoh3beleil4aiXeequo6pe9aiv4ji5iNgai2meiga1ao3Qua5Ouc8iofaihax4chiex0Ue7ish0faumo4KeiHaph5jungowoph5ooqu2izaizoh2veish4h
数据流图
以下图表总结了通过 SPI 的完整命令-响应流程。
自动密钥提取
在 GitHub 上制作了一个 Saleae 插件,用于自动提取 NV_Read 秘密
密钥验证
为了确认密钥的有效性,使用热风焊接技术拆卸了 eMMC 闪存芯片,并使用 Allsocket eMMC153 读取器对其进行安装和读取。以下是过程:
步骤 1:涂抹焊接助焊剂
在 eMMC 闪存芯片上涂抹焊接助焊剂。
步骤 2:拆卸芯片
使用热拆焊技术拆卸 eMMC 芯片。
步骤 3:清除焊料
使用软毛(尼龙)牙刷和 99% 异丙醇清除 eMMC 上的残留焊料,然后让其自然干燥。
步骤 4:读取 eMMC 芯片数据
使用 Allsocket eMMC153 读取器读取 eMMC 数据,并生成图像。
sudo dd if=/dev/disk9s3 of=emmc_moxa_dump_full5.img bs=4m status=progress
步骤 5:挂载图像并成功测试密码短语
随后挂载加密图像,此时输入密码短语或 LUKS 设备密钥。下方截图显示在输入密码短语后成功挂载图像。这验证了嗅探到的密码短语是正确的。
讨论
如果您的设备使用独立 TPM,并且您的威胁模型包括物理访问,您必须考虑 TPM 总线嗅探攻击。这项工作表明,该设备不仅限于客户 PC 或笔记本电脑,还可以是嵌入式系统或工业计算机。
与在启用 BitLocker 的系统上进行 TPM 总线嗅探攻击相比,对我们的 Moxa 进行相应的修改相对较小。BitLocker 通常依赖 TPM2_Unseal 来释放密封对象,而 Moxa 设备则使用 TPM2_NV_Read 从政策保护的 NV 索引中检索密钥。在先前的研究中,TPM2_Unseal 是这些类型攻击中观察到的最常见命令,几乎成为 TPM 释放其磁盘解密秘密的代名词。据我们所知,这是首次公开记录的 TPM 嗅探攻击,其中 TPM2_NV_Read 是释放密钥的机制。尽管 TCG 之前在其 CPU–TPM 总线保护指南文档中已经描述了这种释放密钥材料的方法,但是我们推测在实际应用中可能存在类似的实现。
缓解措施
受信任的计算组(TCG)在其 TCG CPU–TPM 总线保护指南 中提供了缓解被动总线监控攻击的指导。该规范支持通过授权会话进行参数加密,使敏感的命令和响应参数在主机与 TPM 之间传输时受到保护。
通过组合 tpmKey 和绑定参数建立加密会话,从而生成未绑定、已绑定、加盐或加盐且已绑定的会话类型。已绑定会话的安全性来源于现有对象的 authValue 的熵,而加盐会话则使用非对称加密来建立共享会话密钥,而无需预先存在的秘密。
对于用户未输入 PIN 的启动过程,以及没有可用的高熵 authValue 的情况,已绑定会话并未提供有意义的保护。然而,加盐会话即便在没有用户输入的情况下,仍然可以保护命令和响应参数。这种会话选择的一个缺点是由于非对称密钥交换而导致的较慢设置。
References
- Denis Andzakovic – Extracting BitLocker keys from a TPM
- Henri Nurmi – Sniff, there leaks my BitLocker key
- Guillaume Quéré – Bypassing Bitlocker using a cheap logic analyzer on a Lenovo laptop
- Jos Wetzels – TPM Sniffing Attacks Against Non-Bitlocker Targets
- Trusted Computing Group – Trusted Platform Module 2.0 Library Part 1: Architecture
- OPTIGA – TPM SLB 9670 Datasheet
- Trusted Computing Group – Trusted Platform Module 2.0 Library Part 2: Structures
- tpmstream-web
- Trusted Computing Group – CPU–TPM Bus Protection Guidance
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:赛博堡垒 cyloq cyloq《[CVE-2026-0714] 嵌入式设备上的 TPM 嗅探 LUKS 密钥》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。


![[CVE-2026-0714]嵌入式设备上的TPM嗅探LUKS密钥](/images/random/titlepic/4.jpg)






评论