馬佳敏1,潘 理1,姚頡文2
(1.上海交通大學電子信息與電氣工程學院電子工程系,上海 200240;2.Intel亞太研發有限公司,上海 200336)
計算機固件的執行權限高于操作系統,能實現對所有硬件設備的直接控制,同時也是操作系統安全機制的盲區所在。惡意代碼利用固件安全漏洞能輕易劫持操作系統,甚至破壞硬件本身。統一可擴展固件接口(Unified Extensible Firmware Interface,UEFI)[1]是新一代的計算機固件接口標準。UEFI固件超過99%的編碼用C語言完成,更是引入了完整的網絡協議棧。膨脹的代碼量以及基于C語言的實現,均可能導致UEFI固件漏洞數的大幅增加。一些C語言下常見的代碼安全漏洞,如緩沖區溢出漏洞、格式化串漏洞等,很可能被惡意代碼利用。
目前常見的代碼漏洞檢測方式有靜態漏洞分析和動態漏洞分析2種,其中前者以語法、詞法分析為基礎,分析被測程序特征,通過匹配漏洞數據庫或規則列表的方式定位漏洞[2-4];后者通過執行目標代碼,監測異常狀態的方式檢測漏洞。典型的動態漏洞分析有模糊測試法[5-7]和信息流追蹤法[8-9]2種,前者通常包含隨機數據生成器,通過大量的測試用例測試目標代碼;后者通過監控輸入數據在程序執行過程中遺留在內存或寄存器中的痕跡來判斷是否有漏洞。靜態漏洞分析法檢測漏洞的能力取決于對程序特征的描述以及漏洞庫的豐富性,局限性過高。動態漏洞分析中的信息流追蹤法主要針對緩沖區溢出漏洞,通用性不高。而模糊測試法流程簡單、通用性高,在操作系統和網絡漏洞檢測領域已經獲得了廣泛應用[10],能有效應用于UEFI固件漏洞檢測中。
本文基于UEFI的開源實現平臺可擴展固件開發套件(EFI Development Kit,EDK)II[11],設計開發面向UEFI固件的模糊測試系統。本文系統實現為客戶端/服務端模式,在服務端通過專門的測試數據生成引擎生成測試數據,客戶端為測試用例獲取測試數據提供統一的編程接口。該方案所采用的測試邏輯與測試數據生成相分離。通過對比UEFI下自我認證測試系統[12]的代碼覆蓋率,并以一個實際UEFI固件漏洞為例,說明該模糊測試系統的漏洞檢測效果。
模糊測試系統通常由測試框架、功能模塊、測試數據生成引擎以及測試用例集構成。其中,測試框架負責自動化執行測試用例,對測試環境進行初始化和清理操作;功能模塊為模糊測試系統提供相應功能,如記錄系統執行狀態,為測試用例提供編程接口等;測試數據生成引擎負責測試數據的生成;測試用例集由針對不同目標代碼的測試用例構成,以測試數據生成引擎提供的測試數據為輸入,執行目標代碼進行測試。
衡量模糊測試系統性能好壞的一個重要標準是代碼覆蓋率,即測試用例在執行目標代碼時,測試數據所通過目標代碼占全部目標代碼的百分比。測試數據生成引擎提供的測試數據質量高低,很大程度上決定了測試用例的代碼覆蓋率。好的測試數據有助于觸發需要滿足特定條件的安全漏洞。而在UEFI環境下實現這樣一個測試數據生成引擎代價過高,且很難保證生成測試數據的質量。因此,采用Peach[13]作為系統中的測試數據生成引擎。Peach是開源、通用的智能模糊測試平臺,以能生成高質量的測試數據著稱。不過UEFI固件對Peach的運行環境支持并不成熟,因此,Peach需要運行在傳統的操作系統上。
根據以上分析,將模糊測試系統實現為位于遠端主機和目標主機的2個部分,前者負責測試數據的生成;后者負責對由UEFI固件中各個服務、協議構成的目標代碼的測試,如圖1所示。

圖1 模糊測試系統架構
遠端主機由運行在操作系統上的測試數據生成引擎Peach和模糊測試服務端構成;目標主機由運行在UEFI環境下的測試框架、模糊測試服務端和測試用例集構成。為了保證整個系統的擴展性和移植性,這里的測試框架使用了UEFI下自我認證測試系統的測試框架。同時為了便于目標主機中的測試用例集獲取遠端主機中生成的測試數據,實現了由模糊測試服務端和模糊測試客戶端構成的模糊測試系統功能模塊,前者負責對Peach系統的調度以及測試數據的傳遞;后者為測試用例提供獲取測試數據的統一編程接口。模糊測試服務端和模糊測試客戶端之間通過網絡協議通信,這兩者也是模糊測試系統中的核心模塊。測試用例集中的測試用例與目標代碼一一對應,以從模糊測試客戶端獲取的測試數據為參數,通過接口調用的方式執行目標代碼進行測試。
模糊測試系統下的測試用例在測試目標代碼時,測試流程由6步構成,如圖2所示。

