基于光子发射引导的激光故障注入破解 RP2350 安全调试
TL;DR
- 光子发射显微镜 (PEM) 精确定位了控制 RP2350 调试访问的
DEBUGEN寄存器。 - 聚焦的 980 nm 激光脉冲置位了
PROC1和PROC1_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:
- 安全软件在紧密循环中切换特定的
DEBUGEN位。 - 为两个互补的位掩码捕获了数千帧红外图像。
- 对堆栈进行平均和相减处理,消除了静态背景,并揭示了与切换位相关联的局部光子发射。
- 生成的映射图突出了包含位 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),允许安全读取。
攻击序列为:
- 触发救援复位。
- 在核心处于引导 ROM 等待循环时,将
DEBUGEN故障注入为0xc。 - 通过其安全
DHCSR挂起核心 1。 - 通过受保护的读取接口读取 OTP 行
0xc08–0xc0f,提取 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
相关
- Dispatch
- Dispatch
- Dispatch
- Dispatch
- Dispatch