Hacker News 中文摘要

RSS订阅

光子发射引导激光故障注入实现RP2350安全调试 -- Photon-Emission-Guided Laser Fault Injection Enables RP2350 Secure Debug

光子发射显微镜让研究人员在树莓派(Raspberry Pi)微控制器 RP2350 上定位了负责启用调试功能的寄存器。随后在邻近两处发射激光脉冲,即便调试已被永久禁用,也恢复了芯片安全世界(Secure world)的调试器访问。借助救援重置后的访问,他们从一次性可编程存储器中恢复了秘密。该攻击需物理接触、破坏性准备及约250,000美元设备。

正文

TL;DR

  • 光子发射显微镜让我们定位到树莓派微控制器上负责启用调试功能的一个寄存器。
  • 在两个相近位置发射激光脉冲,即便调试已被永久禁用,也恢复了芯片 Secure 世界的调试器访问。
  • 在救援复位后利用该访问,我们从一次性可编程存储器中恢复了一个密钥。复位在固件施加运行时锁之前暂停了芯片,所以该页保持 Secure 可读。
  • 攻击需要物理访问、破坏性制备以及约 25 万美元的实验室设备。

RP2350 安全模型

RP2350 是树莓派的双核微控制器:每个处理器插槽在启动时可选择 Arm Cortex-M33 或 RISC-V Hazard3 核心。其硬件安全特性包括:

  • 安全启动,根据一次性可编程存储器(OTP)中配置的公钥指纹验证签名固件
  • Armv8-M TrustZone,隔离 Secure 与 Non-secure 执行状态
  • 永久调试禁用设置
  • 故障检测器,用于检测时钟或电源操控引起的时序扰动

树莓派通过 RP2350 黑客挑战赛主动邀请研究者评估这些防护。首场挑战于 2024 年 8 月至 12 月针对原芯片进行。解决若干发现后,树莓派发布了 A4 修订版——即我们测试的版本。

永久安全配置和启动公钥指纹存储在一次性可编程(OTP)存储器中:每位只能从 0 翻转到 1 一次且不可逆转,写入内容在芯片生命周期内持久保存。

OTP 组织为 128 字节页,由两行持久(硬)锁行保护:对第 n 页,PAGEnLOCK0 配置可选读写密钥及无密钥时的行为,PAGEnLOCK1 包含硬件强制的 LOCKS 和 LOCKNS 权限。这些状态可从读写变为只读或不可访问,但不能变得更宽松。

OTP 子系统对安全相关字段使用冗余编码:关键标志“用跨八行连续 OTP 行的三选八投票编码”,OTP 锁位“三重冗余且多数投票”,据 RP2350 数据手册。

OTP 复位时,持久 LOCKS 和 LOCKNS 值初始化每页运行时锁(软锁)。固件可收紧此锁直至下次 OTP 复位,但不能放松。运行时变更在复位后不保留。

外部调试器通过 Arm 的 Serial Wire Debug (SWD) 接口通信。请求先到 SW-DP,再路由到访问端口。在所用 Cortex-M33 配置中,每核有一个连到系统总线的 Mem-AP;启用的 Mem-AP 允许调试器读写许可内存和外设。另一始终在线的 RP-AP 暴露少量复位和恢复控制。

Secure debug 指具有 Secure 属性的 Mem-AP 访问。调试器可随后与访问逻辑许可的 Secure 内存映射资源交互,并暂停或检查 Secure 状态运行的核心。

永久 CRIT1.DEBUG_DISABLE 标志旨在关闭此路径。设置时,它将两核 Mem-AP 使能信号驱动为 0,“阻止 AP 执行任何总线访问”,并禁用工厂测试 JTAG 和 RISC-V 调试模块访问端口。SW-DP 和 RP-AP 仍响应,但两核 Mem-AP 均不能访问系统总线。

然而存在覆盖:内存映射 DEBUGEN 寄存器允许 Secure 软件重新启用每核 Mem-AP,并单独允许通过其的 Secure 访问。数据手册称 DEBUG_DISABLE“可通过设置该寄存器所有位完全覆盖”。

强制链中的这一关键覆盖使调试接口成为我们的目标。在 Mem-AP 上获得 Secure debug 是读写 Secure 内存、暂停单步核心及检查寄存器的通用原语。该寄存器能否被故障设置,是下文回答的问题。

实验设置

目标配置

树莓派挑战赛要求提取存储在 OTP 中的 128 位密钥。启动时签名固件确保第 48 页有预期持久锁,然后施加运行时锁,在下次 OTP 复位前拒绝 Secure 和 Non-secure 对密钥的访问。

