尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

利用RP2350构建低成本故障注入平台:从硬件安全到攻击实践

利用RP2350构建低成本故障注入平台:从硬件安全到攻击实践 1. 从“安全卫士”到“攻击平台”RP2350的角色反转在嵌入式安全领域我们通常将微控制器MCU视为需要被保护的“堡垒”通过各种加密、认证和完整性校验机制来加固它。但今天要聊的RP2350却为我们提供了一个截然不同的视角如何将一块旨在构建安全应用的MCU转变为一个精准、可控的故障注入Fault Injection或毛刺攻击Glitching平台。这听起来有些矛盾一个“安全”的芯片如何成为“攻击”的利器这正是其魅力所在。RP2350是树莓派Raspberry Pi基金会推出的RP2350系列微控制器中的一员它并非为了攻击而生但其高度灵活的可编程I/OPIO子系统、精确的时钟控制能力以及开放的硬件设计使其成为了安全研究人员手中一件绝佳的工具。通过精心设计的程序我们可以让RP2350在极精确的时间窗口内向目标芯片的电源、时钟或I/O引脚注入一个微小的、非正常的电压或时序扰动即“毛刺”从而诱使其产生非预期的行为比如跳过一条关键的安全检查指令或者泄露出一段本应加密的数据。这种技术被称为“故障注入攻击”或“毛刺攻击”是硬件安全评估和芯片漏洞挖掘中的核心手段。它不是为了物理破坏芯片而是像一位高明的“锁匠”用极其精巧的手法“撬动”芯片内部逻辑的瞬时状态。对于从事嵌入式安全、物联网设备渗透测试、智能卡分析甚至汽车电子安全研究的工程师和安全研究员来说掌握构建这样一个平台的能力意味着能够从最底层理解系统的脆弱性。RP2350以其极低的成本通常仅为核心板价格、强大的社区支持和丰富的软件生态极大地降低了进入硬件安全研究领域的门槛。你不再需要动辄数万乃至数十万美元的商用故障注入设备一块RP2350开发板、一些基础电子元件和深入的理解就能搭建起你自己的“安全实验室”。2. 故障注入攻击的核心原理为什么“扰动”能成为“武器”在深入RP2350的具体实现之前我们必须先理解故障注入攻击为何有效。现代MCU和密码协处理器在执行指令时依赖于稳定的电源电压和精确的时钟信号。每一个逻辑门与门、或门、非门等的翻转都需要在特定的电压阈值和时间内完成。故障注入就是故意、短暂地破坏这种稳定性。最常见的攻击向量有三种电压毛刺、时钟毛刺和电磁脉冲。电压毛刺通过在电源线上叠加一个短暂的低压或高压脉冲导致芯片内部晶体管在错误的时间导通或关闭可能使一个比特位发生翻转例如从逻辑1变成逻辑0或者让一条条件跳转指令如if (password_correct)的执行结果被篡改。时钟毛刺则是向时钟信号中插入一个极短的额外脉冲或者暂时扭曲时钟的边沿导致芯片的时序逻辑混乱可能让本应在下一个时钟周期执行的指令被提前或推后执行甚至被重复执行。这些扰动之所以能成为攻击手段根源在于数字系统设计的“同步性”和“确定性”假设。芯片设计时会基于一个理想的、无噪声的环境来设定时序余量。故障注入正是攻击这个余量。当毛刺的幅度、宽度和时机拿捏得恰到好处时它足以在芯片内部制造出一个短暂的、违背设计假设的“异常状态”却又不会导致芯片彻底复位或损坏。这个“黄金窗口”可能只有几纳秒到几十纳秒。攻击者的目标就是找到这个窗口并精确地命中它。例如在芯片执行strcmp字符串比较函数来验证密码时一个精准的电压毛刺可能导致比较结果寄存器被错误地置为“相等”从而绕过认证。这就是RP2350作为攻击平台的价值所在我们需要一个能够以纳秒级精度生成和触发这些毛刺信号的“武器”。3. RP2350的独特优势为何是它而不是别的MCU市面上MCU种类繁多为何RP2350特别适合扮演这个角色这源于其硬件架构上的几个关键设计尤其是其可编程I/OPIO状态机。3.1 纳秒级精度的可编程I/OPIO这是RP2350的“杀手锏”。传统的MCU GPIO操作需要经过CPU内核、总线、外设控制器等多个层级延迟高且不确定通常为微秒级。而RP2350的PIO是一个独立于CPU的微型可编程处理器专门用于处理I/O。它有自己的指令集、寄存器和FIFO可以直接控制引脚并且执行速度与系统时钟同步延迟确定且极低一个PIO指令周期通常就是一个系统时钟周期例如125MHz下就是8纳秒。这意味着我们可以编写PIO程序来生成波形极其复杂、时序极其精确的毛刺信号。例如我们可以编写一个循环在接收到某个触发信号如目标芯片的某个I/O引脚变化后的第N个时钟周期精确地拉低或拉高攻击引脚持续M个时钟周期。这种精度是普通GPIO库函数无法企及的。3.2 灵活且强大的时钟系统RP2350的时钟系统非常灵活支持从内部振荡器到外部晶振的多种时钟源并且可以通过PLL生成高频系统时钟。更重要的是系统时钟可以非常稳定地驱动PIO。稳定的高精度时钟是进行可重复故障注入实验的基础。如果时钟本身抖动很大每次注入的毛刺时机就会飘忽不定实验将无法复现也就无法科学地分析和定位漏洞。3.3 双核Arm Cortex-M33架构与丰富外设双核M33处理器提供了充沛的计算能力。一个核心可以专用于运行复杂的控制逻辑、与上位机通信如通过USB-CDC、管理攻击参数如毛刺延迟、宽度、幅度另一个核心甚至可以模拟一个简单的目标设备或者运行监控程序。此外RP2350内置的ADC、DAC某些型号、PWM和丰富的定时器为生成模拟毛刺通过DAC控制外部放大器或进行更复杂的同步控制提供了可能。例如可以利用PWM模块来粗略控制一个模拟开关的导通时间再用PIO进行最后的精细时间调整。3.4 极低的成本与活跃的社区一块RP2350核心板的价格远低于任何一款商用故障注入设备。树莓派庞大的社区意味着有大量的开源项目、教程和讨论可供参考。例如针对RP2040RP2350的前代的pico-glitcher等项目已经提供了很好的起点其思路和代码可以迁移到RP2350上。这极大地加速了学习曲线和原型开发速度。注意将RP2350用于故障注入攻击需要深入理解数字电路、电源设计和目标设备。不当的操作极易导致目标设备永久性损坏。务必在报废或专用于测试的设备上进行实验。4. 构建RP2350毛刺攻击平台硬件设计与核心电路一个完整的RP2350故障注入平台通常由三部分组成控制单元RP2350、毛刺生成电路、以及目标设备。这里我们聚焦于最核心的电压毛刺注入的硬件设计。4.1 核心攻击电路MOSFET与耦合电容最经典、最直接的电压毛刺生成电路是使用一个N沟道MOSFET如2N7002作为高速开关。其基本原理如下储能通过一个电阻将一个电容C_glitch典型值10nF-100nF充电至电源电压V_glitch例如低于目标芯片正常电压的3.0V。泄放当RP2350的PIO引脚发出一个极短的高电平脉冲毛刺触发信号时MOSFET迅速导通。注入充电电容通过MOSFET的极低导通电阻Rds_on和一个小电阻R_series如1-10欧姆用于限流和防止振荡瞬间对目标芯片的电源引脚放电。恢复脉冲结束MOSFET关闭目标芯片电源通过其自身的去耦电容和电源网络恢复至正常电压。这个电路能在目标电源线上产生一个快速的负向电压尖峰凹陷。毛刺的幅度由V_glitch决定V_normal - V_glitch宽度由RP2350输出脉冲的宽度和MOSFET的开关速度、以及电容和回路电阻形成的RC时间常数共同决定。电路连接示意图文字描述RP2350的PIO引脚如GPIO0连接至MOSFET的栅极G通过一个约100欧姆的栅极电阻防止振荡。MOSFET的源极S接地。MOSFET的漏极D连接限流电阻R_series的一端。R_series的另一端连接目标芯片的VCC引脚需通过探针或焊接。毛刺电容C_glitch的正极连接在MOSFET的漏极与R_series之间负极接地。一个充电电阻R_charge如1kΩ从V_glitch电源连接至C_glitch正极。V_glitch由一个可调稳压模块如LM317或精密 DAC 驱动放大器产生由RP2350的另一个引脚或核心控制。4.2 同步与触发电路故障注入的成功关键在于同步。我们需要在目标芯片执行到特定代码点时例如刚刚进入密码验证函数触发毛刺。这就需要一种同步机制。I/O触发最简单的方式。将RP2350的一个输入引脚连接到目标芯片的某个GPIO。在目标程序的关键位置插入一条指令让该GPIO输出一个脉冲例如拉高再拉低。RP2350检测到这个脉冲的边沿上升沿或下降沿后经过一个预设的、可调的延迟由PIO程序实现再发出毛刺触发脉冲。这个延迟参数是攻击需要扫描的最关键参数之一。电源纹波触发当目标芯片执行不同指令时其瞬时功耗有微小差异。通过一个高速、高精度的电流探头或电源路径上的采样电阻配合RP2350的高速ADC可以捕捉到这种功耗变化模式并将其作为触发信号。这种方法无需修改目标固件属于非侵入式但实现难度更高。电磁辐射触发使用近场探头捕捉目标芯片运行时辐射的电磁波其频谱在特定操作如AES加密轮运算时会有特征。这需要更专业的射频知识。4.3 安全与保护设计隔离务必使用逻辑电平转换器或光耦将RP2350的控制信号与可能带有较高电压的目标板隔离防止意外损坏RP2350。限流串联的R_series电阻和选择合适容值的C_glitch至关重要它们决定了注入目标芯片的能量。能量过大会直接损坏芯片过小则无法产生效果。必须从小能量开始逐步谨慎增加。监测点在目标芯片的电源引脚和地之间尽可能靠近芯片的位置焊接一个高质量的贴片电容如100nF X7R作为本地去耦。同时使用一个低电感、带宽足够至少200MHz的示波器探头点测这个电容两端的电压以观察实际注入的毛刺波形。这是调试和分析的唯一可靠依据。5. 软件架构与PIO编程实现纳秒级精度的核心硬件搭建好后软件是赋予其灵魂的关键。RP2350平台的软件核心在于PIO程序的编写。5.1 软件整体架构一个典型的控制程序运行在RP2350的其中一个Arm核心上它可能包含以下模块通信接口通过USB-CDC或UART与上位机PC通信接收攻击参数延迟、宽度、幅度、重复次数等。参数管理将接收到的参数通常是微秒或纳秒级时间转换为PIO状态机需要的时钟周期数。例如系统时钟125MHz周期为8ns。那么一个150ns的延迟就对应150 / 8 18.75个周期PIO只能处理整数周期所以需要取整19个周期即152ns并理解这个误差。PIO状态机配置加载、启动和停止负责生成毛刺触发脉冲的PIO状态机。同步逻辑监控触发输入引脚管理攻击流程如“等待触发-延迟-发出毛刺-等待恢复-准备下一次”。监控与反馈可选地读取ADC来监测目标电源电压或通过另一个GPIO接收目标设备的响应如认证成功/失败的信号实现自动化攻击扫描。5.2 核心PIO程序剖析下面是一个极度简化的PIO程序示例它实现的功能是在输入引脚in_pin检测到上升沿后等待一段可编程的延迟delay_cycles然后输出一个可编程宽度pulse_cycles的高电平脉冲到输出引脚out_pin。.program glitch_trigger .side_set 1 opt ; 声明side-set用于控制输出引脚 ; 输入参数通过FIFO传递: delay_cycles, pulse_cycles ; 使用X寄存器存储delay计数Y寄存器存储pulse计数 .wrap_target pull block ; 从FIFO拉取数据到OSR (先delay后pulse) mov x, osr ; X delay_cycles pull block mov y, osr ; Y pulse_cycles wait_for_trigger: wait 1 pin 0 ; 等待输入引脚变为高电平上升沿 set pins, 0 side 0 ; 确保输出起始为低 [side-set] delay_loop: jmp x-- delay_loop ; 延迟X个周期 generate_glitch: set pins, 1 side 1 ; 输出高电平产生毛刺触发信号 [side-set] pulse_loop: jmp y-- pulse_loop ; 保持高电平Y个周期 set pins, 0 side 0 ; 输出恢复低电平 [side-set] .wrap ; 跳回.wrap_target等待下一次参数和触发关键点解析side-set这是PIO的一个强大特性允许在同一条指令执行的同时设置side-set引脚的电平不占用额外时钟周期。这对于生成边沿极其精确的脉冲至关重要。上面代码中side 0和side 1就是即时控制输出引脚。wait 1 pin 0这条指令会阻塞直到指定的输入引脚这里映射为pin 0变为高电平。它提供了硬件级的同步延迟确定。延迟循环jmp x-- delay_loop构成了一个精确的软件延迟循环。每个循环消耗1个时钟周期假设指令在0延迟的SM中执行。因此总延迟 delay_cycles * 1个时钟周期。这是实现纳秒级可调延迟的核心。参数传递通过ARM核心向PIO的FIFO写入数据PIO程序用pull指令取出。这允许我们在攻击过程中动态调整延迟和宽度进行参数扫描。5.3 主程序C SDK中的关键调用#include pico/stdlib.h #include hardware/pio.h #include glitch_trigger.pio.h // 由pioasm工具生成的头文件 int main() { stdio_init_all(); // 1. 选择PIO实例和状态机 PIO pio pio0; uint sm pio_claim_unused_sm(pio, true); // 2. 加载PIO程序到PIO内存 uint offset pio_add_program(pio, glitch_trigger_program); // 3. 配置状态机映射引脚设置时钟分频等 glitch_trigger_program_init(pio, sm, offset, TRIGGER_IN_PIN, GLITCH_OUT_PIN); // 4. 设置初始参数 uint32_t delay_cycles 150; // 例如对应150 * 8ns 1200ns uint32_t pulse_cycles 5; // 对应5 * 8ns 40ns pio_sm_put_blocking(pio, sm, delay_cycles); pio_sm_put_blocking(pio, sm, pulse_cycles); // 5. 启动状态机 pio_sm_set_enabled(pio, sm, true); // 6. 主循环可以通过USB接收新参数并更新FIFO while (true) { // ... 与上位机通信更新 delay_cycles, pulse_cycles ... // pio_sm_put_blocking(pio, sm, new_delay); // pio_sm_put_blocking(pio, sm, new_pulse); } }6. 实战针对一个虚拟目标进行参数扫描与漏洞挖掘假设我们有一个简单的“目标设备”它是一块基于ATmega328P的开发板运行着一段固件循环等待串口输入密码输入正确则点亮LED错误则熄灭LED。我们的目标是利用RP2350平台通过电压毛刺绕过密码检查。6.1 实验设置目标设备ATmega328P开发板运行密码验证程序。我们将其VCC引脚通过一个0欧姆电阻方便断开连接到主电源并将RP2350的毛刺注入点连接在这个电阻靠近MCU的一侧。同步修改目标固件在密码验证函数check_password()的入口处让一个空闲的GPIO如PB0输出一个从低到高的脉冲。将此引脚连接到RP2350的触发输入引脚。监测使用示波器一个通道监测目标VCC在MCU的去耦电容上另一个通道监测RP2350的毛刺触发输出信号第三个通道监测目标LED控制引脚。6.2 攻击流程与参数扫描攻击的本质是一个多维参数空间的搜索问题。关键参数包括毛刺延迟从触发信号边沿到毛刺开始的时间。这决定了毛刺命中目标代码的哪一条指令。毛刺宽度毛刺脉冲的持续时间。太短可能没效果太长可能导致芯片复位或损坏。毛刺幅度电压凹陷的深度。由V_glitch电源电压控制。扫描策略初始安全参数设置一个很窄的宽度如20ns和很小的幅度V_glitch仅比正常电压低0.1V。延迟设为一个估计的中间值。自动化脚本在上位机PC编写Python脚本通过串口与RP2350通信。脚本控制RP2350循环执行发送一组参数 - 等待RP2350就绪 - 向目标发送错误密码 - 等待结果 - 记录。粗扫延迟固定宽度和幅度让延迟在一个大范围内例如从触发后0ns到2000ns以20ns为步进扫描。每次尝试后检查目标LED是否异常点亮即认证被绕过。精扫与宽度/幅度调整如果在某个延迟区间发现了异常如LED闪烁了一下则在该区间内减小步进如2ns进行精细扫描。同时可以微调毛刺宽度和幅度寻找最稳定的“成功”点。结果分析成功的毛刺参数通常不是一个点而是一个小的“窗口”。记录下所有能导致绕过的参数组合。6.3 可能遇到的挑战与调试技巧无任何效果首先用示波器确认毛刺是否成功注入到了目标VCC上。波形是否清晰幅度和宽度是否符合预期触发同步是否稳定检查所有硬件连接。目标直接复位毛刺能量太大。减小毛刺电容C_glitch的值或增大限流电阻R_series或降低V_glitch的电压。效果不稳定成功是随机的。这很常见因为毛刺处于芯片工作的临界边缘。尝试增加目标MCU的电源去耦电容这会使毛刺更难注入但一旦成功则更稳定因为需要更精确的参数。确保实验环境电源干净无其他大噪声源。多次尝试同一组参数计算成功率。高成功率的参数窗口才是有效的攻击点。无法同步检查目标固件中触发脉冲的输出时机是否准确。可以用示波器同时看触发信号和目标程序的其他已知信号如串口发送信号来验证。7. 从平台到洞察故障注入的防御启示构建并使用RP2350毛刺平台最终目的不是为了攻击而是为了理解和防御。通过亲手实践你会深刻体会到硬件安全的脆弱性所在以及防御措施的设计逻辑。7.1 常见的硬件安全加固措施电压监测与复位电路使用专用的电压监控芯片如MAX809在电压低于阈值时立即产生复位信号。这要求毛刺的宽度必须短到在监测芯片反应过来之前就结束并恢复大大增加了攻击难度。时钟毛刺检测器在芯片内部集成电路监测时钟频率和占空比的异常一旦发现毛刺即触发安全机制。冗余与校验关键的安全操作如密码比较、签名验证执行两次或多次比较结果。简单的故障注入很难在完全相同的时间点以相同的方式影响所有冗余单元。随机化执行时序通过插入随机空操作NOP指令或使用随机延迟使关键操作的执行时间点不固定让攻击者难以精确同步。保护层与金属屏蔽在芯片封装内部增加金属网格或屏蔽层增加电磁注入攻击的难度。7.2 对固件开发者的启示避免单点故障重要的安全判断不要依赖于一条指令或一个寄存器的值。例如不要用if (memcmp(password, input, len) 0)就决定认证成功可以结合多个校验。尽快完成敏感操作密码验证等操作应尽快完成减少暴露在潜在攻击窗口下的时间。使用硬件安全模块将最核心的密码学操作和密钥存储交给独立的、经过安全认证的硬件安全模块HSM或SE它们通常具备更强的物理攻击防护能力。搭建RP2350毛刺平台的过程是一个从软件到硬件、从数字逻辑到模拟电路的深度穿越。它强迫你以攻击者的视角思考问题这种视角的转换是成为一名合格的嵌入式安全工程师或研究员的宝贵财富。每一次失败的注入尝试都在告诉你芯片的稳健性边界每一次成功的绕过都在揭示一个潜在的安全缺陷。这个平台的价值远不止于那几次成功的攻击演示更在于在整个探索过程中获得的对电子系统深层运行机理的那种直观而深刻的理解。
返回列表