当调试器说谎:nRF54L 的密钥管理单元与陈旧的内存缓存
来源:danielmangum.com — 4 分 · by hasheddan
📋 概述
刚加入北欧半导体的 Daniel Mangum 在研究 nRF54L 系列安全架构时,习惯性地不用固件而是直接拿调试器戳寄存器。他在操作密钥管理单元 KMU 时读到了意料之外的数值:KMU 把密钥种子等敏感数据存在安全信息配置区 SICR 的槽位里,槽位 ID 从 0 到 249,每个可存 32 位元数据、32 位目的地址、128 位值以及 2 位吊销策略;发出 PUSH 任务时槽位里的值会被写到开通时指定的目的地址。问题出在 J-Link 的内存缓存:因为 CPU 已停机,而 KMU 这类外设能通过 DMA 在核停时改写内存,调试器会返回上次访问过的陈旧值。绕过方式是关掉缓存(monitor exec SetEnableMemCache = 0),或者用 stepi 推进几条指令让缓存失效——而作者提醒,日常并不该关缓存。
🔑 核心要点
- KMU 是 nRF54L 的安全组件:密钥种子存在 SICR 的槽位里,只能在安全模式访问。
- 槽位结构清楚:ID 0–249,各存 32 位元数据、32 位目的地址、128 位值、2 位吊销策略。
- PUSH 任务的行为是把槽位里的值写到开通时指定的目的地址。
- 异常的成因不是芯片而是调试器:J-Link 内存缓存返回了陈旧值。
- 触发条件是组合性的:CPU 已停机 + 外设通过 DMA 改写内存,缓存不会失效。
- 两个排查手法:monitor exec SetEnableMemCache = 0 关缓存读,或 stepi 推进指令让缓存清掉。
💡 金句
JLinkArm.dll 的内存缓存在这种情况下返回陈旧值,原因是 CPU 已经停机,而我们试图读取一个不推进 CPU 就无法刷新的、此前已经访问过的内存地址。
👍 0
👎 0
← 返回 Hacker News 首页