G4MEOVER18/stm32-usb-fuzzer
GitHub: G4MEOVER18/stm32-usb-fuzzer
基于 STM32F103C8T6 的硬件 USB 描述符 Fuzzer,通过注入畸形描述符发现 Windows USB 驱动栈漏洞。
Stars: 0 | Forks: 0
# STM32 USB Descriptor Fuzzer
一款基于 STM32F103C8T6 (Blue Pill) 的硬件 USB Fuzzer,通过发送错误的 USB 描述符来发现 Windows USB 驱动栈中的漏洞(`usbport.sys`、`usbhub.sys`、`usbccgp.sys`、`kbdhid.sys`、`usbstor.sys`、`hidparse.sys`)。
**30 种可在运行时选择的攻击模式** — 无需重新刷写固件。这些模式涵盖了 Device、Configuration、Interface、Endpoint、String、HID、Hub、BOS、LangID 和 Device Qualifier 描述符,此外还包括 EP0 协议攻击、Composite Device 混淆、USB MSC 利用以及自主触发 BSOD。
## 硬件
| 组件 | 详情 |
|-----------|---------|
| MCU | STM32F103C8T6 (Blue Pill, 128KB Flash, 20KB RAM) |
| USB | Full-Speed USB 2.0 (PA11/PA12) |
| UART 调试 | USART1, PA9=TX, PA10=RX, 115200 8N1 |
| 模式选择 | PB2 (冻结), PB3/PB4 (Bank), BKP_DR1 (计数器) |
| LED | PC13 (低电平有效,闪烁指示当前活动模式) |
| Watchdog | IWDG ~26s 超时 |
## 攻击模式
### 第 1 组 — Device Descriptor
| 模式 | 按键 | 攻击方式 | 目标 |
|------|-----|--------|--------|
| 1 | `1` | `bDeviceClass=0x09` Hub 模拟 + 包含 255 个端口的 Hub 描述符 | `usbhub.sys` 池 OOB 读取 |
| 2 | `2` | `bcdUSB=0x0300` 伪造 USB 3.0 + 错误的 BOS (85→45 字节, Cap `bLength=255`) | USB 3.0 栈越界读取 |
| 3 | `3` | `bNumConfigurations=0` | USB 枚举逻辑错误 |
| 4 | `4` | `bMaxPacketSize0=0xFF` + EP `wMaxPacketSize=255` | 违反数据包大小限制 |
### 第 2 组 — Config / Interface / Endpoint
| 模式 | 按键 | 攻击方式 | 目标 |
|------|-----|--------|--------|
| 5 | `5` | `wTotalLength=5` (读取不足) | Config Descriptor 读取不足 |
| 6 | `6` | `wTotalLength=0xFFFF` (65535) | 64KB 内核 Buffer 越界读取 |
| 7 | `7` | `bNumInterfaces=16` | `usbccgp.sys` Interface 数组溢出 |
| 8 | `8` | `bNumEndpoints=0` 谎报 (EP 依然开放) | Class Driver EP 混淆 |
| 9 | `9` | `bmAttributes=0x00` + `bInterval=0` + `iface.bLength=0` | 解析器无限循环 |
### 第 3 组 — String Descriptors
| 模式 | 按键 | 攻击方式 | 目标 |
|------|-----|--------|--------|
| 10 | `a` | Manufacturer String `bLength=0xFE`,发送 252 个 Unicode 字符 | CVE-2024-21429: `usbhub.sys` 内核 Buffer 溢出 |
### 第 4 组 — HID Descriptors
| 模式 | 按键 | 攻击方式 | 目标 |
|------|-----|--------|--------|
| 11 | `b` | `wDescriptorLength=0xFFFF` | 超大 HID Report Buffer 分配 |
| 12 | `c` | `wTotalLength=0xFFFF` + HID `bNumDescriptors=16` | 双重越界读取 |
| 13 | `d` | 多向量 HID Report:嵌套下溢 + PUSH 炸弹 + Long Item + `REPORT_SIZE=255×REPORT_COUNT=255` | `hidparse.sys` 损坏 |
### 第 5 组 — 特殊情况 / Timing
| 模式 | 按键 | 攻击方式 | 目标 |
|------|-----|--------|--------|
| 14 | `e` | 200ms 重连循环 + 错误的 HID 描述符 | UAF 竞态条件 |
| 15 | `f` | 每次重连时进行 LCG 完全随机描述符补丁 | 随机 Fuzzing |
| 16 | `g` | 自动序列器:按崩溃概率排序依次执行所有模式 1–15 | 自动化扫描 |
### 第 6 组 — 键盘 BSOD (仅限手动)
| 模式 | 按键 | 攻击方式 | 目标 |
|------|-----|--------|--------|
| 17 | `h` | **自主执行**:枚举为键盘 → 通过 HID 设置 `CrashOnCtrlScroll=1` 注册表键 → USB 重连 → `RCtrl+ScrollLock×2` | `MANUALLY_INITIATED_CRASH (0xE2)` |
### 第 7 组 — BIOS/POST 破坏
| 模式 | 按键 | 攻击方式 | 目标 |
|------|-----|--------|--------|
| 18 | `i` | 10ms 重连锤击 | BIOS USB 枚举超时 |
| 19 | `j` | `bNumConfigs=254` + `wTotalLength=0xFFFF` | BIOS Config 枚举循环 |
| 20 | `k` | LangID `bLength=0xFF` (4 个真实字节) | BIOS String 解析器 OOB |
| 21 | `l` | DevQual `bLength=0xFF` + `bcdUSB=0x0300` | 高速协商崩溃 |
| 22 | `m` | 启动破坏序列器:模式 19→20→21→1→2→6→10 + 快速重连突发 | 全面 BIOS 破坏 |
### 第 8 组 — EP0 / 协议攻击
| 模式 | 按键 | 攻击方式 | 目标 |
|------|-----|--------|--------|
| 23 | `n` | 状态阶段的 EP0 STALL:发送描述符数据,中止握手 | `usbport.sys` 重试循环 |
| 24 | `o` | MS OS String `MSFT100` → Extended Compat ID `dwLength=0xFFFF` | Windows 内核池 OOB |
| 25 | `p` | 描述符变形:每次重连时在 HID→Hub→随机 之间切换,保持相同的 VID/PID | Driver 重新绑定混淆 |
### 第 9 组 — Composite / Class 攻击
| 模式 | 按键 | 攻击方式 | 目标 |
|------|-----|--------|--------|
| 26 | `q` | IAD 冲突:3 个 IAD 全部声明占有 Interface 0 (HID+CDC+Hub, Counts 2/2/255) | `usbccgp.sys` Interface Map 别名化 |
| 27 | `r` | USB MSC (BOT/SCSI) + 错误的 CSW (`dCSWSignature=0xBAADC0DE`, Phase Error) | `usbstor.sys` BOT 重置循环 |
### 第 10 组 — 泛洪 / 连发
| 模式 | 按键 | 攻击方式 | 目标 |
|------|-----|--------|--------|
| 28 | `t` | HID Boot 键盘泛洪:1000 个 Reports/s,所有按键按下/松开 | Input 子系统停滞 |
| 29 | `u` | 连发序列器:所有 24 个模式各 50ms,无恢复时间 | 无 USB 栈恢复 |
| 30 | `v` | OMNI BOMB:同时发动所有描述符攻击 + EP0 STALL | 最大并发负载 |
## 模式选择
### UART (PA9/PA10, 115200 8N1)
```
1–9 → Modus 1–9
a–m → Modus 10–22
n–r → Modus 23–27
t–v → Modus 28–30
s → Erzwingt USB-Reconnect (kein Moduswechsel)
? → Aktuellen Status ausgeben
```
### 硬件引脚
- **PB2 = GND** → 模式已冻结 (复位时计数器不增加)
- PB3/PB4 选择 Bank:`00`=模式 1–4, `01`=5–8, `10`=9–12, `11`=13–16
- BKP_DR1 Bank 内偏移量 (1–4)
- **PB2 = 悬空** → 复位计数器:每次复位切换一个模式 1→2→…→30→1
### LED 编码
```
Modi 1–8 : N kurze Blinks
Modi 9–16 : 1 langer + (Modus−8) kurze
Modus 17 : 4 lange Blinks (⚠ BSOD-Warnung)
Modi 18–22 : 2 lange + (Modus−17) kurze
Modi 23–30 : 3 lange + (Modus−22) kurze
```
## 预编译固件
预编译镜像位于 [**Releases**](https://github.com/G4MEOVER18/stm32-usb-fuzzer/releases/latest):
```
# 基于 Flash 烧录 .bin 文件 (ST-Link):
st-flash write stm32-usb-fuzzer_STM32F103C8_v2.0.0.bin 0x08000000
# 或者通过 ST-Link Utility / OpenOCD 烧录 .hex
```
## 构建与烧录
### PlatformIO (推荐 — 自动下载工具链 + HAL)
```
pio run # bauen (ARM-GCC + STM32Cube-HAL werden geladen)
pio run -t upload # flashen (ST-Link)
pio device monitor -b 115200 # UART-Debug
```
平台/开发板已在 `platformio.ini` 中锁定 (`ststm32`, `bluepill_f103c8`)。无需手动安装 CUBE-SDK。
### Makefile (备选方案)
```
# 前提条件: arm-none-eabi-gcc, make, openocd + STM32CubeF1 HAL
# (在 Makefile 中调整 CUBE_SDK 路径)
make # build → .elf / .bin
make flash # flash via OpenOCD + ST-Link
```
**占用空间:** 128 KB 中的约 21 KB
## 架构
```
Core/
Inc/main.h — Moduskonstanten (FUZZ_MODE_*), Pin-/Timing-Defines
Src/main.c — Modus-Dispatch, GPIO/BKP-Modusauswahl, LED, IWDG
Src/uart_log.c — USART1 TX/RX, zeitgestempeltes Logging, Befehls-Parser
USB_DEVICE/App/
usbd_fuzzer.c — USBD_ClassTypeDef: gesamtes Deskriptor-Patching, EP0_TxSent,
DataOut (MSC), ApplyFuzzPatches(), Deskriptor-Arrays
usbd_fuzzer.h — Größen, Endpoint-Adressen, Extern-Deklarationen
usbd_desc.c — Device/String/LangID-Deskriptor-Callbacks, Laufzeit-Patches
```
核心设计:所有 30 种模式都集中在一个**单一二进制文件**中。编译时无需使用 `#ifdef`。模式在运行时通过 GPIO/BKP/UART 进行选择。`GetFSCfgDesc()` 被完全覆盖,因此主机接收到的每一个字节都处于 Fuzzer 的控制之下。
## 发现 / 针对 CVE
| CVE | 描述 | 模式 |
|-----|-------------|------|
| CVE-2024-21429 | 通过超长 String Descriptor 触发 `usbhub.sys` 堆溢出 | 10 |
| — | 通过包含 255 个端口的 Hub Descriptor 触发 `usbhub.sys` OOB 读取 | 1 |
| — | `hidparse.sys` 嵌套计数器下溢 | 13 |
| — | 通过 IAD 重叠触发 `usbccgp.sys` Interface Map 损坏 | 26 |
| — | `usbstor.sys` BOT 协议混淆循环 | 27 |
## 安全提示
- 仅在你拥有或获得明确书面授权的系统上使用
- 模式 17 (键盘 BSOD) 会导致目标系统崩溃 — 仅在隔离的测试环境中使用
- 模式 18–22 (BIOS 破坏) 会在 POST 阶段于固件层级对目标发起攻击
- 对滥用造成的损坏不承担任何责任
## 许可证
MIT License — 详情请见 [LICENSE](LICENSE)
*关于 USB 驱动的持续安全研究的一部分。欢迎贡献代码和提交 Bug 报告。*
## 支持
如果这个工具为你节省了时间或对你的研究有所帮助,欢迎进行小额捐赠:
**Bitcoin:** `39vZWmnUwDReQ15BwqQXzyqVQ6U8LardEf`
**联系方式:** [g4me.over.18@gmail.com](mailto:g4me.over.18@gmail.com)
**PayPal:** [paypal.me/Freakbank1](https://paypal.me/Freakbank1)
标签:STM32, USB协议栈, Web报告查看器, 实时处理, 客户端加密, 嵌入式硬件