最近看一些USB fuzzing方面的东西,总结一下。主要是软件方面的工做。linux
qemu支持USB重定向协议,用来远程链接USB设备,vUSBf使用这个来实现不一样USB设备的虚拟化。github
在USB重定向协议中,USB的数据经过网络而不是直接的硬件接触,QEMU中运行系统,而外部设备的虚拟经过重定向协议链接QEMU来实现,也就是redirserver,整个架构以下:网络
在redirserver端实现USB设备的虚拟和fuzzing,在QEMU中运行OS,二者经过USB重定向协议链接。同时还须要两个部件架构
文章地址:https://www.usenix.org/system/files/conference/woot14/woot14-vantonder.pdf并发
提出了一个USB测试框架,文章用到了Facedancer,一种用来测试USB的硬件设备,产生USB数据。而后通过中间层MC,最后经过一个Facedancer连到被测试主机上,能够在MC处作fuzzing框架
文章在这里:https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=5663316jsp
这个直接改了QEMU,QEMU能够经过主机的设备文件访问主机上的USB设备,文章拦截QEMU与主机的设备交互信息加入fuzzing模块ide
按照这个说法是否是必需要有相应的硬件设备才能进行fuzzing了?函数
该文章使用S2E进行错误注入。
S2E是选择符号执行,能够将符号执行应用于大型程序,好比像内核。它自己就支持使用SystemTap脚本将外部设备的输入符号化,而后进行符号执行,官方介绍看这里https://github.com/S2E/s2e-old/blob/master/docs/SystemTap.rst
根据这篇文章的内容,贡献是两点:
一、作了提出了一种将故障注入与并发模糊和符号执行相结合的设备驱动程序缺陷检测方法
二、咱们介绍了模拟虚拟USB设备的方法,该设备容许测试任意客户机驱动程序
按照我如今的理解,他虚拟USB设备的方式好像和vUSBf并无太多的区别,在USB枚举阶段,因为USB协议已经定好了数据交换的格式,因此只须要个更改那5中描述符就能够了,可是在真实的数据卷换场景下面,vUSBf须要根据不一样的设备来模拟。每太明白它的这部分模拟是怎么作的,USB数据交换的4种模式,感受它就是抽象了一下这4中交换数据方式,而后就说能够通用模拟了。
故障注入这一点,它就使用了符号执行,在相应USB的回调函数中,经过systemTap脚本的控制,用符号执行让该函数以错误的值返回。好像是这个意思,S2E的这几个函数的含义也还不是太清楚。
谷歌开发的基于覆盖的系统调用fuzzing,也发现了不少的USB漏洞
具体漏洞信息看这里:https://github.com/google/syzkaller/blob/master/docs/linux/found_bugs_usb.md
使用Syzkaller挖USB漏洞:https://data.hackinn.com/ppt/OffensiveCon2019/Coverage-Guided%20USB%20Fuzzing%20with%20Syzkaller.pdf
硬件设备,该板的目的是容许USB设备在主机端Python中编写,这样一个工做站就能够对其余主机的USB设备驱动程序进行模糊测试
不是专门fuzzingUSB的,可是能够对内存映射IO和MDA的数据进行fuzzing。须要对内核源码进行修改。