已經在某些場合 在博客中,我們談到了安德烈·科諾瓦洛夫(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
您可以簽入工作 以下鏈接。