我们在自己的 A4 设备上复制了该配置:

  • 将公钥 SHA-256 指纹写入 BOOTKEY0
  • 设 BOOTFLAGS1.KEYVALID 为 0x1,KEY_INVALID 为 0xe
  • 启用安全启动(CRIT1.SECUREBOOTENABLE = 1)
  • 永久禁用调试(CRIT1.DEBUG_DISABLE = 1)
  • 最大灵敏度启用故障检测器(CRIT1.GLITCHDETECTORENABLE = 1, SENS = 3)
  • 按挑战配置设置页 1 和 2 持久锁
  • 设页 48 持久锁 PAGE48LOCK1 = 0x3c3c3c,拒绝 Non-secure 访问(LOCKNS = INACCESSIBLE)同时保留 Secure 读写(LOCKS = READWRITE)

启用安全启动后仅允许 Cortex-M33,故两插槽均用 Arm。

样品制备与实验台

器件经背面开封装,使红外光透过硅基板到达晶体管,而非被正面金属层阻挡。芯片焊回连接到 Scaffold(Ledger Donjon 驱动监测被测器件的开源平台)的子板。移除背面引线框会断开 GND,故用铜线恢复。

背面开封装的RP2350安装在分析子板上

用于攻击的实验台

DEBUGEN:覆盖永久调试禁用

DEBUGEN 有五个功能位:

| 位 | 名称 | 效果 | | --- | --- | --- | | 0 | PROC0 | 启用核 0 内存访问端口 | | 1 | PROC0SECURE | 允许通过核 0 内存访问端口的 Secure 访问 | | 2 | PROC1 | 启用核 1 内存访问端口 | | 3 | PROC1SECURE | 允许通过核 1 内存访问端口的 Secure 访问 | | 8 | MISC | 启用额外调试组件,包括交叉触发接口和 RISC-V 调试访问端口 |

核上 Secure debug 需要其两个位:启用 Mem-AP 的位和允许通过其 Secure 访问的位。

与 OTP 安全字段的冗余编码不同,数据手册未记载 DEBUGEN 的位冗余、奇偶或多数投票。

因此我们测试了激光脉冲能否在以上安全设备上设置 DEBUGEN 位。

光子发射引导定位

该测试首先需知瞄准何处。设置单个 DEBUGEN 位意味着命中单个寄存器位的存储,大海捞针。这比激光故障注入中常见的指令跳过故障更难,后者扰动核流水线中任意触发器即可产生同跳过:敏感区足够广,随机扫描能找到。盲扫单个 DEBUGEN 位不现实。

开关晶体管发射与活动相关的微弱近红外光子,重复执行时收集该发射可揭示所选控制的状态变化位置。这使光子发射显微镜(PEM)适用于 DEBUGEN:作为内存映射寄存器,Secure 软件可在循环中切换精确位,驱动测量所需的重复状态变化。我们将其作为首定位阶段,所得图将后续激光扫描限制到几微米区域。

我们比较了重复切换所选 DEBUGEN 位开关的循环,仅目标位不同。寄存器光子发射在相机噪声旁很微弱且对温度漂移敏感,单帧无可显示。对各循环多帧平均抑制随机噪声,减去两平均栈取消共享的一切:静态背景、传感器偏移、热发射及无关开关。采集中交错两值防慢漂移偏置减法。剩余即追踪所选位的发射。

DEBUGEN掩码0x3和0xc各200次全视场光子发射均值栈及其带符号差分

不同位掩码间的重复比较暴露了与 DEBUGEN 位 0–3 相关的紧凑位点,跨相机视场三区域。

芯片红外概览含三标记区域,及叠加彩色DEBUGEN位位点的区域缩放

这些区显示与每个 DEBUGEN 位相关的开关活动;不直接识别存储单元。每位的多个热点可能来自存储元件或相关逻辑。无布局数据无法区分。但这些区仍显著缩小搜索空间。

发现 1——故障 DEBUGEN 实现 Secure debug

激光故障注入(LFI)使用 980 nm 脉冲激光,最大光功率 2.97 W,约 40%(约 1.2 W)操作,100 ns 脉宽通过 50 倍物镜。每脉冲后通过 SWD 探测调试访问端口。

在 PEM 所得区域内运行 LFI 扫描,用 SWD 反馈校准相隔几微米的两个响应位置。一位置脉冲通过核 1 Mem-AP 启用总线访问,表明 PROC1 被设。另一位置 Mem-AP 控制状态字报告 SDeviceEn = 1,状态引导信号表明 PROC1_SECURE 可能被设。每脉冲后检查两指示。

