Hotdry.
security

通过 SPI Flash 指令追踪提取 UART 密码的硬件安全分析

当传统调试接口被禁用时,如何利用 SPI Flash 在 XIP 模式下的地址读取特性,通过逻辑分析仪捕获流量差异来定位并提取 UART 密码的工程技术详解。

在硬件安全研究领域,调试接口的可用性往往决定了后续逆向工程的难度上限。然而现实中,大量廉价网络设备会主动禁用 JTAG、UART 等调试接口,或者仅在特定条件下才开放访问。当研究人员面对一块无法调试的 8051 核心管理型交换机时,是否还有其他途径获取其敏感凭证?Dominik Zürner 的研究提供了一种极具启发性的替代方案:通过监听 SPI Flash 在 XIP 模式下的指令读取行为,重建代码执行轨迹,进而定位密码验证逻辑并提取凭证。这种方法不依赖任何芯片调试接口,仅需物理接触 SPI Flash 存储芯片即可实施,为硬件安全研究开辟了一条值得深入探索的攻击路径。

XIP 模式与指令追踪的底层原理

理解这一攻击的技术基础,需要首先掌握 SPI Flash 的 XIP(Execute In Place,就地执行)模式。现代嵌入式系统为降低成本,往往将固件存储在外部 SPI Flash 芯片中,并通过 SPI 接口直接执行代码,而非先将代码复制到内部 RAM。CPU 核心通过 SPI 控制器向 Flash 发送读取指令,Flash 返回存储在该地址的指令字节,CPU 随后解码并执行。整个过程中,SPI 总线上的地址信号暴露了 CPU 正在取指的具体位置。如果攻击者能够持续监听这条总线,理论上可以重建一个粗粒度的程序执行轨迹,记录下 CPU 在每个时刻从 Flash 中读取了哪些地址的指令。

这一特性的安全意义往往被忽视。在典型的加密实现或密码验证场景中,代码的执行流程会根据输入数据产生条件分支。正常情况下,观察者只能看到最终的输入输出结果;但在 XIP 模式下,攻击者可以通过追踪取指地址的变化,推断出代码的执行路径是否因特定输入而改变。例如,当用户输入错误的密码时,程序可能跳转到错误处理分支;而输入正确时,则继续执行后续的认证通过流程。通过对比空闲状态与密码输入状态的地址追踪数据,攻击者可以定位到执行流程发生差异的时间窗口,进而锁定密码验证相关的代码区域。

攻击方法论:从流量捕获到密码定位

实际实施这一攻击需要经过几个关键阶段,每个阶段都有其独特的技术挑战和工程考量。第一步是硬件连接,攻击者需要访问目标设备的 SPI Flash 芯片引脚,包括 CLK、MISO、MOSI 和 CS(Chip Select)信号线。对于研究环境中的设备,可以考虑将 Flash 芯片从主板上吹下,焊接至专用夹具或转接板;对于原位操作,则需要使用微探针或精密镊子夹持引脚,同时确保不影响设备的正常运行。这一阶段的难点在于保持信号完整性 ——SPI 总线工作在较高频率时,探头的寄生电容和接触电阻可能导致信号质量下降,影响后续的波形分析。

流量捕获阶段的核心是选择合适的逻辑分析仪。根据目标设备的 SPI 时钟频率,需要采样率至少达到信号频率的四倍以上才不会出现混叠。对于常见的 60 MHz SPI Flash 接口,理论上需要 240 MHz 以上的采样率才能可靠捕获。Dominik Zürner 在研究中使用的是 SiPeed SLogic16U3 逻辑分析仪,这款设备在四通道模式下可提供 800 MHz 的采样率,足以应对大多数 SPI Flash 的时序分析需求,而其售价仅约 65 欧元,是 Saleae 等专业设备的高性价比替代品。捕获时需要同时记录 SPI 的时钟信号和数据信号,以便后续通过协议解码将原始波形转换为可读的地址序列。PulseView 是开源的逻辑分析软件,支持多种协议解码,但在大容量捕获场景下可能存在性能瓶颈,需要注意数据量与内存消耗的平衡。

数据分析阶段采用了差异对比的核心思路。首先捕获设备在空闲状态下的 SPI 流量,记录下正常启动和待机期间的地址访问模式;然后在设备等待密码输入时,再次执行完整捕获。两次捕获的数据需要按照时间轴对齐,并逐段比较地址访问序列的差异。密码验证相关的代码区域通常会表现出显著的访问模式变化 —— 例如,在用户输入字符后,验证函数会被调用,导致特定地址范围内的访问频率明显上升。通过筛选出仅在密码输入期间出现的地址区间,研究者可以逐步缩小目标代码的范围,最终定位到负责比较输入密码与存储凭证的函数入口点。

