陳 肖,黃 鐘,余 靜
(成都國信安信息產(chǎn)業(yè)基地有限公司,四川 成都 610041)
通用串行總線(Universal Serial Bus,USB)是一種具備熱插拔、體積小、成本低、擴展性好等優(yōu)點的總線接口技術(shù),其應(yīng)用包括鼠標(biāo)鍵盤、打印機、智能手機及網(wǎng)卡等多種設(shè)備,經(jīng)過多年的發(fā)展已經(jīng)升級為3.0版本,理論速度可達5.0 Gb/s[1]。
USB提供了多種設(shè)備協(xié)議規(guī)范,包括USB MSC(大容量存儲)、USB HID(人機接口設(shè)備)、USB Power Delivery(快速充電規(guī)范)以及USB OTG(On-The-Go)等。USB接口具備跨平臺的特性,各個系統(tǒng)平臺都遵循一致的USB標(biāo)準(zhǔn),因此一旦遭受到惡意攻擊,將影響大量設(shè)備的正常運行。USB接口面臨著不同層次的惡意攻擊方向,部分敏感數(shù)據(jù)在通信過程中存在著信息泄露的風(fēng)險,相關(guān)協(xié)議和驅(qū)動也存在著安全隱患。
USB總線接口由USB主機、USB設(shè)備和兩者之間的互連組成[2]。USB通信過程中,通過調(diào)用Windows API函數(shù),系統(tǒng)I/O管理器將主機請求構(gòu)造成一個I/O請求包(I/O Request Packet,IRP),并把它傳遞給USB功能驅(qū)動。USB功能驅(qū)動接收到IRP以后,根據(jù)數(shù)據(jù)載荷包含的操作指令構(gòu)造出相應(yīng)的URB請求塊(USB Request Block),并將此URB放入一個新的IRP中,然后把這個IRP向下傳遞給USB總線驅(qū)動。USB總線驅(qū)動根據(jù)該IRP中URB的數(shù)據(jù)執(zhí)行相應(yīng)的操作,操作完成后把結(jié)果返還給USB功能驅(qū)動[3]。USB功能驅(qū)動將包含結(jié)果數(shù)據(jù)的IRP返還給I/O管理器,最后I/O管理器將此IRP操作結(jié)果返還給應(yīng)用程序。USB接口的數(shù)據(jù)通信流程如圖1所示。
圖1 USB接口設(shè)備數(shù)據(jù)通信流程
USB主機和USB設(shè)備之間的通信是由USB控制器控制的。主機側(cè)和設(shè)備側(cè)的USB控制器分別稱為主機控制器和設(shè)備控制器。主機控制器驅(qū)動和USB設(shè)備驅(qū)動構(gòu)成了USB總線驅(qū)動,其中前者用于控制插入接口中的USB設(shè)備,后者用于控制USB設(shè)備與主機之間通信,從而實現(xiàn)具體的業(yè)務(wù)[4]。USB的驅(qū)動結(jié)構(gòu)如圖2所示。
USB主機控制器驅(qū)動由USB核心驅(qū)動(USB Core Driver,USBD)和USB主機控制器驅(qū)動(USB Host Controller Driver,HCD)組成,協(xié)議相關(guān)的操作由兩部分共同處理完成。其中,HCD實現(xiàn)了主機控制器的硬件抽象,向下管理和檢測主控制器硬件的各種行為,向上接受USBD的調(diào)用和管理,主要功能包括主機控制器初始化、根HUB設(shè)備配置、相應(yīng)接口函數(shù)提供以及完成數(shù)據(jù)傳輸?shù)取?/p>
圖2 USB接口驅(qū)動結(jié)構(gòu)
USBD是USB主機驅(qū)動的核心,是USB設(shè)備驅(qū)動與HCD通信的唯一通道。USBD一方面接收來自上層驅(qū)動傳遞的非USB格式數(shù)據(jù)流,按協(xié)議進行數(shù)據(jù)處理后傳遞給HCD,另一方面處理來自下層的HCD數(shù)據(jù),傳遞給上層的設(shè)備驅(qū)動程序。
根據(jù)USB接口協(xié)議規(guī)范,USB總線上的所有數(shù)據(jù)傳輸都是由USB主機發(fā)起的。當(dāng)USB設(shè)備連接到集線器時,集線器會將狀態(tài)變化信息傳遞給USB主機,此后USB主機通過根集線器向USB設(shè)備發(fā)送命令、獲取USB設(shè)備的各種信息,包括USB設(shè)備傳輸類型、USB速度及設(shè)備ID號等。
USB事務(wù)是USB主機和USB設(shè)備之間數(shù)據(jù)傳輸?shù)幕締挝?,每次事?wù)過程以2~3個數(shù)據(jù)包的形式進行USB總線傳輸[5]。每個數(shù)據(jù)包均包含以下2~3個步驟:
(1)USB主機控制器向USB設(shè)備發(fā)出相應(yīng)操作指令;
(2)USB主機控制器和USB設(shè)備之間傳遞讀寫請求,其方向取決于第一部分的命令是讀還是寫;
(3)數(shù)據(jù)的接收方向發(fā)送方報告此次數(shù)據(jù)是否傳輸成功。
通過對USB接口通信過程的分析,可以從交互數(shù)據(jù)的產(chǎn)生、分發(fā)及處理等途徑對USB接口開展攻擊測試。
USB接口設(shè)備與主機進行交互時,攻擊者可以通過監(jiān)聽USB接口的方式,將線路中的數(shù)據(jù)流旁路出來,然后按照USB總線協(xié)議格式解析數(shù)據(jù)包,以此獲取USB接口設(shè)備與主機的交互數(shù)據(jù)。部分具有身份認證功能的設(shè)備如認證key、加密U盤等,在使用過程中需要輸入賬號密碼等敏感信息,如果在交互過程中沒有對數(shù)據(jù)進行保護,則可能導(dǎo)致關(guān)鍵信息的泄露。
USB功能驅(qū)動由開發(fā)者編寫,實現(xiàn)了USB設(shè)備與主機之間通信的基本操作。由圖2可知,在USB驅(qū)動結(jié)構(gòu)層次中,USB功能驅(qū)動位于HCD上方,不與實際的硬件打交道,而USB功能驅(qū)動實現(xiàn)對硬件設(shè)備的控制是通過向USBD發(fā)送包含URB的IRP來實現(xiàn)的。
URB作為描述與USB設(shè)備通信所用的基本載體和核心數(shù)據(jù)結(jié)構(gòu),根據(jù)驅(qū)動的需要發(fā)送或接受的數(shù)據(jù)。USB設(shè)備中的每個端點都會處理一個URB隊列,當(dāng)URB被USB設(shè)備驅(qū)動創(chuàng)建后,承載了主機與USB接口產(chǎn)品的指令數(shù)據(jù),會被安排給USB設(shè)備的特定端點。
因此,實現(xiàn)監(jiān)聽USB接口的一種方式是在設(shè)備進行敏感數(shù)據(jù)操作時,采用軟件或硬件的方式旁路出操作系統(tǒng)發(fā)送給驅(qū)動程序的IPR包,然后解析IRP包中承載的URB數(shù)據(jù),根據(jù)上下文即可獲得所需的敏感數(shù)據(jù)。
反編譯技術(shù)通過對低級語言代碼進行分析轉(zhuǎn)化,可以得到等價的高級語言代碼。通過反編譯可以實現(xiàn)對USB接口設(shè)備重要功能函數(shù)的定位和分析,從而獲取相關(guān)的敏感代碼信息。
在USB驅(qū)動體系中,設(shè)備功能驅(qū)動主要負責(zé)處理I/O請求,用戶模式下所有驅(qū)動程序的I/O請求全部由操作系統(tǒng)化為IRP類型的數(shù)據(jù)結(jié)構(gòu),而大部分請求是在派遣函數(shù)(DispatchFunction)中處理的。
IRP的基本屬性包括MajorFunction和MinorFunction,分別記錄了IRP的主類型和子類型。驅(qū)動程序在接收到不同類型的IRP后,操作系統(tǒng)會根據(jù)MajorFunction將IRP分發(fā)到不同的派遣函數(shù)中。在派遣函數(shù)中IRP得到處理,同時也可以確定這個IRP屬于哪種MinorFunction。
對具有認證、加密及交互等功能函數(shù)的USB接口設(shè)備,可以采用反編譯軟件對驅(qū)動和dll等文件進行反編譯,通過分析反編譯后的源代碼或偽代碼,以此獲得目標(biāo)程序中派遣函數(shù)或關(guān)鍵處理函數(shù)的信息如函數(shù)名、參數(shù)值、處理邏輯及輸入輸出路徑等,為后續(xù)的數(shù)據(jù)讀取、權(quán)限控制等做準(zhǔn)備。
當(dāng)USB接口設(shè)備與主機進行通信時,通過攔截交互的數(shù)據(jù)包并對數(shù)據(jù)包進行篡改,可能會破壞設(shè)備的正常功能;或者采用構(gòu)造異常數(shù)據(jù)、重放指令數(shù)據(jù)包的方式,使USB接口產(chǎn)品接收到錯誤的指令,則可能返回部分敏感信息,從而實現(xiàn)對USB接口設(shè)備的攻擊。
IRP傳輸時首先會被傳遞到設(shè)備棧最頂層的地方,然后逐步傳遞到下面的驅(qū)動程序。操作系統(tǒng)在構(gòu)造設(shè)備棧時,I/O管理器可以使一個設(shè)備對象附加到另一個初始驅(qū)動程序創(chuàng)建的設(shè)備對象上,與初始設(shè)備對象相關(guān)的驅(qū)動程序決定的IRP,也將被發(fā)送到附加的設(shè)備對象相關(guān)的驅(qū)動程序上,這個被附加的驅(qū)動程序稱為過濾驅(qū)動程序。
過濾驅(qū)動可以在設(shè)備棧的任何層次中插入,過濾驅(qū)動創(chuàng)建的關(guān)鍵代碼為Device類。其中,AddDevice函數(shù)構(gòu)造過濾器的實例,將創(chuàng)建的設(shè)備通過IoAttachDeviceToDeviceStack綁定到被過濾的設(shè)備上。對應(yīng)不同的過濾功能,需要攔截的IRP也不同。在這個類里通過把過濾器插入設(shè)備棧實現(xiàn)IRP的攔截功能,進而可以使用自定義的完成例程來實現(xiàn)特定的功能。
因此,可以通過在USB接口設(shè)備的功能驅(qū)動上添加過濾驅(qū)動,使用過濾驅(qū)動程序來檢查、修改和完成它接收到的IRP,或者構(gòu)造自己的IRP,從而達到修改數(shù)據(jù)的目的,實現(xiàn)對USB接口產(chǎn)品的有效攻擊測試。
對于具備USB接口的主機類設(shè)備,可以通過控制用戶的鍵盤獲取操作權(quán)限。采用人機接口設(shè)備(Human Interface Device,HID)攻擊可以將一個USB接口設(shè)備模擬成為鍵盤,讓主機將其識別為鍵盤類型,然后可以對主機進行腳本模擬按鍵攻擊[6]。
HID攻擊屬于物理層面攻擊。在驅(qū)動程序中,所有HID定義的設(shè)備驅(qū)動程序提供了對應(yīng)數(shù)據(jù)類型和格式的自我描述包,計算機上的HID驅(qū)動程序可以解析數(shù)據(jù)和實現(xiàn)數(shù)據(jù)I/O與應(yīng)用程序功能的動態(tài)關(guān)聯(lián)。
由于一般主機對HID設(shè)備缺少嚴(yán)格的檢測措施,只是簡單識別設(shè)備類型(HID設(shè)備標(biāo)識符),計算機無法區(qū)分哪些是合法用戶設(shè)備,哪些是惡意設(shè)備。通過插入帶有攻擊代碼的USB設(shè)備,隨著惡意代碼的加載執(zhí)行,便可實現(xiàn)HID攻擊。所以,通過修改設(shè)備反饋信息讓電腦將其他設(shè)備誤認為HID設(shè)備,就可以利用計算機和用戶輸入的外圍設(shè)備之間的基本信任實現(xiàn)攻擊,從而獲取控制權(quán)限。
結(jié)合針對USB接口的多種攻擊測試手段,相應(yīng)的安全檢測方法可以從以下幾個方面開展。
檢測數(shù)據(jù)傳輸過程是否加密的方法可以通過采用Bushound、Usbtrace等USB接口監(jiān)聽軟件,或者USB協(xié)議分析儀等硬件設(shè)備捕獲USB設(shè)備與USB主機之間的交互信息。
開展安全測試時,首先開啟監(jiān)聽工具,插入被測設(shè)備。待主機上的應(yīng)用程序輸入賬號密碼等敏感信息時,監(jiān)聽工具旁路線路上的通信數(shù)據(jù)包,然后將數(shù)據(jù)進行分析比對,若發(fā)現(xiàn)旁路數(shù)據(jù)與輸入數(shù)據(jù)一致,則說明該USB設(shè)備存在明文數(shù)據(jù)傳輸?shù)碾[患。
檢測數(shù)據(jù)存儲過程是否加密的方法可以通過讀寫USB接口設(shè)備的存儲空間驗證。首先讀取USB產(chǎn)品的存儲空間數(shù)據(jù),寫入特定數(shù)據(jù)后再次讀取存儲空間,最后比對前后存儲空間數(shù)據(jù)列表,驗證是否存在可識別的輸入指令。若發(fā)現(xiàn)一致的數(shù)據(jù),則說明該USB接口設(shè)備存在敏感數(shù)據(jù)明文存儲的隱患。
檢測敏感文件保護可以通過查看設(shè)備軟件是否采取了反逆向工程技術(shù),防范攻擊者對設(shè)備文件的反編譯分析。測試過程中可以采用IDA等反編譯軟件對驅(qū)動和dll等文件進行反編譯,通過分析反編譯的文件代碼,查看是否可以獲取到如加密函數(shù)、數(shù)據(jù)存儲位置、參數(shù)設(shè)置等一些敏感代碼的信息。若未進行反編譯處理,則說明該USB接口設(shè)備存在敏感數(shù)據(jù)泄露的隱患。
檢測USB接口設(shè)備能否正確應(yīng)對錯誤的指令數(shù)據(jù)。開展測試時,通過采用過濾驅(qū)動掛載的方式篡改USB接口設(shè)備的通信數(shù)據(jù),并觀察該設(shè)備的反應(yīng)。若篡改數(shù)據(jù)可導(dǎo)致設(shè)備產(chǎn)生不正常的響應(yīng),則說明該設(shè)備未對錯誤信息進行有效處理。
檢測USB接口設(shè)備能否正確應(yīng)對重放的指令數(shù)據(jù)。采用過濾驅(qū)動軟件對USB接口設(shè)備的通信數(shù)據(jù)進行捕獲和重放,并觀察該設(shè)備的反應(yīng)。若重放數(shù)據(jù)能導(dǎo)致USB接口設(shè)備再次返回相同的敏感數(shù)據(jù),則說明該USB設(shè)備未對重放信息進行有效處理。
檢測USB接口設(shè)備能否識別并阻止惡意設(shè)備。當(dāng)插入外部設(shè)備時,查看被測設(shè)備能否通過在系統(tǒng)的安全事件日志中收集相應(yīng)事件,并通過分析設(shè)備名稱和ID識別惡意設(shè)備。若未對外部設(shè)備的信息進行判斷,則說明該USB接口設(shè)備不能識別惡意設(shè)備。
具有敏感數(shù)據(jù)傳輸需求的USB接口設(shè)備應(yīng)在傳輸過程中對數(shù)據(jù)進行加密處理。采用認證協(xié)議或者加密算法對需要傳輸?shù)年P(guān)鍵信息進行處理,保證數(shù)據(jù)包即使被攻擊方捕獲也無法從中獲取敏感數(shù)據(jù)。
具有敏感數(shù)據(jù)存儲需求的USB接口設(shè)備應(yīng)在存儲過程中對數(shù)據(jù)進行加密處理。采用加密算法對需要存儲的敏感信息進行加密,使得攻擊方無法通過讀取地址空間的方式獲取敏感數(shù)據(jù)。
具有敏感信息交互功能的USB接口設(shè)備的相關(guān)代碼文件應(yīng)進行安全加固。通過加殼、混淆等技術(shù)手段對相關(guān)文件進行保護,使得攻擊方無法通過反編譯、脫殼的方式,利用設(shè)備文件獲取敏感代碼信息。
USB接口設(shè)備應(yīng)具備判斷并處理異常數(shù)據(jù)的能力。通過完善USB接口產(chǎn)品對異常指令的處理機制,使得攻擊方在發(fā)送異常數(shù)據(jù)時,產(chǎn)品能夠做出正確的響應(yīng),避免進入異常狀態(tài)。
USB接口設(shè)備應(yīng)具備判斷并處理重放數(shù)據(jù)的能力。通過采用時間戳、序列號等方式對數(shù)據(jù)包進行保護,使得攻擊方在發(fā)送相同數(shù)據(jù)包時,USB接口產(chǎn)品能夠根據(jù)標(biāo)志屏蔽惡意數(shù)據(jù)包。
隨著USB接口的廣泛應(yīng)用,相關(guān)設(shè)備面臨的安全形勢越來越嚴(yán)峻。本文分析了針對USB接口的多種攻擊方法及原理,并提出了相應(yīng)的安全測試手段和防御途徑,可為后續(xù)USB接口安全測試工具的研究和測試工作的開展提供指引。