左侧PEM位位点与右侧LFI故障点红外视图并排

设一位的脉冲可清除另一位,故设两位需迭代序列。脚本脉冲 PROC1 位置直至总线访问可用,然后脉冲 PROC1_SECURE 位置直至 SDeviceEn = 1,总线访问丢失时返回首位置。位置与脉冲参数校准后,序列数秒内启用 Secure debug。有趣的是,用 20 倍物镜无法复现。因两位置仅隔几微米,更宽光斑可能同时命中设定位区和清除位区,故无法获得正确值。

两位置均设后,无需进一步脉冲或软件写即保持设。通过核 1 Mem-AP 读 Secure-only 的 DEBUGEN 寄存器返回 0xc;因 DEBUGEN 仅 Secure 可访问,该成功读确认事务具 Secure 属性。

启用通过核 1 Mem-AP 的 Secure 访问允许调试器读写其 ACCESSCTRL 权限接纳调试器为总线管理器且目标控制接纳 Secure AHB 事务的内存映射资源。独立于直接读,调试器可暂停单步核并检查修改寄存器,通过 Secure 核中介提取危害 TrustZone 运行时隔离。这不会使 boot ROM 接受未认证固件:固件正常启动时安全启动仍认证,但无法保护验证后调试器仍可访问的运行时状态。

应用于黑客挑战配置

上述 Secure 属性 Mem-AP 访问暴露 Secure 运行时状态,但挑战页 48 运行时锁在固件运行后仍阻止访问密钥。页持久锁 PAGE48LOCK1 = 0x3c3c3c 拒绝 Non-secure 读但留 LOCKS 为 READ_WRITE,故在运行时锁收紧前通过 Secure 属性访问仍可读。

每次启动,固件写最严格二进制值 0b1111 到运行时锁 otphw->swlock[48]。该寄存器使页对 Secure 和 Non-secure 访问(含 Secure debug)均不可访问,从而阻止 Mem-AP 的 Secure 事务读密钥。

据记载,软件锁“在复位时从 OTP 锁页初始化”,写仅推进状态“直至下次复位”。复位 OTP 块丢弃 0b1111 并恢复从 PAGE48LOCK1 导出的值,其中 LOCKS = READ_WRITE。

剩余问题是如何复位锁定芯片而不让固件重新施加运行时锁。RP-AP 仍“始终可访问,即便外部调试禁用”。设 CTRL.RESCUE_RESTART 触发救援复位:全系统复位,并标志 boot ROM 在任何用户软件运行前暂停。

boot ROM 在看门狗、闪存或 USB 启动前检查 POWMANCHIPRESET.RESCUEFLAG,清除它,然后将核 0 保持在禁中断等待循环、核 1 保持在等待向量路径。数据手册对 CTRL.RESCUERESTART 无限制记载。

我们按以下序列进行:

  1. 救援复位。通过 RP-AP 设 CTRL.RESCUERESTART 为 1 然后清为 0。芯片复位并保持在 boot ROM 等待路径。签名固件从不运行,故 swlock[48] 从未收紧,保持在从 PAGE48LOCK1 导出的宽松值——LOCKS = READ_WRITE。
  2. 故障 DEBUGEN 到 0xc。两核在 boot ROM 等待路径时,如上设 PROC1 和 PROC1_SECURE;两设定位产生值 0xc。
  3. 通过此时 Secure 的 Mem-AP,经其调试暂停控制状态寄存器(DHCSR)暂停核 1。
  4. 通过守护读接口从 OTP 行 0xc08–0xc0f 读密钥。

我们在测试设备上运行该序列并恢复了完整挑战密钥。

DEBUGEN_LOCK 不阻止激光诱导变更

DEBUGEN_LOCK 阻止对相应 DEBUGEN 位的软件写:每锁位“写 1 锁 DEBUGEN 的位。设后不可清”。数据手册称此为“避免意外写”的方法。

在目标 DEBUGEN 位为 0 且锁位为 1 的试验中,脉冲仍可在锁保持 1 时设 DEBUGEN。脉冲也设锁位,无论有无相应 DEBUGEN 变更。成功序列中,两设定位时五功能锁位均为 1。从未见锁位从 1 回 0,故故障设相应锁后,后续写 DEBUGEN = 0 无法恢复禁用状态。

基于软件的缓解局限

