嵌入式系统基础:嵌入式硬件架构(MCU/MPU)、外设接口、固件存储与启动流程
模糊测试(Fuzzing)在嵌入式安全领域的应用,首先要求测试人员对目标硬件平台有清晰、系统的认知。与通用软件模糊测试不同,嵌入式模糊测试的输入向量、执行环境、故障注入点和结果观测方式,都直接受限于硬件架构、外设接口、固件存储介质以及启动流程。本章将围绕这四个核心维度展开,帮助学员建立从芯片选型到固件运行的整体视图,为后续的模糊测试靶点选择、硬件调试接口利用和固件提取分析打下坚实基础。
2.1 核心硬件架构:MCU 与 MPU 的差异及选型影响
嵌入式系统的“大脑”通常分为微控制器(MCU)和微处理器(MPU)两大类。MCU 将 CPU、SRAM、Flash 以及丰富的外设集成在单一芯片上,典型代表为 ARM Cortex-M 系列(如 STM32、EFM32、nRF52)。MCU 通常运行裸机程序或 RTOS(如 FreeRTOS、Zephyr),资源受限(RAM 从几 KB 到几百 KB,Flash 从几十 KB 到几 MB),但实时性强、功耗低、启动时间短。MPU 则更接近通用处理器,如 ARM Cortex-A 系列(如 i.MX6、AM335x),需要外部搭配 DDR 内存和存储介质,运行 Linux 或 Android 等完整操作系统,资源丰富但启动流程复杂、功耗高。
从模糊测试视角看,MCU 与 MPU 的差异直接影响测试策略:MCU 固件通常直接暴露硬件寄存器操作,内存保护单元(MPU)配置简单甚至缺失,缓冲区溢出往往直接导致 HardFault 或任意代码执行;MPU 平台则具备 MMU、ASLR、NX 等防护机制,模糊测试需要更关注用户态与内核态的边界、驱动漏洞以及系统调用接口。此外,MCU 的调试接口(SWD/JTAG)通常默认开放,便于固件提取和动态调试;而 MPU 平台往往通过 U-Boot 引导,存在独立的 Bootloader 安全验证环节。
2.2 外设接口:攻击面与模糊测试入口
外设接口是嵌入式系统与外界交互的通道,也是模糊测试的主要攻击面。常见接口包括 UART(异步串行)、SPI(同步串行)、I2C(两线式串行)、USB、Ethernet、CAN 以及无线接口(Wi-Fi、BLE、Zigbee)。每个接口都有其独特的协议特征和潜在漏洞点。
| 接口类型 | 典型速率 | 协议特征 | 模糊测试关注点 |
|---|---|---|---|
| UART | 9600bps ~ 4Mbps | 异步、无时钟、帧格式可配 | AT 命令解析、控制台溢出、长度字段绕过 |
| SPI | 1MHz ~ 100MHz | 主从模式、全双工、片选控制 | Flash 读写命令、传感器寄存器配置、DMA 缓冲区溢出 |
| I2C | 100kHz ~ 3.4MHz | 两线、地址寻址、ACK/NACK | 从设备地址扫描、寄存器越界读写、总线挂死恢复 |
| USB | 12Mbps ~ 10Gbps | 枚举、端点、控制/批量/中断传输 | 描述符解析、HID 报告、固件升级流程 |
| Ethernet | 10/100/1000Mbps | TCP/IP 协议栈、ARP/DHCP | 网络协议栈漏洞、畸形包处理、服务端应用 |
在实际模糊测试中,UART 和 SPI 是最容易入手且回报率较高的接口。UART 控制台往往直接暴露调试信息或 shell 命令,SPI 则常用于连接外部 Flash 或传感器,通过构造异常的 SPI 命令序列,可以触发固件中的解析逻辑错误。USB 接口的模糊测试需要更复杂的硬件设备(如 FaceDancer 或自定义固件的开发板),但一旦发现漏洞,影响范围通常较大。
2.3 固件存储介质与固件提取方法
固件存储介质决定了固件提取的难度和方式。常见介质包括 NOR Flash、NAND Flash、eMMC、SD 卡以及 MCU 内部 Flash。NOR Flash 支持随机读取,通常直接映射到 CPU 地址空间,可通过 SPI 或并行接口直接读取;NAND Flash 以页为单位读写,存在坏块管理,提取时需要处理 ECC 和逻辑地址映射;eMMC 和 SD 卡内部包含控制器,通过 SDIO/MMC 接口访问,提取时需注意分区表和文件系统结构。
固件提取的常用方法包括:
- 调试接口读取:通过 SWD/JTAG 连接目标芯片,使用 OpenOCD 或 J-Link 读取内部 Flash 或外部存储。这是最直接的方式,但需要目标芯片未锁定调试端口。
- 芯片拆焊读取:将 Flash 芯片从 PCB 上拆下,使用编程器(如 RT809H、TL866II)直接读取。适用于无法通过软件方式访问的场景,但可能损坏芯片或丢失部分数据。
- Bootloader 利用:如果 U-Boot 或其他 Bootloader 存在未受保护的命令,可通过串口进入命令行,使用
md、mw、nand read等命令导出固件。 - 在线升级包分析:从厂商官网或设备管理后台获取固件升级文件,通过 binwalk 等工具进行解包和分析。这种方法无需物理接触设备,但可能遇到加密或签名校验。
2.4 启动流程:从复位到固件执行的完整链路
理解启动流程是定位模糊测试目标的关键。典型的 MCU 启动流程为:上电复位后,CPU 从固定地址(如 0x00000000)读取初始堆栈指针(SP)和复位向量(PC),然后跳转到启动代码(Startup File),完成时钟初始化、内存初始化、外设初始化,最后调用 main() 函数。对于 MPU 平台,启动流程更为复杂:Boot ROM 首先执行,加载 SPL(Secondary Program Loader)或 U-Boot,U-Boot 再加载内核和设备树,最终挂载根文件系统。
从模糊测试角度看,启动流程中的每个阶段都可能成为攻击点:Boot ROM 中的漏洞难以利用但影响巨大;U-Boot 的环境变量解析、网络启动(TFTP/NFS)功能是常见攻击面;内核启动参数(bootargs)中的畸形输入可能导致内核崩溃或提权。此外,安全启动(Secure Boot)机制会在启动流程中增加签名验证环节,模糊测试时需要绕过或识别这些验证逻辑。
bootcmd 环境变量未设置写保护。此时可以修改 bootargs 添加 init=/bin/sh 参数,直接获取 root shell,从而绕过正常启动流程,为后续固件分析和模糊测试创造条件。
启动流程的完整链路可总结为:上电 → Boot ROM → Bootloader(SPL/U-Boot)→ 内核 → 根文件系统 → 应用程序。每个阶段都有独立的固件镜像和校验机制,模糊测试时需要分别对待。例如,针对 U-Boot 的模糊测试可以构造畸形的环境变量或网络启动参数;针对内核的模糊测试则关注设备树解析、驱动 probe 函数和系统调用接口。
2.5 常见误区与总结复盘
在嵌入式硬件基础的学习和实际测试中,初学者常陷入以下误区:
- 误区一:忽略硬件差异,直接套用通用模糊测试框架。嵌入式设备的资源限制、实时性要求和硬件依赖决定了必须定制化模糊测试方案。
- 误区二:只关注固件内容,忽视启动流程和 Bootloader。实际上,Bootloader 是攻击者最常利用的入口,且往往缺乏安全防护。
- 误区三:认为所有 Flash 都可以直接读取。现代设备普遍启用读保护(RDP)、加密存储或安全启动,直接读取往往得到的是密文或无效数据。
- 误区四:忽略外设接口的物理层特性。例如,SPI 的时序要求、I2C 的上拉电阻、UART 的电平转换,这些物理层问题可能导致通信不稳定,影响模糊测试的效率和准确性。
总结复盘时,建议建立硬件信息清单,包括芯片型号、内核架构、存储介质类型、调试接口状态、启动流程各阶段地址、外设接口列表及对应驱动代码位置。这份清单将作为后续模糊测试的“作战地图”,帮助测试人员快速定位潜在攻击面,合理分配测试资源。