現有USB模糊測試技術的總結
Syzkaller(Google團隊開發的一款針對Linux內核進行模糊測試的開源工具),最近開始支持USB模糊測試,并且已經在Linux內核中發現了80多個漏洞。目前,鑒于USB本身的復雜性導致的安全性的影響和潛在的大量漏洞,幾乎所有模糊測試專家都開始將他們的模糊測試技術應用于USB的模糊測試中。
什么是USB協議棧?
按著協議,USB分為USB host(USB主機) 和 USB device/gadget(USB從機),USB主機能夠主動發起會話而USB從機則不能發起會話。HOST是主機,好比電腦端那個USB,簡而言之,主機好比電腦端那個USB接口,從機好比就是連接到USB接口的U盤。當我們談論USB時,通常說的是USB主機,例如帶有標準USB端口的筆記本電腦。下圖是Linux USB主機棧。從下到上,分為硬件、內核空間和用戶空間。
USB主機控制器設備(又名HCD)是連接到系統PCI總線的PCI設備,通過USB端口提供USB連接支持。根據USB技術的發展,它也被稱為USB 1.x的UHCI / OHCI,USB 2.x的EHCI和USB 3.x控制器的XHCI。要使內核使用此控制器,我們需要一個USB主機控制器驅動程序,它可以設置PCI配置和DMA。上面是USB內核,實現底層USB協議棧,并使用通用內核API(submit /recv URB)抽象發送/接收USB數據包的方式。上面是不同的USB從機驅動程序,例如USB HID驅動程序和USB大容量存儲驅動程序。這些驅動程序會實現不同的USB類協議(例如,HID,大容量存儲),為內核中的其他子系統(例如輸入和數據塊)提供粘合層,方便用戶空間(例如創建/dev節點)。
由于Linux也廣泛用于嵌入式系統,例如一些USB軟件保護器(USB Dongle),USB從機指的是Linux內的USB軟件保護器硬件和USB模式。 USB從機與USB主機模式完全不同。下圖顯示了Linux內核中的USB從機協議棧。
底部是USB從機控制器(又名UDC),與HCD一樣,UDC也在PHY層內實現特定版本的USB標準。但是,與英特爾最常用的HCD不同,UDC IP來自不同的硬件供應商,例如DWC2/3,OMAP,TUSB和FUSB。這些控制器通常具有其自己的設計規范,并且當它們支持USB On-The-Go(又名OTG)模式時也可遵循HCD規范(例如XHCI規范)。 OTG允許UDC在USB主機和USB從機模式之間切換。例如,當Android設備以MTP的形式與筆記本連接時,Android USB從機控制器處于USB從機模式。如果USB閃存驅動程序插入Android設備,UDC將在USB主機模式下工作。支持OTG的UDC也被USB 3.x標準中的雙角色設備(Dual-Role Device,DRD)控制器取代。因此,不需要OTG數據線來切換UDC的角色,因為角色切換是在DRD控制器的軟件中完成的。
要使用UDC,你需要在內核中使用UDC驅動程序,通過行業標準總線((包括 AMBA? AHB和AXI接口))提供連接和配置,并為更高層設置DMA。與USB主機協議棧中的USB內核一樣,USB從機協議棧中的USB從機內核也提供API,通過回調和配置來注冊和實現USB從機函數。例如,我們可以通過請求現有的大容量存儲函數(f_mass_storage)將USB描述符傳遞到USB從機內核并實現典型的USB大容量存儲設備。對于諸如MTP的更復雜的協議,用戶空間守護進程或庫提供協議邏輯并通過例如configfs或usbfs與從機函數通信。
USB主機控制器(Host Controller)
USB的拓撲結構決定了主機控制器就是最高統帥,沒有主機控制器的要求,從機永遠不能主動發數據。所以主機控制器在USB的世界里扮演著重要的角色,它是幕后操縱者。
比如說USB主機發送Setup數據包獲取設備描述符是怎么發出去的?這個過程包含很多信息,比如:如何在D+和D-這兩根線上傳過去的、又傳過來的。 這一切的工作都是主機控制器給我們做的,USB主機控制器的規范有很多種,比如UHCI/OHCI。
什么是USB controller?
USB 設備和主機的接口就是host controller,一個主機可以支持多個host controller,比如分別屬于不同廠商的。那么USB host controller 本身是做什么的? 很簡單用于控制,控制所有的USB從機的通信。 CPU把要做的事情分配給主機控制器,然后自己想干什么就干什么去,主機控制器替他去完成剩下的事情,事情辦完了再通知CPU。否則讓CPU去盯著每一個從機做每一件事情,那是不現實的。
控制器的主要工作是什么? 把數扔出去,把數拿回來。絕對不應該偷偷加工數據。
主機控制器控制總線上包的傳輸, 使用1ms或125us的幀。在每幀的開始時,主機控制器產生一個幀開始包(SOF: Start of Frame)。
SOF包用于同步幀的開始和跟蹤幀的數目,包在幀中被傳輸,或由主機到從機(輸入事務),或由從機到主機(輸出事務)。傳輸總是由 主機發起的(輪詢傳輸)?;卮嗣織lUSB總線只能有一個 主機。每個數據包的傳輸都有一個狀態階段同(同步傳輸除外),數據接收者可以在其中返回ACK(應答接收),NAK(重試),STALL(錯誤條件)或什么也沒有(混亂數據階段,設備不可用或已經斷開)。
USB模糊測試的歷史
FaceDancer
由于可編程USB硬件模糊測試工具——FaceDancer的出現,USB模糊測試開始吸引更多的關注。它支持USB主機和從機模式模擬,并允許發送預先形成帶有漏洞的USB請求和響應。 Umap/Umap2提供了一個用Python編寫的模糊測試框架,它具有面向FaceDancer的不同USB從機和響應模板。TTWE框架通過使用兩個FaceDancer分別模擬USB主機和USB從機來實現USB主機和USB從機之間的MitM,此MitM允許兩個方向的USB數據包突變,從而實現雙方的模糊測試。
目前所有這些解決方案都集中在USB主機協議棧上,其原因是人們假設惡意USB從機不是惡意的USB主機(例如筆記本電腦),并且大多數USB從機固件都是閉源的,因此很難被分析。這意味著,大多數漏洞/錯誤存在于USB內核(用于解析USB響應)和一些常見的USB驅動程序(例如鍵盤)中。這些解決方案的優點是能夠完全模擬USB從機。但是,在我看來,卻有兩方面不足:
1.過于依賴硬件;
2.目標反饋有限。
由于FaceDancer速度很慢,這使得任何基于它構建的解決方案都無法擴展測試功能。由于在實踐中,經常需要將FaceDancer和目標設備作為模糊測試的基本要素,所以,這也對FaceDancer的可擴展性帶來了更多挑戰。反饋是另一個重要問題,模糊輸入的突變是基于模板和隨機化的,除了系統日志記錄之外,沒有來自目標的實時反饋(例如代碼覆蓋率)。因此,模糊測試的準確率是非常不可信的。
為了擺脫硬件依賴性,使用虛擬化(例如QEMU)來進行保存。vUSBf使用QEMU/KVM運行內核映像,并利用QEMU中的USB重定向協議將對USB從機的訪問重定向到由模糊測試工具控制的USB模擬工具,如下所示:
雖然vUSBf提供了一個很好的編排體系結構來并行運行多個QEMU實例,以此解決可擴展性問題,但模糊測試工具本質上是基于模板的,而反饋也還仍然依賴于系統日志記錄。
POTUS
為此,有研究人員開發了POTUS 項目,POTUS 項目也可以發現位于 Linux USB 驅動程序的漏洞。
2017年,倫敦大學的安全研究人員發布了 POTUS工具,這是一種可以發現 Linux USB 設備驅動程序漏洞的工具。該工具通過設置虛擬機,通用 USB 設備以及故障注入,發送模糊符號等技術來測試 USB 驅動程序繼而查找漏洞。
研究人員通過 POTUS 測試 USB 驅動程序發現了兩個 Linux 內核漏洞。一個是 CVE-2016-5400,USB 設備驅動程序中用于與 Airspy 軟件定義無線電(SDR)通信的內存泄漏漏洞,而另一個是自 2003 年以來已存在的 Linux 內核的樂高 USB 塔驅動器使用后釋放漏洞(無 CVE 標識符)。
POTUS的工作原理如下所示:
systemtap是一個診斷linux系統性能和功能問題的開源軟件,并且允許開發人員編寫和重用簡單的腳本深入探查linux系統的活動,可以快速安全的提取過濾總結數據,以便能夠診斷復雜的性能或功能問題。
在USB模糊測試中,SystemTap用于檢測內核存在的漏洞,并將漏洞數量記錄下來。基于不同狀態下的故障數量的路徑優先級排序算法可以控制“分叉(fork)”的數量。fork()函數通過系統調用創建一個與原來進程幾乎完全相同的進程,也就是兩個進程可以做完全相同的事,但如果初始參數或者輸入的變量不同,兩個進程也可以做不同的事。一個進程調用fork()函數后,系統先給新的進程分配資源,例如存儲數據和代碼的空間。然后把原來的進程的所有值都復制到新的新進程中,只有少數值與原來的進程的值不同,相當于克隆了一個自己。
給定路徑的故障數量表示代碼覆蓋率,因此,故障數量越大則代碼覆蓋率越高。另外,POTUS還在QEMU中實現了一個通用的USB虛擬從機,以使用可配置的設備描述符和數據傳輸來模擬不同的USB從機。 虛擬從機中的USB 驅動程序(USB 驅動程序)使用系統調用來使用暴露在虛擬從機的不同設備節點。與vUSBf相比,POTUS就具有模糊測試反饋機制(通過計算路徑內的故障數量),從而支持更多USB從機模擬。但是,在USB 驅動程序中模擬某些USB從機操作的手動進程、符號執行的基本限制——路徑爆炸( path explosion),以及依賴于路徑故障數量的未知有效性和局限性,使得POTUS很難被廣泛使用。
本文我們先從什么是USB協議棧開始講起,然后再講到USB模糊測試的歷史,其中講到了一些過去的常用技術和工具,不過它們都存在著一些問題。下文,我們將介紹最新的USB模糊測試的解決方案。