[AI 整理声明]本文基于作者的项目文档与开发实践,由 AI 辅助整理输出,核心内容与数据均来自作者本人。
目录
- 硬件
- 部署
- 设备模拟
- USB Fuzz
- 日志
- 系统信息
- 架构
- 注意
USB 是整机设备的通用外设入口,主机侧的 USB 协议栈(枚举、描述符解析、类驱动)历来是内核攻击面——一个畸形描述符或控制传输就可能让主机崩溃、卡死甚至提权。USB Fuzzer 就是用来对这一层做协议 fuzzing 与设备模拟的便携工具,用 Raspberry Pi Zero 2 W 把自己伪装成 USB 设备接进待测主机,全程用浏览器操控,走树莓派自带的 Wi-Fi,不用接显示器和键盘。
- GitHub:https://github.com/cstriker1407/usb_fuzzer
硬件
- Raspberry Pi Zero 2 W,micro-USB 数据口与供电口分开,没有 VBUS 冲突
- 一根 micro-USB ↔ USB-A/USB-C 数据线:树莓派
USB口 → 待测主机 USB Host 口;PWR IN口单独供 5V
部署
烧录 Raspberry Pi OS / Debian(64-bit),Imager 里预置好 SSH,然后:
sudobashscripts/provision.sh# 安装依赖 + systemd 服务 + 编译 raw-gadget + 配 dwc2sudoreboot# 打开 http://<pi-ip>:10001provision.sh配好三个开机自启单元:usbd.service(root 守护)、usbfuzzer-web.service(uvicorn)、usbfuzzer-net.service(开机联网)。
开机联网:Wi-Fi 凭据填在/etc/usbfuzzer/network.conf,范围内有已知 Wi-Fi 就连,否则自动建热点usb_fuzzer_<MAC 尾字节>(默认密码12345678)。插上待测机、手机连热点即可操作,不依赖实验室网络。
开发机预览(无硬件):
pipinstall"fastapi>=0.110""uvicorn[standard]>=0.29"bashscripts/run-dev.sh# http://localhost:10001,设备模拟/Fuzz 在真机上才跑设备模拟
ConfigFS 实现,8 类真实 USB 设备,界面卡片式平铺:
- 键盘:指定按键序列或随机「猴子」模式(可设次数 + 种子,便于复现)
- 鼠标:含滚轮,同样支持随机模式
- 媒体键 / 手柄:标准 HID
- U盘:上传任意文件作为盘内容,读写 / 只读 / 光盘(CDROM)模式可选
- 串口(CDC ACM):双向收发
- USB 网卡(CDC ECM):给待测主机分配 DHCP,建一个「假网络」
- MIDI:循环音阶
同一时刻只有一个 gadget 能绑定 UDC,设备模拟与 Fuzz 互斥。
USB Fuzz
raw-gadget 实现,逐字节构造响应,对待测主机的 USB 协议栈发畸形枚举:
三种变异策略:
- 描述符变异:对 Device / Configuration / Interface / Endpoint 描述符做字段变异
- 控制传输变异:在 EP0 控制传输阶段注入异常响应
- 混合随机:两者随机叠加
**三档强度:**低(单处变异)/ 中 / 高(每用例叠加 2 处畸形的复合变异)
capture→fuzz:导入真实 USB 设备的原始描述符(从/sys/bus/usb/devices/*/descriptors读出的 hex 或二进制)作为基线,对待测主机打「真实设备画像」的畸变枚举,避免因设备不合理而在早期枚举阶段就被拒绝。
主机侦察(scan):呈现一个合法设备,被动记录待测主机枚举时发来的每个控制请求,判断主机认它为哪类、走到哪一步。隐藏不适用的参数,进度显示「侦察中…」。
异常用例记录原始字节,可回放复现。本地错误(如 UDC 忙)与待测主机反馈明确区分。
日志
每个 Fuzz 会话逐用例落盘 JSONL,包含用例编号、变异类型、原始字节、待测主机响应与时间戳:
日志可筛选、下载,选中用例可单独回放。保留轮转防写满 SD 卡。
系统信息
「系统信息」页显示当前 Wi-Fi / 热点模式、SSID、IP、MAC、UDC 状态与资源占用:
架构
两进程设计,控制面(Wi-Fi/网页)与数据面(USB)解耦:
浏览器 │ Wi-Fi HTTP :10001 + WebSocket ▼ web 进程 (FastAPI) 代理命令给 usbd;把事件广播给所有浏览器 │ IPC (Unix socket) ▼ usbd 进程 (root) 独占 UDC;跑引擎;写 JSONL 日志 │ USB (dwc2 OTG, peripheral) ▼ 待测主机 DUT这样拆分的好处是隔离:fuzz 把待测主机打挂时,网页与日志依然存活;web 崩了不影响在跑的会话;usbd 崩了由 systemd 拉起。
注意
- 本工具仅用于已授权的测试——自己的设备,或有明确书面许可的系统
- USB fuzzing 可能导致待测主机崩溃、数据损坏甚至变砖,测试前做好数据备份
- 摄像头(UVC)暂停:dwc2 在当前内核(6.18)上拒绝启动 UVC 等时端点(
udc_start -19),是内核限制,代码保留待后续支持 - 已经过一轮多智能体对抗式代码审查,修复了 12 个确认缺陷(含大日志撑爆 IPC 64KB 上限、会话删除卡死守护进程、会话收尾竞态等)
当前版本 v1.2.0,MIT 开源。