圖2 測試流程
該測試過程具體流程描述如下:
(1)測試用例向模糊測試客戶端傳遞獲取測試數據的請求。
(2)模糊測試客戶端將請求封裝為特定的請求幀,并通過網絡協議傳遞給模糊測試服務端。
(3)模糊測試服務端解析請求幀后,以系統調用的方式啟動Peach系統,生成測試數據。
(4)模糊測試服務端將生成的測試數據分片并封裝為特定的測試數據幀后,通過網絡協議傳遞給模糊測試客戶端。
(5)模糊測試客戶端接收測試數據幀后,經過解析重組將測試數據傳遞給測試用例。
(6)測試用例以獲取的測試數據測試目標代碼。
在構成模糊測試系統的4個組成部分中,由于模糊測試框架使用了現有的UEFI下自我認證測試系統的測試框架,測試用例集的編寫也需要符合其規范[14]。測試數據生成引擎Peach本身并不支持所生成測試數據的導出,因此需要略微修改其源碼。模糊測試功能模塊作為銜接測試用例和測試數據生成引擎的重要模塊,是模糊測試系統實現的重點也是難點所在。模糊測試功能模塊的實現包括模糊測試客戶端、模糊測試服務端以及兩者間通信方式的設計實現。
模糊測試客戶端和模糊測試服務端之間的通信,有以下3點要求:支持可靠的數據傳遞;支持大容量數據的傳遞;簡化數據傳遞流程,盡量降低負載。目前UEFI下并沒有提供同時支持以上3個條件的網絡協議。因此,基于傳輸控制協議(Transmission Control Protocol,TCP)設計實現輕量級文件傳輸協議(File Transfer Protocol,FTP)協議。在該輕量級FTP協議中定義了請求幀和測試數據幀,前者用于模糊測試客戶端向模糊測試服務端發起獲取測試數據的請求;后者用于模糊測試服務端向模糊測試客戶端傳遞生成的測試數據。定義的2類幀的幀格式中均只包含必需的域,其中請求幀由測試數據生成相關信息,以及一個可選的用于傳遞控制信息的域構成;測試數據幀由幀重組相關信息,以及可變長度的有效載荷構成。
UEFI下的可執行程序分為應用程序和驅動2類,驅動中的功能函數以協議的形式供其他應用程序和驅動調用。這里將模糊測試客戶端實現為UEFI下的驅動,對外提供模糊測試協議,用于測試數據的獲取。由于測試數據在遠端主機生成,模糊測試協議需提供基本的連接建立,連接終止和網絡數據獲取功能。模糊測試協議的接口定義如下:

同時模糊測試協議中定義了測試數據格式和測試數據生成方式2個枚舉類型,分別對應于希望Peach生成的測試數據格式,以及Peach中生成測試數據的2種方式——基于生長和基于變異的數據生成方式。測試用例調用模糊測試協議的GetFuzzData獲取測試數據時,僅需提供測試數據格式和測試數據生成方式,GetFuzzData執行流程如圖3所示。

圖3 GetFuzzData執行流程
GetFuzzData的執行由3個層次構成,分別是邏輯控制層、數據處理層和網絡收發層。首先,邏輯控制層根據測試數據格式和測試數據生成方式,調用數據處理層中對應的處理函數完成相應的初始化并生成請求幀;接著,數據處理層調用網絡收發層中的網絡發送函數向模糊測試服務端傳遞請求幀,并通過網絡接收函數接收來自模糊測試服務端的測試數據幀分片,直到接收到完整的幀;最后,網絡收發層將重組后的測試數據向上層傳遞。
模糊測試服務端則實現為一個標準的服務端程序,監聽來自模糊測試客戶端的請求幀。模糊測試服務端通過請求幀,獲知執行測試數據生成引擎Peach相關的輸入信息,并通過系統調用的方式執行Peach生成測試數據。生成的測試數據,由模糊測試服務端依據測試數據幀的格式分片,封裝后向模糊測試服務端傳遞。同時,模糊測試服務端在后臺運行記錄系統運行狀態的子進程。
本節以測試用例的代碼覆蓋率為指標,對比基于模糊測試系統編寫的測試用例與基于原UEFI下自我認證測試系統編寫的測試用例,并通過一個實際的安全漏洞揭示模糊測試系統如何挖掘UEFI固件高危安全漏洞[12]。
測試環境選取由EDK II Revision 13762編譯出的NT32[15],NT32是UEFI Shell的模擬器,為測試用例提供了一個可執行環境。測試數據生成引擎Peach選用的版本號為2.3.8。UEFI下代碼覆蓋率工具選用英特爾基于Bullseye[16]開發的UEFI固件代碼覆蓋率測試工具。目標代碼為UEFI固件中負責將可執行文件載入內存的映像驅動(EDKII/Mde ModulePkg/Core/Dxe/Image/Image.c),對比結果如圖4所示。