一旦启用通过 Mem-AP 的 Secure 访问,Secure 属性本身不再分隔调试器与 Secure 固件。该访问不覆盖硬 OTP 锁或外设特定控制。ACCESSCTRL 可阻止调试器管理器对特定目标的直接事务,但不单独阻止控制 Secure 核的调试器引发核源访问或通过核寄存器提取加载值。救援复位后,ACCESSCTRL 在固件重配前回到全开复位默认。故 ACCESSCTRL 减少直接 Mem-AP 暴露而非独立机密边界。

固件仍可通过在 ACCESSCTRL 中拒绝调试器访问敏感目标,然后设 ACCESSCTRL.LOCK 的调试器位使调试器事务无法重开权限,来减少启动后暴露。Secure 固件也可周期检查 DEBUGEN,遇意外值触发安全失效复位清处理器冷复位域。这些措施为尽力运行时缓解:启用调试器可能在下次检查前暂停核,救援复位在固件配置 ACCESSCTRL 或运行监视器前停止。故不阻止此处演示的固件前密钥读。

RP2350 记载加密启动流在两个不同机器状态说明了运行时锁的固件前局限和调试器管理器过滤的启动后局限。救援复位后,boot ROM 在解密前暂停:尚无明文载荷,但若 OTP 页持久权限允许 Secure 访问且无其他目标控制阻挡事务,解密密钥可直接读。正常加密启动后,SRAM 中有明文:直接 Mem-AP 读依赖 ACCESSCTRL 中调试器管理器权限,而 Secure 核控制可能允许即便直接读拒绝时的核中介提取。此为架构分析非测试加密启动结果;加密启动仍保护外部闪存免离线检视。

影响与攻击需求

演示序列提供 Secure 属性内存访问、对 Secure 世界执行的控制及复位运行时页锁后挑战密钥访问。需以下资源:

  • 破坏性物理访问。背面开封装永久修改封装并暴露裸片。
  • 专业实验室设备。上述完整设置约耗资 25 万美元。
  • 硬件安全专长。程序需样品制备、裸片导航、激光参数选择及协调激光控制、台面定位与 SWD 测量。

结论

RP2350 在 OTP 中以冗余投票编码关键调试禁用标志,但 DEBUGEN 可覆盖其效果且数据手册无等同保护记载。实验中激光脉冲改变 DEBUGEN 并设锁位阻止固件恢复禁用值。另,RP-AP 救援复位将挑战运行时页锁恢复到持久值同时阻止用户固件执行。安全分析须覆盖完整强制路径,从持久 OTP 配置经可变控制寄存器到复位行为,因系统安全依赖该路径而非孤立个体机制。

披露与致谢

我们于 2026 年 7 月 28 日向树莓派披露该故障。感谢树莓派团队在披露讨论中的参与及透明安全研究态度。

评论

讨论气氛偏技术考证与赞叹,分歧主轴在攻击是否高昂昂贵——多数人凭经验认为爱好者可低价复现,少数人持物理门槛高之不实用论。

认为实际复现成本远低于论文所述

  • 指出原帖二十五万美元实验室设备仅为初期发现记录所需,爱好者用低于两万五千甚至一万美元即可复现,并类比以廉价电磁工具替代昂贵设备成功复现同类攻击(较多人) > 家庭实验室花不到两万五就能复现,就像我用五十美元PicoEMP代替五千美元ChipShouter搞定同类芯片攻击(@BitBangingBytes)

认为攻击仍需高昂代价且不实用

  • 强调攻击需物理访问、破坏性预处理及约二十五万美元设备,虽巧妙但缺乏实战可行性(少数人) > 攻击要物理接触、破坏芯片加二十五万设备,不算实用但挺巧妙(@stackghost)

赞赏攻击规模并联想早期硬件黑客

  • 有人联想到早年开盖DRAM芯片用于成像的发现,惊叹此次攻击实现规模极其惊人(较多人) > 这让人想起刚发现开盖DRAM能用于成像,而今攻击规模令人极其印象深刻(@jacquesm)

视安全破解与防护为永恒军备竞赛

  • 指出RP2350安全区域曾因可作Yubikey替代而诱人,但开锁与造锁者竞赛永续,所学将令下一代更坚固(较多人) > RP2350安全区曾适合作Yubikey替代品,但破解与防护是军备竞赛,教训会让下一代更难破(@byb)

有价值的补充

  • 有人分享经典安全漫画,类比只要物理接触加暴力逼问便能绕过任何加密,暗合本攻击需实地接触的特性(@Fred27)