陳 肖,黃 鐘,余 靜
(成都國信安信息產業基地有限公司,四川 成都 610041)
通用串行總線(Universal Serial Bus,USB)是一種具備熱插拔、體積小、成本低、擴展性好等優點的總線接口技術,其應用包括鼠標鍵盤、打印機、智能手機及網卡等多種設備,經過多年的發展已經升級為3.0版本,理論速度可達5.0 Gb/s[1]。
USB提供了多種設備協議規范,包括USB MSC(大容量存儲)、USB HID(人機接口設備)、USB Power Delivery(快速充電規范)以及USB OTG(On-The-Go)等。USB接口具備跨平臺的特性,各個系統平臺都遵循一致的USB標準,因此一旦遭受到惡意攻擊,將影響大量設備的正常運行。USB接口面臨著不同層次的惡意攻擊方向,部分敏感數據在通信過程中存在著信息泄露的風險,相關協議和驅動也存在著安全隱患。
USB總線接口由USB主機、USB設備和兩者之間的互連組成[2]。USB通信過程中,通過調用Windows API函數,系統I/O管理器將主機請求構造成一個I/O請求包(I/O Request Packet,IRP),并把它傳遞給USB功能驅動。USB功能驅動接收到IRP以后,根據數據載荷包含的操作指令構造出相應的URB請求塊(USB Request Block),并將此URB放入一個新的IRP中,然后把這個IRP向下傳遞給USB總線驅動。USB總線驅動根據該IRP中URB的數據執行相應的操作,操作完成后把結果返還給USB功能驅動[3]。USB功能驅動將包含結果數據的IRP返還給I/O管理器,最后I/O管理器將此IRP操作結果返還給應用程序。USB接口的數據通信流程如圖1所示。

圖1 USB接口設備數據通信流程
USB主機和USB設備之間的通信是由USB控制器控制的。主機側和設備側的USB控制器分別稱為主機控制器和設備控制器。主機控制器驅動和USB設備驅動構成了USB總線驅動,其中前者用于控制插入接口中的USB設備,后者用于控制USB設備與主機之間通信,從而實現具體的業務[4]。USB的驅動結構如圖2所示。
USB主機控制器驅動由USB核心驅動(USB Core Driver,USBD)和USB主機控制器驅動(USB Host Controller Driver,HCD)組成,協議相關的操作由兩部分共同處理完成。其中,HCD實現了主機控制器的硬件抽象,向下管理和檢測主控制器硬件的各種行為,向上接受USBD的調用和管理,主要功能包括主機控制器初始化、根HUB設備配置、相應接口函數提供以及完成數據傳輸等。