圖4 代碼覆蓋率對比
圖4中的結果顯示基于模糊測試系統開發的測試用例,代碼覆蓋率平均提升超過了15%。其中部分函數的代碼覆蓋率幾乎沒有提升,如CoreExit,而有的則提升了1倍,如CoreLoadImage,這主要是因為后者涉及了大量與輸入數據結構相關的操作,如對輸入測試數據格式的解析、合法性判斷等;前者恰恰相反,涉及操作與輸入數據結構無關,如對內存空間的清空操作等。合理構造的測試數據,能夠通過盡可能多的合法性判斷代碼,因而代碼覆蓋率就高,也有助于觸發深層漏洞。
通過模糊測試系統可以挖掘出十分嚴重的安全漏洞,以NT32下GPT(GUIDed Partition Table)驅動的一個緩沖區溢出漏洞為例,相關代碼如下:

以上代碼用于從磁盤中讀入數據。Line1采用固定大小EFI_PARTITION_ENTRY分配用于存儲磁盤數據的內存空間。測試用例在執行該目標代碼時,若作為輸入的測試數據中的PrimaryHeader->SizeOfPartionEntry(Line7)項大于EFI_PARTITION_ENTRY,位于磁盤中的數據將會覆蓋后續的執行代碼,導致UEFI固件運行的崩潰。模糊測試服務端的后臺進程能夠監測到UEFI固件的崩潰狀態,并保存觸發漏洞的測試數據。結合該測試數據與微軟提供的集成開發環境VS2008(Visual Studio 2008)可視化開發套件的調試功能,將很容易確定相應的漏洞。而在現實環境中,黑客完全可以通過構造惡意的GPT表,使位于磁盤的數據覆蓋內存相關區域,達到劫持系統的目的。
計算固件處于計算機系統的核心地位,自身的安全漏洞往往隱藏較深,需要滿足特定的條件才能被觸發,這成為了檢測UEFI固件漏洞的難點所在。本文提出的面向UEFI固件的模糊測試系統,通過模糊測試技術的應用以及測試用例集的高代碼覆蓋率,保證了漏洞檢測的全面性和高效性,較好地解決了UEFI固件漏洞檢測的問題。下一步的研究工作主要有以下2點:(1)添加對UEFI固件中網絡協議測試的支持;(2)基于文中提出的模糊測試系統,編寫更多的測試用例,全面測試UEFI固件的協議和服務。
[1]Zimmer V,Rothman M,Marisetty S.Beyond BIOS:Developing with the Unified Extensible Firmware Interface[M].2nd ed.[S.l.]:Intel Press,2010.
[2]周振柳,計算機固件安全技術[M].北京:清華大學出版社,2012.
[3]唐艷武,蔣 凡.上下文相關的軟件漏洞模式自動提取方法[J].計算機工程,2010,36(17):51-56.
[4]Ding Sun,Tan H B K,Liu Kaiping,et al.Detection of Buffer Overflow Vulnerabilities in C/C++with Pattern Based Limited Symbolic Evaluation[C]//Proc.of the 36th International Conference on Computer Software and Applications.Lzmir,Turkey:[s.n.],2012:559-564.
[5]Yang Dingning,Zhang Yuqing,Liu Qixu.Blend Fuzz:A Model-based Framework for Fuzz Testing Programs with Grammatical Inputs[C]//Proc.of the 11th International Conference on Trust,Security and Privacy in Computing and Communications.Liverpool,UK:[s.n.],2012:1070-1076.
[6]李偉明,張愛芳,劉建財,等.網絡協議的自動化模糊測試漏洞挖掘方法[J].計算機學報,2011,34(2):242-254.
[7]沈亞楠,趙榮彩,王小芹,等.基于文件規范描述的文件模糊測試[J].計算機工程,2010,36(16):52-53,59.
[8]Liu Zhi,Zhang Xiaosong,Li Xiongda.Proactive Vulnerability Finding via Information Flow Tracing[C]//Proc.of the 2nd International Conference on Multimedia Information Networking and Security.Nanjing,China:Nanjing University,2010:481-485.
[9]唐和平,黃曙光,張 亮.動態信息流分析的漏洞利用檢測系統[J].計算機科學,2010,37(7):148-151.
[10]章 燁.Fuzz安全測試技術研究[D].西安:西安電子科技大學,2010.
[11]Intel Corporation.EDK II Module Writer’s Guide Revision 0.01[EB/OL].[2013-06-18].http://www.intel.com/.
[12]姚頡文,謝康林,石永軍,等.基于EFI驅動-協議模型的自我認證測試系統[J].計算機仿真,2005,22(7):75-78.
[13]Sutton M,Greene A,Amini P.Fuzzing Brute Force Vulnerability Discovery[M].[S.l.]:Addison-Wesley,2006.
[14]Intel Corporation.UEFI SCT Case Writers Guide 0.91[EB/OL].[2013-06-18].http://www.uefi.org.
[15]Intel Corporation.EDK II Lab Setup&NT32 Build[EB/OL].[2013-06-18].http://uefidk.intel.com/.
[16]Bullseye Testing Technology.Bullseye Coverage Measurement Technique[EB/OL].[2013-06-18].http://www.bullseye.com/measurementTechnique.html.