G4MEOVER18/stm32-usb-fuzzer
GitHub: G4MEOVER18/stm32-usb-fuzzer
Stars: 0 | Forks: 0
# STM32 USB Descriptor Fuzzer
Ein Hardware-USB-Fuzzer auf Basis des STM32F103C8T6 (Blue Pill), der fehlerhafte USB-Deskriptoren sendet, um Schwachstellen in Windows-USB-Treiber-Stacks zu finden (`usbport.sys`, `usbhub.sys`, `usbccgp.sys`, `kbdhid.sys`, `usbstor.sys`, `hidparse.sys`).
**30 zur Laufzeit wählbare Angriffsmodi** — kein erneutes Flashen nötig. Die Modi decken Device-, Configuration-, Interface-, Endpoint-, String-, HID-, Hub-, BOS-, LangID- und Device-Qualifier-Deskriptoren ab, außerdem EP0-Protokollangriffe, Composite-Device-Confusion, USB-MSC-Exploitation und autonomes BSOD-Triggering.
## Hardware
| Komponente | Details |
|-----------|---------|
| MCU | STM32F103C8T6 (Blue Pill, 128KB Flash, 20KB RAM) |
| USB | Full-Speed USB 2.0 (PA11/PA12) |
| UART-Debug | USART1, PA9=TX, PA10=RX, 115200 8N1 |
| Modusauswahl | PB2 (Freeze), PB3/PB4 (Bank), BKP_DR1 (Zähler) |
| LED | PC13 (active low, blinkt den aktiven Modus) |
| Watchdog | IWDG ~26s Timeout |
## Angriffsmodi
### Gruppe 1 — Device Descriptor
| Modus | Taste | Angriff | Ziel |
|------|-----|--------|--------|
| 1 | `1` | `bDeviceClass=0x09` Hub-Impersonation + Hub-Deskriptor mit 255 Ports | `usbhub.sys` Pool-OOB-Read |
| 2 | `2` | `bcdUSB=0x0300` gefälschtes USB 3.0 + fehlerhafter BOS (85→45 Bytes, Cap `bLength=255`) | USB-3.0-Stack-Overread |
| 3 | `3` | `bNumConfigurations=0` | Logikfehler bei der USB-Enumeration |
| 4 | `4` | `bMaxPacketSize0=0xFF` + EP `wMaxPacketSize=255` | Verletzung der Paketgrößenbeschränkung |
### Gruppe 2 — Config / Interface / Endpoint
| Modus | Taste | Angriff | Ziel |
|------|-----|--------|--------|
| 5 | `5` | `wTotalLength=5` (Underread) | Config-Deskriptor-Underread |
| 6 | `6` | `wTotalLength=0xFFFF` (65535) | 64KB Kernel-Buffer-Overread |
| 7 | `7` | `bNumInterfaces=16` | `usbccgp.sys` Interface-Array-Overflow |
| 8 | `8` | `bNumEndpoints=0` Lüge (EP trotzdem offen) | Class-Driver-EP-Confusion |
| 9 | `9` | `bmAttributes=0x00` + `bInterval=0` + `iface.bLength=0` | Parser-Endlosschleife |
### Gruppe 3 — String Descriptors
| Modus | Taste | Angriff | Ziel |
|------|-----|--------|--------|
| 10 | `a` | Manufacturer-String `bLength=0xFE`, 252 Unicode-Zeichen gesendet | CVE-2024-21429: `usbhub.sys` Kernel-Buffer-Overflow |
### Gruppe 4 — HID Descriptors
| Modus | Taste | Angriff | Ziel |
|------|-----|--------|--------|
| 11 | `b` | `wDescriptorLength=0xFFFF` | Übergroße HID-Report-Buffer-Allokation |
| 12 | `c` | `wTotalLength=0xFFFF` + HID `bNumDescriptors=16` | Doppelter Overread |
| 13 | `d` | Multi-Vektor-HID-Report: Nesting-Underflow + PUSH-Bomb + Long Item + `REPORT_SIZE=255×REPORT_COUNT=255` | `hidparse.sys`-Korruption |
### Gruppe 5 — Sonderfälle / Timing
| Modus | Taste | Angriff | Ziel |
|------|-----|--------|--------|
| 14 | `e` | 200ms-Reconnect-Loop + fehlerhafter HID-Deskriptor | UAF-Race-Condition |
| 15 | `f` | LCG-Vollzufalls-Deskriptor-Patch bei jedem Reconnect | Stochastisches Fuzzing |
| 16 | `g` | Auto-Sequencer: alle Modi 1–15 nach Absturzwahrscheinlichkeit sortiert | Automatisierter Sweep |
### Gruppe 6 — Keyboard BSOD (nur manuell)
| Modus | Taste | Angriff | Ziel |
|------|-----|--------|--------|
| 17 | `h` | **Autonom**: als Tastatur enumerieren → `CrashOnCtrlScroll=1` Registry-Key per HID setzen → USB-Reconnect → `RCtrl+ScrollLock×2` | `MANUALLY_INITIATED_CRASH (0xE2)` |
### Gruppe 7 — BIOS/POST-Disruption
| Modus | Taste | Angriff | Ziel |
|------|-----|--------|--------|
| 18 | `i` | 10ms-Reconnect-Hammer | BIOS-USB-Enumerierungs-Timeout |
| 19 | `j` | `bNumConfigs=254` + `wTotalLength=0xFFFF` | BIOS Config-Enum-Schleife |
| 20 | `k` | LangID `bLength=0xFF` (4 echte Bytes) | BIOS-String-Parser-OOB |
| 21 | `l` | DevQual `bLength=0xFF` + `bcdUSB=0x0300` | HS-Negotiation-Crash |
| 22 | `m` | Boot-Disruption-Sequencer: Modi 19→20→21→1→2→6→10 + schnelle Reconnect-Bursts | Vollständige BIOS-Disruption |
### Gruppe 8 — EP0 / Protokollangriffe
| Modus | Taste | Angriff | Ziel |
|------|-----|--------|--------|
| 23 | `n` | EP0 STALL in der Status-Phase: Deskriptordaten gesendet, Handshake abgebrochen | `usbport.sys`-Retry-Schleife |
| 24 | `o` | MS OS String `MSFT100` → Extended Compat ID `dwLength=0xFFFF` | Windows Kernel-Pool-OOB |
| 25 | `p` | Deskriptor-Morph: HID→Hub→zufällig bei jedem Reconnect, gleiche VID/PID | Driver-Re-Bind-Confusion |
### Gruppe 9 — Composite / Class-Angriffe
| Modus | Taste | Angriff | Ziel |
|------|-----|--------|--------|
| 26 | `q` | IAD-Konflikt: 3 IADs beanspruchen alle Interface 0 (HID+CDC+Hub, Counts 2/2/255) | `usbccgp.sys` Interface-Map-Aliasing |
| 27 | `r` | USB MSC (BOT/SCSI) + fehlerhafter CSW (`dCSWSignature=0xBAADC0DE`, Phase Error) | `usbstor.sys` BOT-Reset-Schleife |
### Gruppe 10 — Flood / Rapid-Fire
| Modus | Taste | Angriff | Ziel |
|------|-----|--------|--------|
| 28 | `t` | HID-Boot-Keyboard-Flood: 1000 Reports/s, alle Tasten gedrückt/losgelassen | Input-Subsystem-Stall |
| 29 | `u` | Rapid-Fire-Sequencer: alle 24 Modi je 50ms, keine Erholungszeit | Kein USB-Stack-Recovery |
| 30 | `v` | OMNI BOMB: alle Deskriptor-Angriffe gleichzeitig + EP0 STALL | Maximale Gleichzastlast |
## Modusauswahl
### 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
### Hardware-Pins
- **PB2 = GND** → Modus EINGEFROREN (kein Zählerfortschritt beim Reset)
- PB3/PB4 wählen Bank: `00`=Modi 1–4, `01`=5–8, `10`=9–12, `11`=13–16
- BKP_DR1 Intra-Bank-Offset (1–4)
- **PB2 = offen** → Reset-Zähler: jeder Reset schaltet einen Modus weiter 1→2→…→30→1
### LED-Kodierung
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
## Build & Flash
# Prerequisites: arm-none-eabi-gcc, make, openocd
# STM32CubeF1 HAL library expected at D:/Projekte/Firmware/STM32CubeF1
# (adjust Makefile paths as needed)
make # build → stm32-usb-fuzzer.elf / .bin
make flash # flash via OpenOCD + ST-Link
**Toolchain:** arm-none-eabi-gcc, OpenOCD mit ST-Link v2
**Flash-Belegung:** ~23KB von 128KB
## Architektur
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
Kerndesign: alle 30 Modi in einem **einzigen Binary**. Kein `#ifdef` zur Compile-Zeit. Der Modus wird zur Laufzeit über GPIO/BKP/UART ausgewählt. `GetFSCfgDesc()` ist vollständig überschrieben, sodass jedes Byte, das der Host empfängt, unter der Kontrolle des Fuzzers liegt.
## Findings / Gezielte CVEs
| CVE | Beschreibung | Modus |
|-----|-------------|------|
| CVE-2024-21429 | `usbhub.sys` Heap-Overflow über überlangen String-Deskriptor | 10 |
| — | `usbhub.sys` OOB-Read über Hub-Deskriptor mit 255 Ports | 1 |
| — | `hidparse.sys` Nesting-Counter-Underflow | 13 |
| — | `usbccgp.sys` Interface-Map-Korruption über IAD-Overlap | 26 |
| — | `usbstor.sys` BOT-Protokoll-Confusion-Schleife | 27 |
## Sicherheitshinweise
- Nur auf Systemen verwenden, die dir gehören oder für die eine ausdrückliche schriftliche Genehmigung vorliegt
- Modus 17 (Keyboard BSOD) bringt das Zielsystem zum Absturz — nur in isolierten Testumgebungen einsetzen
- Die Modi 18–22 (BIOS-Disruption) greifen das Ziel auf Firmware-Ebene während des POST an
- Für Schäden durch Missbrauch wird keine Haftung übernommen
## Lizenz
MIT License — siehe [LICENSE](LICENSE)
*Teil laufender Sicherheitsforschung zu USB-Treibern. Beiträge und Bug-Reports sind willkommen.*
标签:客户端加密