圖2 USB接口驅動結構
USBD是USB主機驅動的核心,是USB設備驅動與HCD通信的唯一通道。USBD一方面接收來自上層驅動傳遞的非USB格式數據流,按協議進行數據處理后傳遞給HCD,另一方面處理來自下層的HCD數據,傳遞給上層的設備驅動程序。
根據USB接口協議規范,USB總線上的所有數據傳輸都是由USB主機發起的。當USB設備連接到集線器時,集線器會將狀態變化信息傳遞給USB主機,此后USB主機通過根集線器向USB設備發送命令、獲取USB設備的各種信息,包括USB設備傳輸類型、USB速度及設備ID號等。
USB事務是USB主機和USB設備之間數據傳輸的基本單位,每次事務過程以2~3個數據包的形式進行USB總線傳輸[5]。每個數據包均包含以下2~3個步驟:
(1)USB主機控制器向USB設備發出相應操作指令;
(2)USB主機控制器和USB設備之間傳遞讀寫請求,其方向取決于第一部分的命令是讀還是寫;
(3)數據的接收方向發送方報告此次數據是否傳輸成功。
通過對USB接口通信過程的分析,可以從交互數據的產生、分發及處理等途徑對USB接口開展攻擊測試。
USB接口設備與主機進行交互時,攻擊者可以通過監聽USB接口的方式,將線路中的數據流旁路出來,然后按照USB總線協議格式解析數據包,以此獲取USB接口設備與主機的交互數據。部分具有身份認證功能的設備如認證key、加密U盤等,在使用過程中需要輸入賬號密碼等敏感信息,如果在交互過程中沒有對數據進行保護,則可能導致關鍵信息的泄露。
USB功能驅動由開發者編寫,實現了USB設備與主機之間通信的基本操作。由圖2可知,在USB驅動結構層次中,USB功能驅動位于HCD上方,不與實際的硬件打交道,而USB功能驅動實現對硬件設備的控制是通過向USBD發送包含URB的IRP來實現的。
URB作為描述與USB設備通信所用的基本載體和核心數據結構,根據驅動的需要發送或接受的數據。USB設備中的每個端點都會處理一個URB隊列,當URB被USB設備驅動創建后,承載了主機與USB接口產品的指令數據,會被安排給USB設備的特定端點。
因此,實現監聽USB接口的一種方式是在設備進行敏感數據操作時,采用軟件或硬件的方式旁路出操作系統發送給驅動程序的IPR包,然后解析IRP包中承載的URB數據,根據上下文即可獲得所需的敏感數據。
反編譯技術通過對低級語言代碼進行分析轉化,可以得到等價的高級語言代碼。通過反編譯可以實現對USB接口設備重要功能函數的定位和分析,從而獲取相關的敏感代碼信息。
在USB驅動體系中,設備功能驅動主要負責處理I/O請求,用戶模式下所有驅動程序的I/O請求全部由操作系統化為IRP類型的數據結構,而大部分請求是在派遣函數(DispatchFunction)中處理的。
IRP的基本屬性包括MajorFunction和MinorFunction,分別記錄了IRP的主類型和子類型。驅動程序在接收到不同類型的IRP后,操作系統會根據MajorFunction將IRP分發到不同的派遣函數中。在派遣函數中IRP得到處理,同時也可以確定這個IRP屬于哪種MinorFunction。
對具有認證、加密及交互等功能函數的USB接口設備,可以采用反編譯軟件對驅動和dll等文件進行反編譯,通過分析反編譯后的源代碼或偽代碼,以此獲得目標程序中派遣函數或關鍵處理函數的信息如函數名、參數值、處理邏輯及輸入輸出路徑等,為后續的數據讀取、權限控制等做準備。
當USB接口設備與主機進行通信時,通過攔截交互的數據包并對數據包進行篡改,可能會破壞設備的正常功能;或者采用構造異常數據、重放指令數據包的方式,使USB接口產品接收到錯誤的指令,則可能返回部分敏感信息,從而實現對USB接口設備的攻擊。
IRP傳輸時首先會被傳遞到設備棧最頂層的地方,然后逐步傳遞到下面的驅動程序。操作系統在構造設備棧時,I/O管理器可以使一個設備對象附加到另一個初始驅動程序創建的設備對象上,與初始設備對象相關的驅動程序決定的IRP,也將被發送到附加的設備對象相關的驅動程序上,這個被附加的驅動程序稱為過濾驅動程序。
過濾驅動可以在設備棧的任何層次中插入,過濾驅動創建的關鍵代碼為Device類。其中,AddDevice函數構造過濾器的實例,將創建的設備通過IoAttachDeviceToDeviceStack綁定到被過濾的設備上。對應不同的過濾功能,需要攔截的IRP也不同。在這個類里通過把過濾器插入設備棧實現IRP的攔截功能,進而可以使用自定義的完成例程來實現特定的功能。
因此,可以通過在USB接口設備的功能驅動上添加過濾驅動,使用過濾驅動程序來檢查、修改和完成它接收到的IRP,或者構造自己的IRP,從而達到修改數據的目的,實現對USB接口產品的有效攻擊測試。
對于具備USB接口的主機類設備,可以通過控制用戶的鍵盤獲取操作權限。采用人機接口設備(Human Interface Device,HID)攻擊可以將一個USB接口設備模擬成為鍵盤,讓主機將其識別為鍵盤類型,然后可以對主機進行腳本模擬按鍵攻擊[6]。
HID攻擊屬于物理層面攻擊。在驅動程序中,所有HID定義的設備驅動程序提供了對應數據類型和格式的自我描述包,計算機上的HID驅動程序可以解析數據和實現數據I/O與應用程序功能的動態關聯。
由于一般主機對HID設備缺少嚴格的檢測措施,只是簡單識別設備類型(HID設備標識符),計算機無法區分哪些是合法用戶設備,哪些是惡意設備。通過插入帶有攻擊代碼的USB設備,隨著惡意代碼的加載執行,便可實現HID攻擊。所以,通過修改設備反饋信息讓電腦將其他設備誤認為HID設備,就可以利用計算機和用戶輸入的外圍設備之間的基本信任實現攻擊,從而獲取控制權限。
結合針對USB接口的多種攻擊測試手段,相應的安全檢測方法可以從以下幾個方面開展。
檢測數據傳輸過程是否加密的方法可以通過采用Bushound、Usbtrace等USB接口監聽軟件,或者USB協議分析儀等硬件設備捕獲USB設備與USB主機之間的交互信息。
開展安全測試時,首先開啟監聽工具,插入被測設備。待主機上的應用程序輸入賬號密碼等敏感信息時,監聽工具旁路線路上的通信數據包,然后將數據進行分析比對,若發現旁路數據與輸入數據一致,則說明該USB設備存在明文數據傳輸的隱患。
檢測數據存儲過程是否加密的方法可以通過讀寫USB接口設備的存儲空間驗證。首先讀取USB產品的存儲空間數據,寫入特定數據后再次讀取存儲空間,最后比對前后存儲空間數據列表,驗證是否存在可識別的輸入指令。若發現一致的數據,則說明該USB接口設備存在敏感數據明文存儲的隱患。
檢測敏感文件保護可以通過查看設備軟件是否采取了反逆向工程技術,防范攻擊者對設備文件的反編譯分析。測試過程中可以采用IDA等反編譯軟件對驅動和dll等文件進行反編譯,通過分析反編譯的文件代碼,查看是否可以獲取到如加密函數、數據存儲位置、參數設置等一些敏感代碼的信息。若未進行反編譯處理,則說明該USB接口設備存在敏感數據泄露的隱患。
檢測USB接口設備能否正確應對錯誤的指令數據。開展測試時,通過采用過濾驅動掛載的方式篡改USB接口設備的通信數據,并觀察該設備的反應。若篡改數據可導致設備產生不正常的響應,則說明該設備未對錯誤信息進行有效處理。
檢測USB接口設備能否正確應對重放的指令數據。采用過濾驅動軟件對USB接口設備的通信數據進行捕獲和重放,并觀察該設備的反應。若重放數據能導致USB接口設備再次返回相同的敏感數據,則說明該USB設備未對重放信息進行有效處理。
檢測USB接口設備能否識別并阻止惡意設備。當插入外部設備時,查看被測設備能否通過在系統的安全事件日志中收集相應事件,并通過分析設備名稱和ID識別惡意設備。若未對外部設備的信息進行判斷,則說明該USB接口設備不能識別惡意設備。
具有敏感數據傳輸需求的USB接口設備應在傳輸過程中對數據進行加密處理。采用認證協議或者加密算法對需要傳輸的關鍵信息進行處理,保證數據包即使被攻擊方捕獲也無法從中獲取敏感數據。
具有敏感數據存儲需求的USB接口設備應在存儲過程中對數據進行加密處理。采用加密算法對需要存儲的敏感信息進行加密,使得攻擊方無法通過讀取地址空間的方式獲取敏感數據。
具有敏感信息交互功能的USB接口設備的相關代碼文件應進行安全加固。通過加殼、混淆等技術手段對相關文件進行保護,使得攻擊方無法通過反編譯、脫殼的方式,利用設備文件獲取敏感代碼信息。
USB接口設備應具備判斷并處理異常數據的能力。通過完善USB接口產品對異常指令的處理機制,使得攻擊方在發送異常數據時,產品能夠做出正確的響應,避免進入異常狀態。
USB接口設備應具備判斷并處理重放數據的能力。通過采用時間戳、序列號等方式對數據包進行保護,使得攻擊方在發送相同數據包時,USB接口產品能夠根據標志屏蔽惡意數據包。
隨著USB接口的廣泛應用,相關設備面臨的安全形勢越來越嚴峻。本文分析了針對USB接口的多種攻擊方法及原理,并提出了相應的安全測試手段和防御途徑,可為后續USB接口安全測試工具的研究和測試工作的開展提供指引。