已经在某些场合 在博客中,我们谈到了安德烈·科诺瓦洛夫(Andrey Konovalov)所做的工作 (一位Google开发人员)在Linux中的工作,他的工作是及时发现Linux内核的USB驱动程序以及Wifi设备中的故障。
现在他目前正在研究 为Linux内核开发了一个新模块,他将其命名为 “ USB Raw小工具” 它描述为一种允许在用户空间中模拟USB设备的实用程序。
除此之外 提到了正在考虑将某个模块包含在主Linux内核中的应用程序。 Google已经使用Google Raw Gadget来简化syzkaller工具包对USB内核堆栈的模糊测试。
最初,我使用GadgetFS(以及Dummy HCD / UDC模块)来模拟USB设备以进行模糊测试,但随后将其切换为自定义的书面接口。
实现不同接口的动机是为用户空间提供对USB Gadget层的直接和原始访问,其中每个USB请求都传递给用户空间以进行响应。
关于USB Raw Gadget
该模块负责添加新接口 程式设计 到内核子系统 称为“ USB Gadget”,并且正在开发以替代GadgetFS。
新API的创建是由于需要直接和低级访问 从用户空间发送到Gadget USB子系统,从而允许处理所有可能的USB请求(GadgetFS自行处理一些请求,而无需将其传输到用户空间)。
USB Raw Gadget通过/ dev / raw-gadget设备进行控制 与GadgetFS中的/ dev / gadget进行类比,但进行交互时使用基于ioctl()的接口,而不是伪FS。
除了由用户空间中的进程直接处理所有USB请求外,新接口还具有响应USB请求返回任何数据的能力(GadgetFS检查USB描述符的正确性并过滤掉某些响应,这会干扰USB堆栈清除测试期间的错误检测)。
USB Raw Gadget还允许您选择特定的UDC设备 (USB设备驱动程序)和要连接的驱动程序,而GadgetFS连接到第一个可用的UDC设备。
对于不同的UDC,可预测的终结点名称将映射到单个设备中不同类型的独立通信通道。
最后,如果您想了解更多信息,可以查看详细信息以及USB Raw Gadget中所做更改的日志 在下面的链接中。
如何在Linux中安装Raw Gadget USB模块?
对于那些有兴趣在其系统上测试此模块的人,可以按照此处详细说明进行操作。
对于虚拟HCD / UDC (一个模块,用于配置内核中相互连接的虚拟USB设备和主机控制器)。 我们必须打开一个终端,然后在其中键入以下命令:
svn checkout https://github.com/xairy/raw-gadget/trunk/dummy_hcd
这样,我们将通过在终端中执行以下命令来获取包含要编译的模块的文件夹:
cd dummy_hcd make
然后我们继续安装它们:
./insmod.sh
如果我们想更新模块,我们可以这样做:
./update.sh
现在 对于那些想要安装内核模块的人。 在终端中,我们将通过执行以下命令来获取必要的文件:
svn checkout https://github.com/xairy/raw-gadget/trunk/raw_gadget
这样,我们将通过在终端中执行以下命令来获取包含要编译的模块的文件夹:
cd dummy_hcd make
然后我们继续安装它们:
./insmod.sh
如果我们想更新模块,我们可以这样做:
./update.sh
您可以签入工作 以下链接。