公司动态

基于RP2350的硬件故障注入平台:低成本实现精准电压毛刺与时钟抖动攻击

📅 2026/8/19 5:16:23
基于RP2350的硬件故障注入平台:低成本实现精准电压毛刺与时钟抖动攻击
1. 项目概述当RP2350遇上故障注入最近在折腾一个挺有意思的课题把树莓派自家的RP2350微控制器变成一个可控的故障注入平台。说白了就是主动、精准地给芯片“制造麻烦”看看它在电压不稳、时钟抖动或者电磁干扰这些非理想条件下会出什么幺蛾子。这可不是为了搞破坏恰恰相反这是硬件安全研究、可靠性测试乃至一些逆向工程里的核心手段。你想想一个智能门锁的MCU或者一个汽车ECU里的芯片如果能在实验室里就模拟出极端情况下的故障行为提前发现漏洞那价值可就大了。RP2350作为树莓派Pico 2的核心双Cortex-M33RP2040同款可编程IOPIO的架构让它在这个领域天生就有优势。它不像一些专用故障注入设备那样昂贵和封闭而是提供了一个高度灵活、完全开源且成本极低的实验平台。你可以通过编程精确控制PIO去产生那些微秒甚至纳秒级的异常信号也就是“Glitch”直接作用于目标芯片的电源、时钟或复位引脚观察其行为。无论是想学习故障注入原理的硬件爱好者还是从事嵌入式安全评估的专业人员这个项目都能提供一个从理论到实践的完整路径。2. 核心思路与平台选型解析2.1 为什么是RP2350选择RP2350作为故障注入平台的核心绝非偶然而是基于其硬件特性与项目需求的深度匹配。传统的故障注入往往依赖昂贵的专用设备或复杂的FPGA开发门槛很高。RP2350的出现打破了这一局面。首先双核Cortex-M33与可编程IOPIO的协同是精髓所在。一个核心例如Core0可以专注于运行复杂的控制逻辑、与上位机通信以及处理故障注入的结果分析而另一个核心Core1则可以与PIO状态机紧密耦合负责生成超高时序精度的故障脉冲。PIO是RP2040/RP2350的灵魂它能以系统时钟频率运行提供近乎硬件的实时性这对于生成精准的glitch信号至关重要。这种“主控精准执行”的架构是构建低成本、高性能注入平台的基础。其次丰富的外设与灵活的时钟系统提供了多种注入向量。除了直接通过GPIO进行电压毛刺注入RP2350的PWM、PIO等可以用于模拟时钟抖动其ADC可以监测目标板的电压反馈实现闭环控制多个UART、SPI、I2C接口便于与各种目标设备通信触发特定代码执行路径为故障注入创造“机会窗口”。最后极低的成本与完整的开源生态是快速迭代的保障。一块Raspberry Pi Pico 2开发板的价格远低于任何专业故障注入工具。其软件开发基于完善的ARM GCC工具链和树莓派提供的SDK社区资源丰富。这意味着你可以将主要精力集中在故障注入算法和实验设计上而不是纠缠于底层驱动和工具链的搭建。2.2 故障注入的基本原理与分类在动手之前必须搞清楚我们要“注入”的到底是什么。故障注入主要分为几类我们的RP2350平台主要擅长前两种电压毛刺/电源故障注入这是最经典的方式。通过快速、短暂地扰动目标芯片的电源VCC或地GND使其内部逻辑状态在瞬间发生不可预测的改变。比如一个精心计时的负电压毛刺可能导致一个本该是‘1’的逻辑位被读成‘0’从而绕过密码检查。RP2350可以通过控制一个外部的MOSFET或模拟开关快速短路或串联一个电压到目标电源线上来实现。时钟故障注入通过干扰目标系统的时钟信号使其产生抖动或短暂停顿。这可能导致处理器漏掉指令、访问错误的存储器地址等。RP2350的PIO可以输出一个频率和相位都可精密控制的时钟信号用以替代或干扰目标系统的原有时钟。电磁故障注入通过靠近目标的强电磁脉冲来诱发故障。这通常需要额外的线圈和驱动电路RP2350可以用于控制脉冲的生成时序。光故障注入用强激光照射芯片裸Die的特定区域。这需要昂贵的设备不在我们低成本平台的范畴内。本项目的核心是利用RP2350的PIO和定时器实现对目标设备电源或时钟线的、时序高度可控的模拟干扰。关键在于“可控”glitch的幅度、宽度、相位以及与目标代码执行的相对时间都必须能够被精确编程和控制。3. 硬件平台搭建与核心电路设计3.1 系统架构与信号流一个完整的RP2350故障注入平台通常由三部分组成主控RP2350、故障注入执行单元、以及目标设备。信号流是这样的上位机如PC通过USB/UART向RP2350发送指令例如“在收到目标串口发送‘A’字符后延迟1.5微秒注入一个宽度为50纳秒的负毛刺”。RP2350的主控核解析指令并配置PIO和定时器。当触发条件满足时PIO状态机立即动作控制执行单元产生物理故障信号作用于目标设备。同时RP2350可以通过另一个IO口监测目标设备的响应如一个LED亮起、串口输出特定错误信息并将结果回传给上位机。[上位机] --USB/UART-- [RP2350主控核] --内部通信-- [RP2350 PIO核] --GPIO-- [故障注入执行电路] -- [目标设备VCC/CLK] | [目标设备响应监测] -- [RP2350 ADC/GPIO]3.2 关键执行电路设计电压毛刺注入模块这是硬件部分的核心。我们不能直接用RP2350的GPIO通常3.3V去连接目标板的电源这可能会损坏双方。我们需要一个“开关”作为缓冲和执行器。方案一N沟道MOSFET快速下拉电路这是最简单常用的方案。用一个高速、低导通电阻的MOSFET如AO3400其栅极G通过一个限流电阻如100Ω连接RP2350的PIO引脚。源极S接地漏极D连接到目标板的VCC线上需要通过一个电流不大的支路例如串联一个10-100Ω的电阻进行隔离保护。当PIO输出高电平时MOSFET导通将目标VCC线瞬间短暂拉低形成一个负毛刺。毛刺的深度取决于目标板的电源驱动能力和串联电阻宽度则由PIO输出高电平的持续时间精确控制。注意务必在MOSFET的栅极和源极之间并联一个10kΩ左右的电阻确保PIO引脚不输出时MOSFET处于确定关断状态防止意外导通。同时确保目标板有足够的本地去耦电容否则你的毛刺可能会被完全吸收而无效。方案二使用高速模拟开关对于需要更精细控制毛刺幅度的情况可以使用高速模拟开关芯片如74LVC1G3157。将RP2350的PIO连接开关的控制端开关的一端接一个可调的电压源例如由DAC或电阻分压产生用于设定毛刺电压另一端接目标VCC线。当PIO触发时开关瞬间将设定好的异常电压接入电源线。这种方法可以产生正毛刺或负毛刺且幅度可控但电路稍复杂且开关本身的导通电阻和速度是关键。3.3 时钟故障注入与触发同步设计对于时钟注入可以将RP2350的一个PIO配置为时钟输出直接连接到目标系统的时钟输入端可能需要替换原有的晶振或时钟信号。通过编程可以让这个时钟在运行中突然插入一个极短的高电平或低电平或者让时钟暂停几个周期。触发同步是成败的关键。故障注入必须在目标芯片执行到特定代码的精确时刻发生。常用同步方法有外部触发利用目标设备上一个可预测的硬件事件如一个LED闪烁、一个串口数据发送的起始位。RP2350的PIO可以捕捉这个事件作为触发源。软件触发与目标设备建立通信如UART当目标程序运行到关键函数时发送一个特定的字符序列作为“触发器”给RP2350。边沿触发监测目标设备某个IO引脚的变化。在RP2350的程序中需要将触发信号的捕获与PIO故障信号的生成之间的延迟delay做到极其精确这需要充分利用RP2350的硬件定时器和PIO的阻塞等待指令。4. 核心软件实现与PIO编程4.1 软件开发环境与项目结构我们使用树莓派官方的Pico SDK和CMake工具链进行开发。项目结构应清晰分离不同功能模块glitch_platform/ ├── CMakeLists.txt ├── glitch_platform.c (主程序初始化、主循环、上下位机通信) ├── pio_glitch.pio (PIO汇编程序负责生成精准脉冲) ├── trigger.{c,h} (触发信号检测逻辑) ├── glitch_engine.{c,h} (故障注入引擎管理参数和时序) └── uart_comm.{c,h} (与上位机通信的协议解析)主程序运行在Core0上负责系统初始化、与上位机通信、解析指令、配置故障参数。而将高实时性的脉冲生成任务交给Core1和PIO状态机。4.2 PIO状态机程序详解PIO程序是生成纳秒级精度的glitch脉冲的核心。下面是一个用于产生单个负脉冲低电平有效的PIO汇编示例它等待一个触发信号延迟特定周期后输出一个宽度可调的脉冲。; pio_glitch.pio .program glitch .side_set 1 opt ; 使用side-set每个指令可以同时设置一个引脚 ; 宏定义消耗N个周期进行延迟 .macro delay_cycles n set x, %n-1 [side 0] ; side-set保持为0无脉冲 jmp x-- delay_loop [side 0] .endm ; 输入OSR中高32位为延迟周期数低32位为脉冲宽度周期数 ; 触发引脚wait 1 pin 0 等待触发引脚变为高电平 ; 输出引脚side-set pin 0 .wrap_target pull block ; 从TX FIFO拉取参数延迟宽度到OSR mov x, osr ; 将参数暂存到X寄存器 wait 1 pin 0 ; 等待触发引脚变为高电平上升沿触发 ; --- 延迟阶段 --- out y, 32 ; 将OSR高32位延迟输出到Y寄存器 delay_loop: jmp y-- delay_loop [side 0] ; 循环延迟side-set保持0 ; --- 脉冲生成阶段 --- out y, 32 ; 将OSR低32位脉冲宽度输出到Y寄存器 pulse_loop: jmp y-- pulse_loop [side 1] ; 循环同时side-set输出1产生脉冲 set y, 0 [side 0] ; 脉冲结束side-set恢复0 .wrap对应的C代码需要配置PIO并加载这个程序// glitch_engine.c #include hardware/pio.h #include pio_glitch.pio.h void glitch_engine_init(uint trigger_pin, uint glitch_pin) { uint offset pio_add_program(pio0, glitch_program); uint sm pio_claim_unused_sm(pio0, true); pio_sm_config c glitch_program_get_default_config(offset); sm_config_set_wrap(c, offset glitch_wrap_target, offset glitch_wrap); // 映射side-set引脚输出毛刺脉冲 sm_config_set_sideset_pins(c, glitch_pin); // 映射等待的触发输入引脚 pio_sm_set_consecutive_pindirs(pio0, sm, trigger_pin, 1, false); pio_gpio_init(pio0, trigger_pin); sm_config_set_in_pins(c, trigger_pin); sm_config_set_jmp_pin(c, trigger_pin); // 设置时钟分频PIO每个指令周期 1 / (125MHz / div) sm_config_set_clkdiv(c, 1.0); // 全速运行一个周期8ns pio_sm_init(pio0, sm, offset, c); pio_sm_set_enabled(pio0, sm, true); } void start_glitch(uint32_t delay_cycles, uint32_t width_cycles) { uint32_t combined (delay_cycles 32) | (width_cycles; pio_sm_put_blocking(pio0, glitch_sm, combined); }这个例子中delay_cycles和width_cycles的单位是PIO指令周期系统时钟分频后。假设系统时钟125MHzPIO不分频那么一个周期就是8纳秒。要生成一个在触发后延迟1微秒1000ns、宽度为50纳秒的脉冲参数计算如下delay_cycles 1000ns / 8ns 125(循环)width_cycles 50ns / 8ns 6.25- 取整为6约48ns或756ns。这里就体现了精度限制脉冲宽度必须是8ns的整数倍。4.3 主控逻辑与参数扫描故障注入往往不是一次成功的需要对延迟delay和脉宽width进行系统性的扫描以找到导致目标出错的“黄金组合”。Core0上的主程序需要实现一个自动扫描循环。// 伪代码示例 for (int width MIN_WIDTH; width MAX_WIDTH; width WIDTH_STEP) { for (int delay MIN_DELAY; delay MAX_DELAY; delay DELAY_STEP) { // 1. 配置本次注入参数 configure_glitch_params(delay, width); // 2. 复位或重启目标设备到已知状态 reset_target(); // 3. 启动目标设备执行关键操作如发送认证命令 start_target_operation(); // 4. 等待触发信号并执行注入 arm_glitch_and_wait(); // 5. 观察目标设备响应判断是否成功如读取串口返回 bool success observe_target_response(); // 6. 记录结果 log_result(delay, width, success); } }这个过程可以完全自动化并通过UART与PC上位机交互实时显示扫描进度和成功点。5. 实战演练针对一个简单MCU的故障注入5.1 目标设定与实验搭建为了验证平台我们选择一个简单的8位MCU作为目标比如一块常见的ATmega328P开发板Arduino Uno核心。我们的目标是通过电压毛刺注入使其在验证一个简单密码比如比较输入是否等于0xAB时即使输入错误密码也能通过。目标程序Arduino Sketch:void setup() { Serial.begin(9600); pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, LOW); } void loop() { if (Serial.available() 0) { char received Serial.read(); if (received 0xAB) { // 正确密码 digitalWrite(LED_BUILTIN, HIGH); Serial.println(Access Granted!); delay(1000); digitalWrite(LED_BUILTIN, LOW); } else { Serial.println(Access Denied!); } } }硬件连接:故障注入线在ATmega328P的VCC引脚与电源之间串联一个10Ω的电阻作为注入点。将MOSFETAO3400的漏极D连接在这个电阻与MCU VCC引脚之间。源极S接地栅极G通过100Ω电阻连接RP2350的GPIO比如GPIO2。触发线将RP2350的另一个GPIO如GPIO3配置为输入连接到ATmega328P的某个IO如PD7。我们修改目标程序在密码比较指令if (received 0xAB)之前将PD7置高比较之后置低。这样就在密码检查时刻创建了一个硬件触发窗口。监测线将RP2350的第三个GPIO如GPIO4配置为输入连接ATmega328P的LED引脚PB5用于监测是否成功触发“Access Granted”。通信线RP2350的UART0与ATmega328P的UARTRX/TX交叉连接用于发送错误密码如0xCD和接收串口打印信息。5.2 注入过程与结果分析参数估算ATmega328P运行在16MHz下一条cpse比较跳过指令可能只需要1-2个时钟周期即62.5-125纳秒。我们的glitch窗口必须落在这个极短的时间内。因此延迟扫描范围可能设置在触发信号上升沿后的0到200纳秒之间步进8纳秒PIO周期。脉冲宽度从20纳秒开始尝试逐步增加。执行扫描运行RP2350上的自动扫描程序。上位机PC通过USB向RP2350发送开始扫描命令。RP2350控制目标MCU复位然后通过串口向其发送错误密码0xCD。目标程序运行在密码比较前拉高触发线。捕获结果RP2350在触发边沿后以不同的延迟和脉宽组合反复注入毛刺。每次注入后它监测目标LED引脚。如果LED变亮或者通过串口收到“Access Granted”则立即停止扫描并上报成功的延迟和脉宽参数。典型成功现象在某个特定的延迟例如触发后96纳秒和脉宽例如48纳秒组合下目标MCU的密码比较指令发生错误即使输入是0xCD程序也跳转到了“Access Granted”分支。LED亮起串口打印出成功信息。实操心得第一次实验很可能失败。常见原因包括毛刺幅度不够目标板去耦电容太强、毛刺时序不对未对准指令执行窗口、触发信号同步不精确。务必使用示波器同时观察触发信号和注入的毛刺电压波形确认其时序关系完全符合程序设定。调整MOSFET栅极的驱动电阻或并联电容可以改变毛刺的上升/下降边沿有时更“钝”的边沿反而更容易成功因为它扰乱了更长的电源稳定期。6. 高级技巧、安全警告与扩展方向6.1 提升成功率的技巧闭环反馈与自适应注入不仅仅进行开环扫描。可以让RP2350在每次注入后快速读取目标的多处状态多个IO、ADC值基于这些反馈动态调整下一次注入的参数如延迟微调、幅度微调实现自适应搜索这在面对复杂目标时效率更高。多重毛刺与复杂模式单个毛刺可能不足以引发错误。可以编程PIO状态机产生一连串不同间隔的毛刺脉冲模拟更复杂的电源噪声。这需要更复杂的PIO程序设计。电磁耦合注入如果无法直接接触电源引脚可以尝试电磁注入。用RP2350驱动一个小型MOSFET快速开关一个连接在几匝线圈上的电流将线圈靠近目标芯片也能诱发故障。这需要仔细调整线圈形状、位置和驱动脉冲。与软件漏洞结合单纯的硬件故障注入可能只能导致崩溃或随机行为。将其与软件漏洞利用结合例如通过故障跳过某次权限检查再结合内存破坏漏洞就能实现稳定的代码执行。6.2 重要的安全警告与伦理考量警告故障注入是一种强大的技术同时也具有潜在的破坏性。设备损坏风险过高的电压、过大的电流或不当的连接极易永久损坏目标设备以及RP2350自身。务必在充分理解电路原理的前提下操作初期使用废弃板卡进行实验。在电源线上串联小电阻限流使用逻辑分析仪或示波器监测信号。数据丢失风险故障可能导致Flash存储器数据被意外修改或擦除。法律与伦理边界此技术仅应用于你拥有完全所有权的设备或是在明确授权、隔离的实验室环境中进行安全研究。绝对禁止对他人设备、公共设施或任何未经授权的系统进行故障注入测试。这是职业道德和法律的红线。6.3 平台扩展方向RP2350作为平台的潜力不止于此多通道同步注入利用RP2350的多个PIO状态机可以同时对目标芯片的电源和时钟进行协同干扰研究更复杂的故障模型。集成逻辑分析仪利用PIO的输入捕获功能可以实现一个简单的逻辑分析仪在注入故障的同时捕获目标设备多个引脚的反应进行联合分析。构建通用硬件安全教学平台结合其他外设这个平台可以扩展为涵盖简单侧信道分析如通过ADC采样功耗、时钟故障、电压故障的综合性硬件安全实验箱成本远低于商业设备。这个项目将RP2350从一颗普通的微控制器转变为一个探索硬件底层脆弱性与韧性的强大工具。它拆解了故障注入技术的神秘面纱让你能够以极低的成本亲手触摸硬件安全的核心。每一次成功的glitch背后都是对时序、电压、芯片物理特性的深刻理解。记住能力越大责任越大始终在合法合规的范围内探索技术的乐趣。