張乃珩
(紐卡斯?fàn)柎髮W(xué),紐卡斯?fàn)朜E1 7RV,英國(guó))
統(tǒng)一串行總線(Universal Serial Bus,USB)協(xié)議誕生二十多年以來(lái)已經(jīng)得到了極為廣泛的應(yīng)用,采用USB協(xié)議的各種USB 設(shè)備已經(jīng)遍布社會(huì)生活中的方方面面. 然而,USB 設(shè)備的安全問(wèn)題卻并未得到足夠重視.隨著主機(jī)安全防護(hù)機(jī)制的增強(qiáng),以及各類(lèi)殺毒軟件、入侵檢測(cè)系統(tǒng)的不斷發(fā)展和成熟,基于軟件層面實(shí)現(xiàn)攻擊的難度越來(lái)越高. 因此,越來(lái)越多的攻擊者已經(jīng)開(kāi)始將攻擊的對(duì)象轉(zhuǎn)向硬件和固件,而USB設(shè)備以其重要性和應(yīng)用的廣泛性已經(jīng)成為攻擊者的重要目標(biāo).
USB 設(shè)備從最開(kāi)始僅僅作為惡意程序的傳播媒介(例如Stuxnet[1]、Conficker[2]、Flame[3]),到定制化的USB HID攻擊[4-5],再到只需篡改設(shè)備固件即可實(shí)現(xiàn)的BadUSB攻擊[6-7],這些攻擊的隱蔽性越來(lái)越強(qiáng)、危害性越來(lái)越大[8].
BadUSB 攻擊中,惡意USB 設(shè)備注冊(cè)為多種設(shè)備類(lèi)型,從而實(shí)現(xiàn)在主機(jī)上執(zhí)行某些隱蔽操作,例如大黃鴨測(cè)試工具[5],一個(gè)USB閃存將自己注冊(cè)為存儲(chǔ)設(shè)備和鍵盤(pán),從而隱蔽的鍵入惡意腳本. 但是由于主機(jī)以及各類(lèi)安全防護(hù)軟件都無(wú)法對(duì)USB設(shè)備固件進(jìn)行掃描檢測(cè),因此目前均無(wú)法防御這類(lèi)攻擊. 除了USB閃存,其他任何通過(guò)USB通信的設(shè)備都可能變成一個(gè)BadUSB,從而對(duì)連接的主機(jī)實(shí)施攻擊.
BadUSB攻擊實(shí)現(xiàn)的根本原因在于USB協(xié)議的枚舉過(guò)程缺乏有效的訪問(wèn)控制[9],使得主機(jī)對(duì)USB設(shè)備無(wú)條件信任. 現(xiàn)有的BadUSB攻擊防御方法非常匱乏. IronKey使用簽名固件來(lái)驗(yàn)證USB設(shè)備固件的可信,但成本較高,且面臨設(shè)備制造商以及秘鑰不可靠的問(wèn)題[10];Kells通過(guò)證明主機(jī)完整性來(lái)保護(hù)USB存儲(chǔ)設(shè)備[11];文獻(xiàn)[12]和文獻(xiàn)[13]增加了對(duì)USB 設(shè)備的訪問(wèn)控制,但仍不能防止USB 設(shè)備向主機(jī)注入數(shù)據(jù);文獻(xiàn)[14]采用一種將USB端口號(hào)與設(shè)備類(lèi)別ID信息綁定的管控策略,但不能解決具有多個(gè)接口的復(fù)合設(shè)備;文獻(xiàn)[15]提出了一種針對(duì)USB 驅(qū)動(dòng)的漏洞分析方法,在驅(qū)動(dòng)層對(duì)USB 設(shè)備進(jìn)行了安全加固;文獻(xiàn)[16]提出了一種USB 防火墻的思路,但是并沒(méi)有給出具體的實(shí)現(xiàn)方式;GoodUSB 實(shí)現(xiàn)了接口粒度的USB 設(shè)備訪問(wèn)控制,但它在內(nèi)核層實(shí)現(xiàn),而由于USB 設(shè)備直接和內(nèi)核通信,因此存在被BadUSB 攻擊繞過(guò)的可能[9];USBFILTER 基于對(duì)USB 數(shù)據(jù)包的分析過(guò)濾,實(shí)現(xiàn)了更細(xì)粒度的USB 設(shè)備訪問(wèn)控制,但該方法同樣實(shí)現(xiàn)在內(nèi)核層,易被攻擊者破壞或繞過(guò)[17].
針對(duì)現(xiàn)有方法存在的問(wèn)題,本文提出一種基于Hypervisor的BadUSB攻擊防御方法. 該方法通過(guò)對(duì)內(nèi)核中USB設(shè)備枚舉過(guò)程的詳細(xì)分析,確定USB枚舉過(guò)程的核心環(huán)節(jié),并通過(guò)底層部署的Hypervisor實(shí)現(xiàn)對(duì)上層內(nèi)核中關(guān)鍵操作的監(jiān)控,實(shí)時(shí)監(jiān)測(cè)發(fā)現(xiàn)任何USB設(shè)備的連接行為,獲取USB設(shè)備的詳細(xì)信息,并通過(guò)發(fā)出提示信息的方式實(shí)時(shí)通知用戶,然后基于用戶命令或者事先構(gòu)建的USB 設(shè)備訪問(wèn)控制策略做出允許或禁止USB設(shè)備繼續(xù)連接的決定,從而有效檢測(cè)未知USB設(shè)備的隱蔽接入,防御通過(guò)申請(qǐng)額外接口實(shí)現(xiàn)的BadUSB攻擊. 同時(shí)由于采用基于Hypervisor的監(jiān)控方式,監(jiān)控機(jī)制的可靠性大大增強(qiáng).
本文方法架構(gòu)如圖1所示,該方法由監(jiān)控模塊、虛擬機(jī)自?。╒irtual Machine Introspection,VMI)模塊、信息交互模塊、配置管理模塊、日志和策略庫(kù)六個(gè)模塊構(gòu)成,其中監(jiān)控模塊、VMI模塊和策略庫(kù)位于Hypervisor中,其他模塊位于用戶空間.
圖1 總體架構(gòu)Fig.1 Overall architecture
監(jiān)控模塊負(fù)責(zé)實(shí)現(xiàn)對(duì)USB設(shè)備枚舉過(guò)程的監(jiān)控,實(shí)時(shí)檢測(cè)主機(jī)上是否有新的USB設(shè)備接入,并中斷設(shè)備的枚舉過(guò)程. VMI模塊用于分析出接入的USB設(shè)備的各類(lèi)信息,獲取該設(shè)備的完整描述,包括設(shè)備ID、生產(chǎn)商、申請(qǐng)的接口類(lèi)型等. 然后,監(jiān)控模塊檢索策略庫(kù)中是否存在針對(duì)該設(shè)備的訪問(wèn)策略:如存在,監(jiān)控模塊則基于訪問(wèn)策略中是否允許該設(shè)備連接做出相應(yīng)決定并通知用戶;如不存在,則將正在嘗試接入的USB設(shè)備的信息反饋給信息交互模塊,由用戶基于其對(duì)該設(shè)備的認(rèn)知和分析確定是否允許該設(shè)備的接入,并將用戶針對(duì)該設(shè)備的決策作為一個(gè)新的訪問(wèn)控制策略存入策略庫(kù). 除了上述方式生成策略庫(kù)外,策略庫(kù)還可以通過(guò)配置管理模塊直接進(jìn)行操作,便于用戶實(shí)現(xiàn)對(duì)接入U(xiǎn)SB設(shè)備的靈活配置和管理. 日志模塊則負(fù)責(zé)存儲(chǔ)各種事件信息,包括USB設(shè)備接入時(shí)間、設(shè)備屬性信息、申請(qǐng)的接口信息以及最終的管控操作信息等,為安全審計(jì)提供重要依據(jù).
以下將深入討論上述模塊在實(shí)現(xiàn)過(guò)程中的關(guān)鍵問(wèn)題和解決方法.
2.1.1 USB枚舉過(guò)程及其脆弱性 在USB協(xié)議的枚舉階段,駐留在主機(jī)操作系統(tǒng)內(nèi)的USB主機(jī)控制器發(fā)起一系列查詢以發(fā)現(xiàn)關(guān)于設(shè)備功能的信息并加載相應(yīng)驅(qū)動(dòng). 而B(niǎo)adUSB攻擊的根本原因是在USB協(xié)議的枚舉階段缺乏訪問(wèn)控制. 本節(jié)中以Linux系統(tǒng)為例深入分析了整個(gè)枚舉過(guò)程的實(shí)現(xiàn)機(jī)制,如圖2所示.
圖2 USB設(shè)備枚舉過(guò)程Fig.2 USB device enumeration process
為了實(shí)現(xiàn)USB設(shè)備的熱插拔,Linux內(nèi)核中有守護(hù)進(jìn)行hub_thread來(lái)監(jiān)控usb root hub的狀態(tài)變化. 當(dāng)有新的USB 設(shè)備接入主機(jī)時(shí),hub_thread 線程激活,同時(shí)會(huì)調(diào)用hub_events 函數(shù)來(lái)完成對(duì)接入U(xiǎn)SB 設(shè)備的處理. hub_events函數(shù)最終調(diào)用usb_enumerate_device 函數(shù)來(lái)完成設(shè)備的枚舉,其中獲取設(shè)備接口描述的操作由函數(shù)usb_get_configuration完成. 枚舉完成后,主機(jī)基于設(shè)備申請(qǐng)的接口來(lái)加載所需要的各類(lèi)驅(qū)動(dòng)程序,每一個(gè)接口實(shí)現(xiàn)一個(gè)具體的功能并由操作系統(tǒng)中的一個(gè)設(shè)備驅(qū)動(dòng)程序提供服務(wù).
在枚舉過(guò)程中,如果一個(gè)USB設(shè)備是惡意的(例如BadUSB),由于主機(jī)在枚舉過(guò)程中未部署任何的安全防護(hù)機(jī)制,此時(shí)該設(shè)備即可按攻擊的需要申請(qǐng)?zhí)囟ǖ慕涌冢ɡ鏗ID接口等),而一旦操作系統(tǒng)為該接口加載了相應(yīng)的驅(qū)動(dòng)程序,該設(shè)備即可利用其額外申請(qǐng)的接口實(shí)施相應(yīng)操作,例如利用HID接口模擬鍵盤(pán)敲擊等,從而達(dá)到對(duì)主機(jī)進(jìn)行攻擊的目的.
2.1.2 基于Hypervisor 的監(jiān)控方法 為了彌補(bǔ)主機(jī)在應(yīng)對(duì)USB 設(shè)備枚舉過(guò)程中的脆弱性,增加部署針對(duì)USB設(shè)備的訪問(wèn)控制機(jī)制,首先必須能夠在有USB設(shè)備接入事件發(fā)生時(shí),實(shí)時(shí)監(jiān)控到該類(lèi)事件的發(fā)生,并能夠獲取到設(shè)備的各類(lèi)信息來(lái)為下一步?jīng)Q策提供依據(jù).
在2.1.1的基礎(chǔ)上,我們進(jìn)一步對(duì)獲取USB設(shè)備描述符的過(guò)程,即函數(shù)usb_get_configuration進(jìn)行了分析,它的執(zhí)行過(guò)程如圖3所示,首先獲取設(shè)備申請(qǐng)的配置數(shù)量,然后通過(guò)一個(gè)循環(huán)來(lái)獲取每個(gè)接口所對(duì)應(yīng)的描述符,每次循環(huán)執(zhí)行如下操作:首先調(diào)用usb_get_descriptor函數(shù)讀取USB_DT_CONFIG,從而分析得出該接口的描述符總長(zhǎng)度;然后再次調(diào)用usb_get_descriptor獲取全部的描述符;最后調(diào)用usb_parse_configuration函數(shù)分析獲得的描述符信息.
通過(guò)上述分析可知,每個(gè)接口對(duì)應(yīng)的描述符獲取完成后,都會(huì)調(diào)用usb_parse_configuration 進(jìn)行分析,此時(shí)內(nèi)存中已經(jīng)保存了全部的關(guān)于該接口的描述符信息. 另外,通過(guò)分析整個(gè)Linux內(nèi)核代碼,usb_parseconfiguration 函數(shù)只在上述情況下被調(diào)用. 因此通過(guò)監(jiān)控內(nèi)核函數(shù)usb_parse_configuration 的執(zhí)行即可獲得以下信息:①此時(shí)一個(gè)接口的全部描述符已經(jīng)從設(shè)備讀取到內(nèi)存中. 此時(shí)可以通過(guò)內(nèi)存得到所有訪問(wèn)控制需要的設(shè)備信息. ②USB設(shè)備申請(qǐng)的接口數(shù)量. 記錄該函數(shù)在一次設(shè)備枚舉過(guò)程中執(zhí)行的總次數(shù)即為接入的USB設(shè)備所申請(qǐng)的接口數(shù)量. 基于上述考慮,本文選擇通過(guò)監(jiān)控內(nèi)核函數(shù)usb_parse_configuration 的調(diào)度執(zhí)行來(lái)實(shí)現(xiàn)對(duì)USB設(shè)備枚舉過(guò)程的監(jiān)控和設(shè)備信息的獲取.
圖3 Usb_get_descriptor函數(shù)執(zhí)行流程Fig.3 Execution flow of the usb_get_descriptor function
為了實(shí)現(xiàn)在Hypervisor 中監(jiān)控內(nèi)核函數(shù)usb_parse_configuration,本文參考文獻(xiàn)[18]中提出的方法,采用一種陷入指令植入的方式實(shí)現(xiàn). 該方法以具有相同執(zhí)行長(zhǎng)度的vmcall 指令替換掉要監(jiān)控的目標(biāo)內(nèi)核函數(shù)入口處的“push ebp;mov esp,ebp;”. 由于vmcall 指令是一個(gè)無(wú)條件陷入指令,因此當(dāng)修改后的內(nèi)核函數(shù)再次被調(diào)用執(zhí)行時(shí),就會(huì)因vmcall指令而陷入Hypervisor中. 然后,監(jiān)控模塊分析陷入事件發(fā)生時(shí)指令寄存器IP 的值,如果該值與要監(jiān)控的內(nèi)核函數(shù)的入口地址一致,即可判斷此次陷入是由于該函數(shù)的執(zhí)行導(dǎo)致的.此時(shí)即可在Hypervisor中實(shí)現(xiàn)對(duì)該事件的相應(yīng)處理. 最后,如果需要返回客戶機(jī)繼續(xù)執(zhí)行之前的函數(shù),則在Hypervisor中模擬執(zhí)行被vmcall替換的“push ebp;mov esp,ebp;”,然后返回客戶機(jī)即可.
當(dāng)Hypervisor 監(jiān)控到內(nèi)核函數(shù)usb_parse_configuration 執(zhí)行時(shí),上層系統(tǒng)已經(jīng)完成了針對(duì)一個(gè)接口描述符的完全獲取. 此時(shí),為了明確當(dāng)前要連接的USB 設(shè)備的詳細(xì)信息并為后續(xù)訪問(wèn)控制提供依據(jù),必須在Hypervisor中獲取存放在客戶機(jī)內(nèi)存中的USB設(shè)備相關(guān)的描述符信息并進(jìn)行解析.
2.2.1 USB設(shè)備信息獲取 USB設(shè)備信息存儲(chǔ)在描述符中,主要包括USB設(shè)備描述符、配置描述符、接口描述符和端口描述符等. 設(shè)備可以有多個(gè)配置,配置可以有一個(gè)或多個(gè)接口,接口可以有一個(gè)或多個(gè)設(shè)置,接口是端點(diǎn)的集合,而USB設(shè)備驅(qū)動(dòng)即綁定到USB接口上. 基于對(duì)BadUSB攻擊實(shí)現(xiàn)機(jī)制的分析,本文的USB設(shè)備信息獲取主要針對(duì)設(shè)備描述符和接口描述符.
通過(guò)設(shè)備描述符可以獲得設(shè)備描述符類(lèi)型(例如0x00表示使用接口描述符中提供的類(lèi),0x02b表示通信類(lèi)設(shè)備等)、設(shè)備廠商編號(hào)、產(chǎn)品編號(hào)、設(shè)備出廠編號(hào)等信息,而獲取接口描述符則可以獲得接口描述符類(lèi)型、接口編號(hào)、接口類(lèi)型等信息. 根據(jù)接口類(lèi)型信息即可知道接入的USB 設(shè)備所要申請(qǐng)的接口類(lèi)型,例如0x02表示通信類(lèi)接口,0x03表示HID接口,而0x08即表示大數(shù)據(jù)存儲(chǔ)類(lèi)接口等. 這些設(shè)備描述符信息和接口描述符信息是對(duì)USB設(shè)備進(jìn)行訪問(wèn)控制和防御BadUSB攻擊的關(guān)鍵.
通過(guò)2.1.2可知,在usb_parse_configuration 函數(shù)執(zhí)行時(shí),設(shè)備申請(qǐng)的其中一個(gè)接口的描述符信息已經(jīng)被讀入內(nèi)存中,而此時(shí)分析整個(gè)枚舉過(guò)程和usb_parse_configuration 函數(shù)的定義(如圖4 所示)可知,該函數(shù)的第1個(gè)參數(shù)dev所對(duì)應(yīng)的usb_device結(jié)構(gòu)中即包含了設(shè)備描述符,第4個(gè)參數(shù)buffer中即為接口描述符信息,第5 個(gè)參數(shù)size即為buffer的大小. 因此,要獲取設(shè)備描述符和接口描述符只需獲取usb_parse_configuration函數(shù)的參數(shù)并讀取對(duì)應(yīng)地址處的內(nèi)容即可.
圖4 usb_parse_configuration函數(shù)定義Fig.4 The definition of the usb_parse_configuration function
基于對(duì)函數(shù)調(diào)用原理的分析,函數(shù)參數(shù)先于ebp 壓棧,而由于vmcall 指令替換了“push ebp;mov esp,ebp;”指令,因此函數(shù)陷入時(shí),棧頂指針正好指向最后一個(gè)參數(shù)的地址,此時(shí)基于函數(shù)參數(shù)入棧規(guī)則和參數(shù)長(zhǎng)度,通過(guò)棧頂指針進(jìn)行偏移即可獲得dev和buffer參數(shù)的地址以及buffer的長(zhǎng)度,同時(shí)計(jì)算出dev對(duì)應(yīng)內(nèi)核數(shù)據(jù)結(jié)構(gòu)usb_device的長(zhǎng)度,最后只需通過(guò)讀存操作即可成功獲取到USB設(shè)備的設(shè)備描述符和接口描述符.
2.2.2 USB設(shè)備信息重構(gòu) Hypervisor和客戶機(jī)之間存在語(yǔ)義鴻溝,因此Hypervisor并不能直接理解讀取到的客戶機(jī)內(nèi)存中的內(nèi)容. 為了從讀取的內(nèi)容中恢復(fù)出當(dāng)前USB設(shè)備的設(shè)備描述符和接口描述符信息,必須通過(guò)VMI模塊對(duì)獲取到的內(nèi)存數(shù)據(jù)進(jìn)行重構(gòu).
參考內(nèi)核中相關(guān)數(shù)據(jù)結(jié)構(gòu)的定義,我們?cè)贖ypervisor中重構(gòu)了usb_device和usb_interface_descriptor數(shù)據(jù)結(jié)構(gòu),并以它們?yōu)榛A(chǔ)分別對(duì)獲取到的dev和buffer中的內(nèi)容進(jìn)行解析,最終成功解析出設(shè)備和接口描述中的各項(xiàng)信息.
2.3.1 管控策略的制定 通過(guò)對(duì)USB 枚舉過(guò)程的監(jiān)控以及對(duì)USB 設(shè)備信息的提取,Hypervisor 已經(jīng)能夠分析出當(dāng)前要連接的設(shè)備的各類(lèi)屬性信息、申請(qǐng)的所有接口類(lèi)型的信息等. 如何基于這些信息判斷一個(gè)USB設(shè)備是否是惡意的,是防御BadUSB 攻擊研究中的重要挑戰(zhàn),但目前并沒(méi)有完全可靠的方法來(lái)解決這個(gè)問(wèn)題. 因?yàn)椴煌腢SB設(shè)備往往需要不同的接口,一個(gè)USB設(shè)備也有可能需要申請(qǐng)多個(gè)接口. 例如,一個(gè)USB閃存設(shè)備(例如U盤(pán))一般只需要一個(gè)大數(shù)據(jù)存儲(chǔ)類(lèi)接口,如果發(fā)現(xiàn)該設(shè)備還申請(qǐng)了HID接口,即可認(rèn)定為可疑設(shè)備,例如典型的BadUSB攻擊[5]. 但是,對(duì)于復(fù)合USB設(shè)備,例如耳機(jī)、智能手機(jī)等,在正常情況下就需要申請(qǐng)HID等多種接口,此時(shí)不能簡(jiǎn)單地以是否申請(qǐng)了HID等接口作為判斷設(shè)備是否安全的依據(jù).
針對(duì)該問(wèn)題,本文方法采用一種基于用戶認(rèn)知的USB設(shè)備訪問(wèn)控制策略,即:由用戶基于其對(duì)當(dāng)前USB設(shè)備的認(rèn)知,判斷該設(shè)備所申請(qǐng)的接口類(lèi)型是否正常. 上述訪問(wèn)控制策略主要基于這樣一種觀點(diǎn):用戶在使用某個(gè)USB設(shè)備時(shí),知道它是什么類(lèi)型的設(shè)備以及是設(shè)計(jì)用于什么功能和目的的,當(dāng)發(fā)現(xiàn)實(shí)際監(jiān)測(cè)到的設(shè)備信息以及設(shè)備申請(qǐng)的接口信息與預(yù)期功能和表現(xiàn)不一致時(shí),則認(rèn)為這個(gè)設(shè)備可疑. 例如,當(dāng)用戶使用一個(gè)U盤(pán)時(shí),明確知道這個(gè)USB設(shè)備不應(yīng)當(dāng)申請(qǐng)類(lèi)似鍵盤(pán)、鼠標(biāo)設(shè)備會(huì)申請(qǐng)的HID接口,那么當(dāng)發(fā)現(xiàn)一個(gè)U盤(pán)設(shè)備申請(qǐng)了HID接口時(shí),就判定該設(shè)備為可疑設(shè)備,并拒絕該設(shè)備繼續(xù)接入主機(jī).
本文提出的USB設(shè)備的管控策略可以由一個(gè)三元組<D,I,A>來(lái)表示,其中D表示設(shè)備屬性信息,主要包括設(shè)備廠商編號(hào)、產(chǎn)品編號(hào)等信息;I為一個(gè)接口類(lèi)型的集合,例如HID接口、大數(shù)據(jù)存儲(chǔ)類(lèi)接口等;A表示當(dāng)設(shè)備D申請(qǐng)屬于I的接口時(shí)應(yīng)采取的操作,取值為allow或prohibit,分別代表允許和阻止.
2.3.2 基于管控策略的監(jiān)控機(jī)制 基于上述管控策略的監(jiān)控機(jī)制如圖5所示. 當(dāng)Hypervisor監(jiān)控到有USB設(shè)備接入時(shí),通過(guò)內(nèi)存讀取和重構(gòu)獲得當(dāng)前USB設(shè)備的屬性信息和設(shè)備實(shí)際申請(qǐng)的接口信息,然后訪問(wèn)策略庫(kù),查找是否存在與該設(shè)備屬性信息匹配的管控策略,此時(shí)存在以下情況.
1)不存在與該設(shè)備屬性信息匹配的策略:表明該USB設(shè)備是第一次接入本主機(jī),此時(shí)Hypervisor將設(shè)備信息以及其申請(qǐng)的接口信息反饋給用戶,由用戶基于對(duì)設(shè)備的認(rèn)知做出允許或禁止該設(shè)備繼續(xù)連接的決定,并基于用戶的選擇自動(dòng)生成一條針對(duì)該USB設(shè)備的新策略,并存入策略庫(kù).
2)存在與該設(shè)備屬性信息匹配的策略,此時(shí)存在以下兩種情況:①當(dāng)前USB設(shè)備申請(qǐng)的接口類(lèi)型不在匹配的任何策略的I集合中. 表明該USB設(shè)備在本次連接中申請(qǐng)了一個(gè)之前連接中沒(méi)有申請(qǐng)過(guò)的接口,此時(shí)Hypervisor 執(zhí)行(1)中的操作,并特別提示用戶本USB 設(shè)備申請(qǐng)了一個(gè)之前從未申請(qǐng)過(guò)的接口. ②當(dāng)前USB設(shè)備申請(qǐng)的接口類(lèi)型在匹配的某個(gè)策略的I集合中. 如果對(duì)應(yīng)策略的A=allow,則Hypervisor直接允許設(shè)備的繼續(xù)連接;如果對(duì)應(yīng)策略的A=prohibit,則Hypervisor阻止該設(shè)備的繼續(xù)連接.
圖5 基于管控策略的監(jiān)控機(jī)制Fig.5 Monitoring mechanism based on management and control strategy
在Linux 環(huán)境下設(shè)計(jì)實(shí)現(xiàn)了本文提出的基于Hypervisor 的BadUSB 攻擊防御方法的原型系統(tǒng),其中Hypervisor 在開(kāi)源項(xiàng)目BitVisor(https://www.bitvisor.org/)的基礎(chǔ)上設(shè)計(jì)實(shí)現(xiàn).
首先為了監(jiān)控內(nèi)核函數(shù)usb_parse_configuration的調(diào)用,需要替換函數(shù)入口處3個(gè)字節(jié)的指令,為此首先要定位函數(shù)入口地址,這里通過(guò)查找Linux內(nèi)核的符號(hào)表來(lái)定位該函數(shù)的入口地址,并計(jì)算得到對(duì)應(yīng)物理地址. 然后通過(guò)Hypervisor 中的寫(xiě)物理內(nèi)存操作直接將該地址對(duì)應(yīng)物理地址處的3個(gè)字節(jié)的指令(0x5589e5)替換為vmcall指令(0x0f01c1). 另外,為了保證在策略允許設(shè)備繼續(xù)連接的情況下usb_parse_configuration函數(shù)能夠繼續(xù)正常執(zhí)行,在返回客戶機(jī)前還要對(duì)“push ebp;mov esp,ebp;”進(jìn)行仿真.
Hypervisor 中的監(jiān)控模塊在監(jiān)控到usb_parse_configuration 函數(shù)執(zhí)行時(shí),基于2.2.2 中的方法計(jì)算得到該函數(shù)參數(shù)的地址并轉(zhuǎn)化為物理地址. 利用計(jì)算得到的物理地址和Hypervisor中的讀物理內(nèi)存操作實(shí)現(xiàn)對(duì)所有參數(shù)的提取. 然后,通過(guò)在Hypervisor 中重構(gòu)各個(gè)參數(shù)對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu),從而解析處所有參數(shù)的具體含義,最終獲得當(dāng)前設(shè)備的設(shè)備和接口描述符信息. 最后,利用重構(gòu)出來(lái)的設(shè)備屬性信息和接口信息,Hypervisor檢索策略庫(kù)并進(jìn)行2.2.2中描述的后續(xù)處理.
Hypervisor需要在某些情況下向用戶反饋提示信息,為此,在用戶空間設(shè)置一個(gè)守護(hù)進(jìn)程,即信息交互模塊,Hypervisor將提示信息寫(xiě)入特定內(nèi)存空間,守護(hù)進(jìn)程實(shí)時(shí)監(jiān)聽(tīng)該內(nèi)存區(qū)域的內(nèi)容變化,并及時(shí)將信息以圖形界面的方式傳遞給用戶. 同時(shí),由于用戶也需要基于當(dāng)前提示信息和個(gè)人認(rèn)知來(lái)給出禁止或允許設(shè)備執(zhí)行的決定,因此信息交互模塊使用特定寄存器保存用戶的決策信息,并調(diào)用vmcall 指令陷入Hypervisor,監(jiān)控模塊再通過(guò)讀取相應(yīng)寄存器的值來(lái)獲取用戶決策信息. 另外,用戶空間中的配置管理模塊也采用調(diào)用vmcall傳遞參數(shù)的方式為用戶提供一種自主配置管控策略的途徑.
對(duì)本文提出的基于Hypervisor的BadUSB攻擊防御方法的原型系統(tǒng)進(jìn)行了測(cè)試和分析. 測(cè)試軟硬件環(huán)境如下:客戶機(jī)操作系統(tǒng)為32位的Ubuntu12.04,內(nèi)存16 G,CPU為Intel(R)Core(TM)i5-2430M CPU@2.4 GHz.
為了評(píng)估方法的有效性,從兩個(gè)角度進(jìn)行了測(cè)試:一是測(cè)試本文設(shè)計(jì)實(shí)現(xiàn)的監(jiān)控方法能否成功監(jiān)測(cè)到各類(lèi)USB設(shè)備的接入,并成功提取出USB設(shè)備的各類(lèi)屬性信息和其申請(qǐng)的接口信息;二是測(cè)試本文提出的方法能否有效防御典型的BadUSB攻擊.
為了進(jìn)行第一個(gè)測(cè)試,分別以常見(jiàn)的USB設(shè)備為測(cè)試對(duì)象,將這些USB設(shè)備分別接入到主機(jī)上,驗(yàn)證該系統(tǒng)是否能夠成功監(jiān)測(cè)到有USB設(shè)備的接入和獲取到對(duì)應(yīng)設(shè)備的制造商、序列號(hào)、申請(qǐng)的接口類(lèi)型等信息.測(cè)試結(jié)果如表1所示.
表1 USB設(shè)備監(jiān)控和信息提取測(cè)試Tab.1 USB equipment monitoring and information extraction tests
由表1中的測(cè)試結(jié)果可知,本文提出的基于Hypervisor的USB設(shè)備監(jiān)控機(jī)制能夠有效截獲USB設(shè)備接入主機(jī)后的枚舉過(guò)程,并成功提取出了對(duì)應(yīng)設(shè)備的屬性信息以及其申請(qǐng)的接口的類(lèi)型信息.
為了驗(yàn)證本文方法能夠有效防御BadUSB 攻擊,我們借助Rubber Ducky、BEETLE BadUSB MICRO 開(kāi)發(fā)板和Arduino開(kāi)發(fā)板,分別實(shí)現(xiàn)了多種BadUSB攻擊. 在測(cè)試時(shí),假設(shè)用戶以U盤(pán)的預(yù)期使用這些USB設(shè)備,并在發(fā)現(xiàn)這些設(shè)備申請(qǐng)除大容量存儲(chǔ)接口以外的接口時(shí)拒絕設(shè)備的繼續(xù)接入. 測(cè)試結(jié)果如表2所示.
表2 BadUSB攻擊防御能力測(cè)試Tab.2 BadUSB attacks defense capability tests
在測(cè)試中,所有BadUSB 攻擊都沒(méi)有實(shí)現(xiàn)其攻擊目標(biāo). 監(jiān)控機(jī)制發(fā)現(xiàn)測(cè)試設(shè)備在設(shè)備枚舉階段申請(qǐng)了不允許使用的HID等接口,并依據(jù)訪問(wèn)控制策略直接禁止了這些設(shè)備的繼續(xù)接入. 測(cè)試結(jié)果表明本文方法能夠有效防御BadUSB攻擊.
通過(guò)本文方法的實(shí)現(xiàn)過(guò)程可知,該方法引入的開(kāi)銷(xiāo)主要體現(xiàn)在兩個(gè)方面:一是Hypervisor的引入對(duì)主機(jī)性能的影響,二是監(jiān)控USB設(shè)備的接入過(guò)程而導(dǎo)致的對(duì)正常USB設(shè)備接入過(guò)程的影響.
為了測(cè)試Hypervisor 對(duì)主機(jī)性能的影響,使用LMbench3(http://www.bitmover.com/lmbench/.)作為基準(zhǔn)測(cè)試集,分別對(duì)部署Hypervisor和未部署Hypervisor的系統(tǒng)進(jìn)行測(cè)試,測(cè)試結(jié)果如圖6所示,圖中僅列出了比較有代表性的測(cè)試項(xiàng). 通過(guò)對(duì)所有測(cè)試結(jié)果的分析計(jì)算,Hypervisor引入的總體開(kāi)銷(xiāo)約為27%. 可見(jiàn),Hypervisor引入的開(kāi)銷(xiāo)較大. 下一步我們將通過(guò)研究Hypervisor 的優(yōu)化技術(shù)和輕量級(jí)設(shè)計(jì)方法進(jìn)一步降低Hypervisor的開(kāi)銷(xiāo).
圖6 Hypervisor開(kāi)銷(xiāo)測(cè)試Fig.6 Overhead measurement of the Hypervisor
對(duì)于由于監(jiān)控USB設(shè)備的接入過(guò)程而對(duì)正常USB設(shè)備的影響,這種影響只在接入一個(gè)善意的USB設(shè)備時(shí)存在,當(dāng)判定某個(gè)USB設(shè)備為惡意設(shè)備時(shí),這種影響不在考慮范圍內(nèi). 為了測(cè)試對(duì)善意USB設(shè)備連接主機(jī)過(guò)程的影響,測(cè)試了多個(gè)設(shè)備從插入主機(jī)到可以正常運(yùn)行所需要的時(shí)間開(kāi)銷(xiāo),并且以策略庫(kù)中已經(jīng)存在相應(yīng)的策略為前提,因?yàn)椴呗詭?kù)中不存在匹配策略的情況僅出現(xiàn)在新的USB設(shè)備第一次接入或者有USB設(shè)備申請(qǐng)了新的未曾申請(qǐng)過(guò)的接口時(shí),此時(shí)監(jiān)控模塊要向用戶反饋設(shè)備信息并等待用戶的決策,這個(gè)開(kāi)銷(xiāo)難以度量且影響有限. 在測(cè)試時(shí)間開(kāi)銷(xiāo)時(shí),利用hook機(jī)制在內(nèi)核中實(shí)現(xiàn)一個(gè)監(jiān)控模塊,該模塊監(jiān)控hub_events和device_add函數(shù)調(diào)用,并以這兩個(gè)調(diào)用點(diǎn)之間的執(zhí)行時(shí)間間隔近似作為USB設(shè)備枚舉過(guò)程需要的時(shí)間開(kāi)銷(xiāo),而且每個(gè)設(shè)備測(cè)試30次,取平均時(shí)間作為測(cè)試結(jié)果,最終結(jié)果如圖7所示.
圖7 USB設(shè)備枚舉過(guò)程開(kāi)銷(xiāo)測(cè)試Fig.7 Overhead measurement of USB device enumeration process
由測(cè)試結(jié)果可知,本文方法導(dǎo)致USB 設(shè)備正常枚舉過(guò)程的時(shí)間開(kāi)銷(xiāo)增加了72%. 這個(gè)開(kāi)銷(xiāo)主要來(lái)自于由vmcall 指令執(zhí)行導(dǎo)致的陷入以及陷入后在Hypervisor 中執(zhí)行的一些列操作,尤其是對(duì)客戶機(jī)中相關(guān)內(nèi)存內(nèi)容的讀取和解析,這些訪存操作和解析過(guò)程不可避免地引入較大的時(shí)間開(kāi)銷(xiāo). 但是考慮到該方法僅對(duì)USB設(shè)備連接過(guò)程有影響,而枚舉過(guò)程完成之后不影響USB設(shè)備的正常工作過(guò)程,因此這個(gè)開(kāi)銷(xiāo)是可以接受的.
本文提出了一種基于Hypervisor 的BadUSB 攻擊防御方法. 該方法在充分分析USB 設(shè)備枚舉過(guò)程和特點(diǎn)的基礎(chǔ)上,基于Hypervisor 監(jiān)控關(guān)鍵內(nèi)核函數(shù)usb_parse_configuration,從而實(shí)現(xiàn)了對(duì)USB設(shè)備枚舉過(guò)程的監(jiān)控和分析,并實(shí)現(xiàn)了對(duì)各類(lèi)USB設(shè)備的訪問(wèn)控制. 通過(guò)測(cè)試分析,該方法有效提高了主機(jī)防御BadUSB攻擊的能力,且引入的開(kāi)銷(xiāo)可接受.
本文方法為解決USB設(shè)備管控以及BadUSB攻擊防御問(wèn)題提供了一種新思路. 雖然該方法目前管控的粒度還較大(設(shè)備粒度,發(fā)現(xiàn)某個(gè)可疑接口直接禁掉整個(gè)設(shè)備),且無(wú)法防御設(shè)備模擬攻擊(即將惡意設(shè)備的序列號(hào)等屬性信息修改為某個(gè)合法設(shè)備的信息),但仍然極大地提高了主機(jī)針對(duì)BadUSB攻擊的安全防護(hù)水平. 下一步,將進(jìn)一步優(yōu)化監(jiān)控方法以提高該方法的防御能力和降低它的監(jiān)控開(kāi)銷(xiāo).