工程实践中的关键参数与技巧

成功实施这一攻击需要在多个维度上做出正确的工程决策。首先是捕获时机的选择。最理想的情况是在设备刚刚启动完成、进入密码验证等待状态时开始捕获,这样可以最大限度地减少无关代码的干扰,获得干净的基线轨迹。如果设备在启动过程中会执行大量初始化代码,可以考虑在捕获前多次重启设备以确保每次的启动流程一致,从而更容易识别出稳定出现的密码验证相关访问模式。

其次是捕获时长的规划。SPI Flash 的存储容量从几兆字节到数十兆字节不等,而密码验证代码通常位于固件的特定区域。如果捕获时长过短,可能无法覆盖完整的验证流程;如果捕获时长过长,则会产生海量数据,增加后续分析的难度。实践表明,对于典型的 8 位密码验证场景,捕获 5 到 10 秒的流量通常足以捕捉到完整的输入、处理和反馈周期。在某些设备上,密码验证可能会调用外部存储中的字符串比较函数,这种情况下需要适当延长捕获时间以覆盖所有的代码路径。

数据分析工具的选择也影响着攻击效率。简单的地址差异计算可以通过 Python 脚本实现,读取两次捕获的地址序列,计算交集和差集,输出仅在密码输入期间访问的地址区间。更进一步,可以将地址序列转换为可视化的热力图,横轴为时间,纵轴为地址范围,用颜色深浅表示访问频率。这种可视化方法能够直观地展示出代码执行的时空分布,帮助研究者快速识别出密码验证期间出现的异常访问模式。对于大容量固件,还可以结合静态分析工具提取出各个地址区间对应的函数符号信息,从而将纯数字地址映射为具有语义的可读函数名。

防御建议与安全设计考量

从防御角度审视,这一攻击揭示了 SPI Flash 接口在安全敏感场景下的潜在风险。由于 XIP 模式需要将固件代码以明文形式存储并通过总线传输,任何能够物理访问 Flash 芯片的攻击者都有机会获取代码内容并分析其执行逻辑。要缓解这一风险,首先可以考虑在 SPI 总线上引入加密机制,对传输中的指令和数据密文化处理。然而这会增加系统复杂度和性能开销,且加密密钥的存储本身又成为新的攻击面。

另一种思路是在芯片选型阶段就考虑到安全性需求。部分 SPI Flash 控制器支持命令黑名单功能,可以禁止特定的读取操作或限制从某些地址区间读取数据。但这类保护机制通常需要 CPU 在启动早期进行配置,如果攻击者在固件执行前就已经完成流量捕获,保护机制将形同虚设。更为根本的解决方案是将关键安全代码从外部 Flash 移至内部 Flash 或 OTP(一次性可编程)存储中,从物理上隔离攻击面。

在产品设计层面,密码验证逻辑的安全设计同样关键。即使攻击者能够追踪代码执行轨迹,也不应轻易推断出密码的具体内容。一个有效的方法是使用恒定时间比较算法,确保无论输入是否匹配,程序执行的时间复杂度保持一致,从而防止通过执行时间的差异来推断密码的每一位。此外,密码的存储应采用加盐哈希而非明文存储,即使攻击者能够读取固件中的字符串常量,也无法直接获取可用的凭证。

硬件安全研究的核心价值在于揭示那些被忽视的攻击面,并推动整个生态系统提升安全基线。通过 SPI Flash 指令追踪提取密码的技术路线,展示了在调试接口被禁用的情况下,攻击者仍有可能通过替代路径获取敏感信息。对于设备制造商而言,这意味着安全设计必须覆盖从芯片选择到固件架构的完整链条;对于安全研究人员而言,这类技术开辟了新的分析方法论,值得在更广泛的设备类型上进行探索和验证。

资料来源

本文核心内容参考了 Dominik Zürner 在 LinkedIn 上分享的技术案例,描述了使用 SLogic16U3 逻辑分析仪捕获 SPI Flash 流量并通过差异分析定位 UART 密码验证代码的完整过程。SPI Flash XIP 模式的技术细节可参见 Analog Devices 和 Atmel(现 Microchip)的应用笔记文档。

查看归档