基于光子发射引导的激光故障注入破解 RP2350 安全调试

TL;DR

  • 光子发射显微镜 (PEM) 精确定位了控制 RP2350 调试访问的 DEBUGEN 寄存器。
  • 聚焦的 980 nm 激光脉冲置位了 PROC1PROC1_SECURE 位,即使在已编程永久禁用调试的情况下,也重新启用了安全世界 (Secure-world) 调试。
  • 在执行救援复位 (rescue reset) 后,攻击者从 OTP 存储器中读取了固件在运行时锁定的 128 位密钥。
  • 该攻击需要破坏性的芯片预处理、精密的激光设备以及价值约 $250 k 的实验室器材。

RP2350 安全架构与调试禁用链

RP2350 微控制器实现了:

  • 存储在一次性可编程 (OTP) 存储器中的公钥验证安全启动。
  • 分离安全状态和非安全状态的 Armv8-M TrustZone。
  • 一个永久性的 CRIT1.DEBUG_DISABLE 标志,该标志可禁用两个核心的 Mem-AP,从而切断所有 SW-DP 和调试 AP 总线访问。
  • 一个 DEBUGEN 寄存器,根据数据手册,当其所有位被置位时,可以覆盖 DEBUG_DISABLE
  • DEBUGEN_LOCK 位,用于锁定对 DEBUGEN 的软件写入,但该位缺乏硬件冗余。

OTP 子系统存储持久锁行 (PAGEn_LOCK0/1) 并对关键标志使用八选三投票机制,使得永久调试禁用标志能够抵御单比特故障。然而,DEBUGEN 寄存器本身缺乏冗余、奇偶校验或多数投票机制,使其成为潜在的薄弱环节。

破解挑战的实验配置

作者在修订版 A4 设备上复现了 Raspberry Pi RP2350 破解挑战:

  • 将 SHA-256 公钥指纹编程到 BOOTKEY0 中并启用安全启动。
  • 设置 CRIT1.DEBUG_DISABLE = 1 并将故障检测器灵敏度调至最高。
  • 配置 OTP 第 48 页,设置 PAGE48_LOCK1 = 0x3c3c3c,授予安全读写权限但拒绝非安全访问。
  • 挑战固件在启动后于运行时锁定第 48 页 (sw_lock[48] = 0b1111),防止任何进一步的读取。

光子发射显微镜 (PEM) 隔离 DEBUGEN 位活动

为了定位单个 DEBUGEN 位的微小存储单元,团队使用了 PEM:

  1. 安全软件在紧密循环中切换特定的 DEBUGEN 位。
  2. 为两个互补的位掩码捕获了数千帧红外图像。
  3. 对堆栈进行平均和相减处理,消除了静态背景,并揭示了与切换位相关联的局部光子发射。
  4. 生成的映射图突出了包含位 0-3 活动的微米级区域。

“在不同位掩码之间进行的重复比较,揭示了在相机视野的三个区域中与 DEBUGEN 位 0-3 相关联的紧凑站点。” – Ledger Donjon 博客

这些热点将激光扫描区域从整个芯片缩小到了几微米的窗口。

激光故障注入 (LFI) 翻转 DEBUGEN

研究人员使用 980 nm 脉冲激光(约 1.2 W,100 ns 脉冲,50× 物镜),在监控 SW-DP 响应的同时扫描 PEM 识别的区域:

  • 一个位置持续置位 PROC1(启用核心 1 的 Mem-AP)。
  • 第二个位置置位 PROC1_SECURE(允许通过该 Mem-AP 进行安全访问)。
  • 这两个位置仅相隔几微米;20× 物镜无法隔离它们,因为较大的光斑同时击中了置位和清除区域。
  • 一个迭代脚本对每个点进行脉冲照射,直到两个位都保持置位,从而实现了持久的 DEBUGEN = 0xc 值。

至关重要的是,激光还将相应的 DEBUGEN_LOCK 位翻转为 1,防止任何后续的软件写入清除调试启用状态。

利用救援复位读取 OTP 密钥

在恢复安全调试后,攻击者通过常开的 RP-AP (CTRL.RESCUE_RESTART) 执行了救援复位。此复位:

  • 在用户固件运行前停止引导 ROM,因此第 48 页的运行时锁定从未应用。
  • 保留了持久的 OTP 锁 (LOCK_S = READ_WRITE),允许安全读取。

攻击序列为:

  1. 触发救援复位。
  2. 在核心处于引导 ROM 等待循环时,将 DEBUGEN 故障注入为 0xc
  3. 通过其安全 DHCSR 挂起核心 1。
  4. 通过受保护的读取接口读取 OTP 行 0xc080xc0f,提取 128 位密钥。

密钥在单次运行中被恢复,证明了当与救援复位结合使用时,安全调试可以绕过运行时 OTP 锁定。

为什么 DEBUGEN_LOCK 不能阻止攻击

DEBUGEN_LOCK 旨在阻止软件写入,但激光故障可以同时置位 DEBUGEN其锁定位。一旦锁定为 1,软件就无法清除相应的 DEBUGEN 位,使得故障在发生另一次物理故障之前一直保持。

缓解措施评估与更广泛的影响

  • 硬件层面:OTP 冗余保护了永久调试禁用标志,但未受检查的 DEBUGEN 寄存器造成了绕过漏洞。
  • 软件层面:运行时 ACCESSCTRL 限制可以限制直接的 Mem-AP 访问,但具有安全属性的调试器仍然可以控制核心并读取寄存器,从而破坏机密性。
  • 复位层面:RP-AP 救援复位在固件重新锁定之前将 OTP 运行时锁恢复到其持久状态,从而暴露了任何允许安全读写的 OTP 页。
  • 实用性:该攻击需要破坏性开盖、高精度激光系统以及专业的硬件安全知识,成本约为 $250 k。评论者指出,功能性复制品可以在 $25 k 以下构建,但对于普通攻击者来说,门槛仍然很高。

“该攻击需要物理访问、破坏性预处理以及大约 250,000 美元的实验室设备。” – Ledger Donjon 博客

社区反应

  • 成本视角BitBangingBytes 认为使用 ChipShouter 等更便宜的组件,可以在 $10 k 以下组装该装置。
  • 更广泛的相关性byb 指出,这些发现对于任何安全隔离设备(如 Yubikey 类产品)都很重要。
  • 技术好奇心akoboldfrying 询问挑战密钥是如何初始编程的,强调公共仓库只写入占位符值,真正的密钥必须由竞赛组织者提供。
  • 方法论批评nullc 建议使用替代的故障刺激(例如 X 射线)可以避免开盖,尽管没有提供证据。

结论

  • RP2350 的安全链仅与其最薄弱的执行点一样强大;DEBUGEN 提供了一个不受保护的覆盖机制,激光故障注入可以利用这一点。
  • 光子发射显微镜是一种有效的预瞄准步骤,将大海捞针的问题变成了可处理的微米级搜索。
  • 救援复位行为与故障 DEBUGEN 相结合,使得读取固件在运行时故意隐藏的 OTP 密钥成为可能。
  • 缓解措施必须考虑完整的执行路径——从不可变的 OTP 位到可变的控制寄存器和复位逻辑——而不是孤立地对待每种机制。

披露:该漏洞已于 2026 年 7 月 28 日报告给 Raspberry Pi。作者感谢 Raspberry Pi 团队的建设性回应。

Sources

相关