宋桂成
(河南省統(tǒng)計局, 河南 鄭州 450018)
傳統(tǒng)BIOS采用匯編語言編寫,編寫難度大,很難對BIOS的功能進行補充,在硬件兼容性、自身安全性以及可擴展性方面存在較多缺陷。隨著時間的推移,傳統(tǒng)BIOS已經(jīng)嚴重制約了計算機的創(chuàng)新。2003年,Intel 設(shè)計并提出新一代固件標準:統(tǒng)一可擴展固件接口[1](Unified Extensible Firmware Interface, UEFI)。與傳統(tǒng)BIOS相比,UEFI全部使用C語言進行編碼,為驅(qū)動和應(yīng)用程序提供了良好的接口規(guī)范,方便廠商根據(jù)需求編寫驅(qū)動程序,具有良好的可擴展性,此外,還提供了健全的文檔規(guī)范和豐富的接口協(xié)議。
然而正是由于UEFI的豐富接口,新的標準為攻擊者編寫惡意驅(qū)動帶來了更多的可能,UEFI固件安全形式變得日益嚴峻。隨著UEFI的應(yīng)用,UEFI變得越來越復雜,更多的安全組織開始對UEFI進行研究。2016年Anibal Sacco和Alfredo Ortega在CanSecWest安全會議上展示了一種UEFI攻擊方式[5]。他們通過向UEFI中植入一小段代碼來獲得計算機系統(tǒng)的控制權(quán)。2017年Alex Matrosov和Eugene Rodionov在Blackhat ASIA安全會議上展示了一種全新的UEFI攻擊技術(shù)[9],他們針對不同固件廠商的固件實現(xiàn)漏洞,向SPI Flash插入一段Rootkit代碼,從而完全獲取受害者計算機的控制權(quán)。在2017年Blackhat Vegas安全會議上[8],Cylance通過逆向分析的技術(shù),針對不同廠商的UEFI引導配置模塊,找出UEFI引導配置的安全漏洞,實現(xiàn)了UEFI引導過程的Rottkit攻擊。2017年,Ulf Frisk針對UEFI的預啟動[9],使用直接內(nèi)存訪問(Direct Memory Access,DMA)技術(shù),通過掛鉤引導服務(wù)函數(shù)SignalEvent(),成功修改操作系統(tǒng)引導程序。對UEFI的安全引導過程進行攻擊。
本文以UEFI開源規(guī)范為基礎(chǔ),針對UEFI安全引導模型進行分析,詳細闡述了可能存在的安全風險以及典型的漏洞利用方法,給出了面向UEFI的典型漏洞利用范式,并提出了SMI信號抑制和Speed Racer兩種基于SPI Flash的漏洞利用方法。
UEFI是Intel為PC固件的體系結(jié)構(gòu)、接口和服務(wù)提出的建議標準[2]。它為操作系統(tǒng)和固件提供了標準接口,能夠在硬件發(fā)生變更時為固件提供準確的信息,保證操作系統(tǒng)的運行不受影響。它在啟動過程的主要功能是:(1) 充當固件可信執(zhí)行的初始節(jié)點,能夠?qū)碳钠渌?jié)點進行完整性校驗;(2) 對硬件進行初始化以及測試工作;(3) 加載執(zhí)行額外的固件模塊;(4) 選擇引導設(shè)備,加載并執(zhí)行操作系統(tǒng)引導程序;(5) 退出UEFI服務(wù),啟動操作系統(tǒng)。
除此之外,UEFI具有強大的可擴展性。UEFI通過模塊化設(shè)計將其功能分為硬件控制部分和操作系統(tǒng)軟件管理部分。其中,主板廠商利用操作系統(tǒng)軟件管理提供的編程接口,根據(jù)自己的需求實現(xiàn)豐富的功能。UEFI的體系架構(gòu),如圖1所示。
圖1 UEFI體系架構(gòu)
從圖中可以看到UEFI與固件、操作系統(tǒng)和操作系統(tǒng)引導程序(UEFI OS Loader)之間的層次關(guān)系。UEFI是操作系統(tǒng)和平臺固件之間的紐帶,它提供系統(tǒng)化的標準方法,能夠加載驅(qū)動并管理他們之間的交互。
UEFI采用模塊化設(shè)計,其系統(tǒng)引導過程包括六個階段,UEFI的啟動流程,如圖2所示。
圖2 UEFI啟動流程
SEC(Security)階段:SEC是UEFI系統(tǒng)開始執(zhí)行的第一階段。它用于處理不同的平臺復位事件。SEC是系統(tǒng)安全的根節(jié)點,為系統(tǒng)啟動固件提供控制節(jié)點。SEC的優(yōu)點在于它可以提供基礎(chǔ)安全錨點,UEFI通過該錨點構(gòu)建完整的安全引導驗證過程。SEC階段運行結(jié)束后找到下一引導進程,并將控制權(quán)進行轉(zhuǎn)交。
PEI(Pre-EFI Initialization)階段:PEI階段是UEFI的核心部分。它由PEI Foundation(PEI基礎(chǔ))和PEIM(初始化模塊)組成,其中初始化模塊是存儲于ROM中以壓縮形式保存的二進制代碼塊,PEI Foundation為初始化模塊提供調(diào)度以及公共核心服務(wù)。PEI階段的主要任務(wù)是對CPU和主存進行初始化,同時將平臺固件信息傳遞給DXE階段。
DXE(Driver Execution Environment)階段:DXE階段主要完成大多數(shù)的系統(tǒng)初始化工作。DXE階段通過HOB(Hand-off Block)查詢平臺相關(guān)信息,并為驅(qū)動程序搭建完整的運行環(huán)境。DXE內(nèi)核提供一系列的啟動時服務(wù)(boot service)和運行時服務(wù)(runtime service),該階段的DXE調(diào)度內(nèi)核對DXE驅(qū)動程序和外部設(shè)備驅(qū)動程序進行枚舉。UEFI允許驅(qū)動程序來源的多樣性,為了保證平臺的完整性與安全性,UEFI必須對固件采取散列和加密認證的方式保障固件的合法性。DXE階段結(jié)束后,將控制權(quán)轉(zhuǎn)交給BDS階段。
BDS(Boot Device Selection)階段:DXE結(jié)束后,BDS階段得以運行。它負責執(zhí)行符合UEFI驅(qū)動模型的所有驅(qū)動,初始化操作系統(tǒng)啟動時所需要的設(shè)備。BDS為用戶提供啟動設(shè)備選擇列表,供用戶對啟動設(shè)備進行設(shè)置和選擇。根據(jù)用戶的選擇,BDS加載執(zhí)行OS Loader,加載操作系統(tǒng)并將控制權(quán)轉(zhuǎn)交給操作系統(tǒng)。
對于攻擊者來說,引導固件是潛在的攻擊目標,面臨著很多威脅。安全問題是UEFI規(guī)范的重中之重,其主要安全機制是Secure Boot[10]。 UEFI安全引導的主要功能是使用加密(數(shù)字簽名和哈希)對UEFI映像進行驗證,用于保證UEFI啟動過程中執(zhí)行固件的合法性。如圖3所示。
圖3 UEFI鏡像驗證過程
UEFI規(guī)范規(guī)定了基于PKI的平臺公鑰基礎(chǔ)設(shè)施,設(shè)置了平臺安全可信鏈密鑰(PK)。一般來說,PK由設(shè)備廠商擁有,可以對平臺的其他信任錨進行更改。
除了PK之外,UEFI安全啟動還維護著三個額外的信任錨數(shù)據(jù)庫:
(1) 密鑰交換密鑰(Key Exchange Key,KEK)數(shù)據(jù)庫;
(2) 已允許簽名(The Allowed signature)數(shù)據(jù)庫DB;
(3) 被禁止數(shù)據(jù)庫(The Forbidden database)數(shù)據(jù)庫DBx。
KEK由設(shè)備廠商擁有,可以對DB或DBx進行修改。DB相當于白名單,存儲著所有受信固件映像的數(shù)字簽名和哈希。如果一個驅(qū)動的哈?;驍?shù)字簽名存在于DB,UEFI便允許系統(tǒng)對該驅(qū)動進行引導。DBx相當于黑名單,存儲著所有不受信任的UEFI映像。對于被加入黑名單的UEFI映像,UEFI拒絕對其加載執(zhí)行。UEFI利用哈希和數(shù)字簽名對UEFI固件映像的來源進行保障。簡而言之,如果無法確認UEFI映像的合法性,該映像將無法得到執(zhí)行。更具體的,如果操作系統(tǒng)啟動引導器(Boot Loader)無法通過認證,則UEFI將無法對操作系統(tǒng)進行引導。
UEFI建立在平臺初始化[11]的標準框架之上,在引導過程中,UEFI遵循著PI(Platform Initialization)規(guī)范。PI規(guī)范允許使用模塊化的方法支持芯片和硬件平臺的初始化,包括系統(tǒng)初始化、系統(tǒng)引導和引導前的特殊配置需求。UEFI可以在系統(tǒng)的任意位置發(fā)現(xiàn)并執(zhí)行文件。這種系統(tǒng)的引導過程包括一系列的階段,每個階段既有自己獨特的優(yōu)勢,也包含著不同的風險。
DXE階段是PI規(guī)范要求的最終階段,該階段由DXE基礎(chǔ)框架、DXE調(diào)度程序和DXE驅(qū)動程序三部分組成。DXE階段使用HOB查詢平臺信息,為驅(qū)動程序提供運行環(huán)境,同時DXE內(nèi)核可以對設(shè)備進行掃描,枚舉驅(qū)動程序。DXE運行結(jié)束后將控制權(quán)轉(zhuǎn)交給BDS階段。
一般來說,驅(qū)動程序與應(yīng)用程序存儲在缺乏保護機制的硬盤上,DXE調(diào)度程序通過輪尋檢測的方式加載驅(qū)動程序。UEFI驅(qū)動程序具有不同來源,為了確保平臺的完整性與安全性,固件的更改必須處于平臺制造商的控制監(jiān)督下。在不同的平臺下,都必須嚴格遵循散列和加密的認證方式。否則,攻擊者便可以通過更換驅(qū)動、感染應(yīng)用程序等手段篡改UEFI驅(qū)動程序,實現(xiàn)UEFI階段的惡意驅(qū)動執(zhí)行。
DXE階段運行結(jié)束后,BDS啟動管理器可以對UEFI驅(qū)動程序進行控制,具有這個階段的控制權(quán)。當BDS啟動管理器進行啟動管理時,會生成UEFI Shell命令,加載OS Loader,同時啟動UEFI驅(qū)動程序。它能夠配置NVRAM變量,利用SPI Flash 接口完成全局控制,同時控制具體哪一個文件被加載。UEFI驅(qū)動程序和相關(guān)信息利用NVRAM變量進行傳遞,同時給出一個可視化列表已備用戶查看。BDS啟動管理器加載NVRAM變量的啟動項,執(zhí)行啟動策略,最終將控制權(quán)轉(zhuǎn)交操作系統(tǒng)。
NVRAM變量保存了UEFI驅(qū)動和應(yīng)用程序的默認加載順序信息。攻擊者可以通過更改該變量的方法對NVRAM變量中的UEFI驅(qū)動和應(yīng)用程序引導路徑進行篡改,將其指向攻擊者已構(gòu)造好的惡意驅(qū)動或應(yīng)用程序。使得UEFI加載并執(zhí)行惡意驅(qū)動,對系統(tǒng)安全造成破壞。NVRAM變量中還存在操作系統(tǒng)加載器OS Loader的存儲路徑,UEFI接口能夠利用OS Loader的存儲路徑進行傳輸信息。在上述的可視化列表中具有對NVRAM變量的查詢和修改的權(quán)限,因此,在受到攻擊時,NVRAM變量中存在的OS Loader路徑信息可能被篡改,這樣當計算機重新啟動后,啟動加載項會由OS Loader變成攻擊程序,使系統(tǒng)受到攻擊,不受用戶的控制。
如前所述,UEFI在DXE階段對UEFI的可執(zhí)行鏡像進行合法性校驗,以確定是否加載執(zhí)行該映像。UEFI的可信數(shù)據(jù)庫DB存放于SPI Flash中,為了防止攻擊者對可信數(shù)據(jù)庫進行更改,SPI Flash采用了多個寄存器對其內(nèi)容進行保護。BIOS_CNTL寄存器和PR[5](Protected Range)寄存器是SPI Flash最主要的兩個保護寄存器。
BIOS_CNTL寄存器提供三個保護位[4],分別是BWE、BLE、SMM_BWP。其中BWE為寫使能位,如果BWE置1,則用戶可以對SPI Flash進行寫操作,如果BWE置0,SPI Flash鎖定無法進行更改。BLE為鎖使能位,用于保證BWE的安全。一旦BLE置1,任何對BWE的操作都會觸發(fā)SMI(System Management Interrupt)中斷,進入CPU的SMM[7]模式。在該模式下,CPU將主動對BWE進行復位操作。SMM_BWP是SMM模式下的寫保護位,對BWE提供更強大的保護。當SMM_BWP置1時,BWE將只能通過SMM模式下的系統(tǒng)進行修改。
保護范圍寄存器PR(Protected Range)同樣可以對Flash芯片進行讀寫保護,PR寄存器共有32bit,它使用基地址(Protected Range Base)與保護范圍偏移(Protected Range Limit)來確定保護范圍。在PR寄存器的保護區(qū)域內(nèi),如果寫使能位被設(shè)置,將無法對SPI Flash保護區(qū)域進行寫操作。同樣,如果讀使能位被設(shè)置,保護區(qū)域?qū)o法進行讀操作。為了防止對PR進行更改,Intel提供HSFS.FLOCKDN ,用于對保護范圍寄存器進行保護。一旦該位被設(shè)置,將無法對PR寄存器進行更改。
雖然SPI Flash的保護機制非常健全,但在實際應(yīng)用中,部分主板和固件廠商為了方便固件的升級和維護,相當一部分的設(shè)備沒有按照保護要求對保護位進行設(shè)置,導致SPI Flash的安全性大大降低。經(jīng)調(diào)查[6],僅有6/8005(0.07%)的設(shè)備對SMM_BWP進行設(shè)置,有4779/5197(92%)的設(shè)備沒有使用PR寄存器。
UEFI使用安全引導機制來確保所有UEFI可執(zhí)行鏡像的合法性,因此UEFI攻擊的主要目標就是UEFI的安全引導驗證機制。本文對現(xiàn)有的SMM和Bootkit兩種UEFI攻擊方法進行了詳細的分析及闡述,針對SPI Flash的讀寫保護機制,提出了SMI信號抑制和Speed Racer兩種新的UEFI攻擊方法。
系統(tǒng)管理模式SMM(System Management Mode)[9]是CPU的一種特殊操作模式,SMM面向系統(tǒng)固件,提供孤立于OS的執(zhí)行環(huán)境,具有訪問全部內(nèi)存和外設(shè)硬件的最高特權(quán)級。SMM模式由SMI中斷觸發(fā),一旦CPU檢測到SMI中斷,將立即保存當前狀態(tài),進入SMRAM空間,執(zhí)行SMRAM私有代碼,進行系統(tǒng)活動控制和功能處理等行為。防止SMRAM被修改的主要機制是設(shè)置D_LCK位,大部分操作平臺在啟動時設(shè)置D_LCK保護位對其進行保護。SMM漏洞是指利用CPU的緩存漏洞對SMRAM進行修改,從而獲取SMM權(quán)限。
攻擊過程,如圖4所示。
圖4 SMM攻擊流程
對于設(shè)置了D_LCK保護位的SMRAM來說,攻擊者可以通過修改SMRAM地址的方法對D_LCK保護位進行繞過。首先,攻擊者采用觸發(fā)SMI中斷的方式加載SMI Handler至CPU緩存區(qū)。修改CPU緩存區(qū)SMI Handler,并再次觸發(fā)SMI中斷,此時被修改的惡意映像將在CPU的緩存區(qū)內(nèi)執(zhí)行。由于遵循UEFI規(guī)范的設(shè)計的部分主板固件代碼允許在SMM模式下運行,攻擊者可以通過SMM漏洞向SMRAM空間注入Rootkits代碼,使得Rootkits代碼永久駐留在主板上,并隨時可以通過SMI中斷激活Rootkits代碼。使用這種方法,Ring0級別的安全軟件也無法對其檢測,即使格式化硬盤也無法將駐留在非易失性存儲器中的Rootkits代碼清除。
Bootkit是指早于操作系統(tǒng)內(nèi)核執(zhí)行的,能夠?qū)Σ僮飨到y(tǒng)內(nèi)核劫持的攻擊技術(shù)。UEFI是計算機加電啟動后首先執(zhí)行的代碼,在UEFI的BDS階段,操作系統(tǒng)引導器獲取控制權(quán),對操作系統(tǒng)進行引導,成功引導操作系統(tǒng)之后,UEFI執(zhí)行ExitBootService函數(shù),并將控制權(quán)轉(zhuǎn)交至操作系統(tǒng)內(nèi)核。攻擊者可以通過Hook ExitBootSerivice函數(shù)的方法,對操作系統(tǒng)內(nèi)核進行劫持。
其攻擊過程,如圖5所示。
圖5 UEFI Bootkit攻擊流程
首先,攻擊者刷寫B(tài)ootkit惡意代碼至UEFI。Bootkit代碼使用Hook技術(shù)掛載ExitBootService函數(shù)。隨后,在系統(tǒng)的正常啟動過程中,擁有控制權(quán)的Bootloader加載操作系統(tǒng)內(nèi)核,并將控制權(quán)轉(zhuǎn)交至ExitBootService函數(shù)。UEFI執(zhí)行ExitBootService函數(shù),Bootkit獲取系統(tǒng)控制權(quán),完成操作系統(tǒng)內(nèi)核劫持功能。
在Intel datasheets[3]中,描述了至少一種抑制SMI中斷的方法。SMI控制使能寄存器中(SMI Control and Enable Register,SMI_EN)包含著GBL_SMI_EN位,Intel對此位的描述如下:當SMI_EN設(shè)置為0,PCH將不再產(chǎn)生SMI中斷信號。當SMI_LOCK被設(shè)置,GBL_SMI_EN無法進行更改。經(jīng)調(diào)查[6]在8 005臺設(shè)備中,有3 216(約40%)臺的設(shè)備沒有對其進行設(shè)置。
對于沒有設(shè)置SMI_LOCK的系統(tǒng),攻擊相對簡單。攻擊過程,如圖6所示。
圖6 SMI信號抑制攻擊流程
假設(shè)攻擊者具備Ring0權(quán)限。首先,攻擊者將GBL_SMI_EN設(shè)置為0臨時禁用SMI,PCH將不再產(chǎn)生SMI信號。之后,設(shè)置BIOS_WE為1,現(xiàn)在可以對未受保護范圍寄存器保護的閃存區(qū)域進行寫入訪問。攻擊者可以繞過保護受信變量的身份驗證方案,通過直接讀寫SPI Flash的方法修改其內(nèi)容。攻擊者可以通過多種方法繞過安全引導機制,對系統(tǒng)的安全造成破壞。本文選擇的方法是在可信數(shù)據(jù)庫DB中插入Bootkit的哈希值。隨后替換合法的Windows啟動引導器并重置系統(tǒng)。在下一次啟動的過程中,由于bootkit已通過可信驗證成為合法映像,UEFI固件加載bootkit并將控制權(quán)轉(zhuǎn)交,實現(xiàn)UEFI層面的惡意代碼執(zhí)行。
當BIOS_CNTL寄存器中的SMM_BWP位不可用時,可以通過產(chǎn)生中斷信號時間差的方法繞過SPI Flash的保護機制。
SPI Flash擁有多個編程位,它們都與閃存的編程操作直接相關(guān)。其中,HSFC(Hardware Sequencing Flash Control)為硬件閃存控制器,它用于控制編程操作的大小和類型。FADDR(Flash Address)為閃存地址寄存器,它用于確定編程操作的目標位置。FDATA(Flash Address)為閃存數(shù)據(jù)寄存器,它用于保存寫操作期間寫入的數(shù)據(jù)以及讀操作期間讀取的數(shù)據(jù)。設(shè)置HSFC寄存器的FGO為1,便可對閃存進行編程操作。
攻擊過程,如圖7所示。
圖7 Speed Racer攻擊流程
攻擊者可以在一個多內(nèi)核的系統(tǒng)中選用一對windows內(nèi)核驅(qū)動程序進行操作[8]。首先,攻擊者設(shè)置一對用戶級代理分別向CPU Core1與CPU Core2發(fā)送IOCTL(Input Output control)信號。當CPU Core1收到IOCTL信號后,立即設(shè)置BIOSWE為0。接著,在BLE保護位觸發(fā)SMI中斷的同時,CPU Core2立即對SPI Flash的寫保護位進行操作。CPU Core2通過設(shè)置HSFC寄存器FGO位為1的方法打開SPI Flash的寫保護,對存儲在SPI Flash中的受信哈希值進行惡意更改。通過這種方法,攻擊者便可在信任數(shù)據(jù)庫中插入惡意驅(qū)動簽名,從而繞過UEFI的安全引導機制。
本文針對統(tǒng)一可擴展固件接口存在的安全隱患問題,對UEFI自身框架和UEFI啟動過程進行分析,提出了三種基于UEFI的攻擊方法。同時在現(xiàn)有的UEFI攻擊理論和漏洞利用技術(shù)的基礎(chǔ)上,利用系統(tǒng)管理模式存在的安全漏洞,通過BootKit、SMI信號抑制和Speed Racer三種方法對SPI Flash的保護機制進行繞過,向存有可信數(shù)據(jù)庫DB的SPI Flash注入惡意驅(qū)動簽名,實現(xiàn)UEFI惡意驅(qū)動執(zhí)行的功能。
本文提出的基于UEFI的SMI信號抑制攻擊方式。由于該方法主要利用主板廠商的保護位設(shè)置漏洞進行攻擊,因此不具有普遍性。下一步工作分析其它UEFI可利用漏洞,提升UEFI攻擊的普適性;對于本文提出的基于UEFI的Speed Racer攻擊方式,攻擊能否成功具有很大的隨機性,不能保證攻擊的穩(wěn)定性。下一步的工作主要對該方法進行優(yōu)化,確保該攻擊的穩(wěn)定性。