張 浩 申珊靛 劉 鵬 楊澤霖 周 威 張玉清,5
1(西安電子科技大學網絡與信息安全學院 西安 710071)
2(中國科學院大學國家計算機網絡入侵防范中心 北京 101408)
3(華中科技大學網絡空間安全學院 武漢 430074)
4(分布式系統(tǒng)安全湖北省重點實驗室(湖北省大數(shù)據(jù)安全工程技術研究中心) 武漢 430074)
5(海南大學計算機與網絡空間安全學院 海口 570228)
近年來物聯(lián)網行業(yè)發(fā)展迅速,嵌入式設備廣泛應用于人類生活的各個領域.這些無處不在的嵌入式設備構成了一個萬物互聯(lián)的巨大網絡,極大地促進了人類社會的信息化、智能化發(fā)展.嵌入式設備作為物聯(lián)網中的重要組件,往往被針對性地賦予若干專用功能.基于商業(yè)成本控制,開發(fā)者在設計嵌入式設備時會在足以完成特定功能的情況下盡量節(jié)約成本,這使得嵌入式設備開發(fā)過程缺乏代碼審計、安全測試和地址空間隨機化等安全機制[1].同時,嵌入式設備作為萬物互聯(lián)的重要節(jié)點,其一旦被非法組織攻破,造成的危害后果極大.
例如,2023 年4 月舉行的美國信息安全大會中指出,目前分布式拒絕服務攻擊(DDoS)比例超過了總體攻擊比重的50%,主要源于大量增長的物聯(lián)網設備極易被攻擊者控制[2].據(jù)統(tǒng)計,超過90%的嵌入式實時系統(tǒng)沒有實現(xiàn)數(shù)據(jù)段內存不可執(zhí)行、段基地址隨機化和棧溢出保護等基本的漏洞緩解措施[1].此外,由于嵌入式設備包含多種專用外設接口,其存在的攻擊風險遠大于通用計算機系統(tǒng).例如BroadPwn漏洞可以通過嵌入式設備的外設來攻擊其嵌入式系統(tǒng)[3].但是這種跨組件的漏洞一般無法通過分析單個嵌入式系統(tǒng)來發(fā)現(xiàn)或復制,因為這種漏洞利用的是嵌入式設備中多個硬件和軟件間的數(shù)據(jù)通信和行為模式中的缺陷.
近年來,業(yè)界嘗試將各種表現(xiàn)良好的漏洞挖掘技術應用到嵌入式領域中,但需要克服嵌入式設備存在的底層硬件復雜多樣、軟件和硬件資源有限、設備信息文檔不公開等問題.一方面,嵌入式設備廠商的軟硬件實現(xiàn)方式種類繁多,底層硬件平臺也復雜異構,使得通用計算機系統(tǒng)上的先進漏洞挖掘技術難以直接適用;另一方面,不同廠商有不同的設計風格和編碼方式,出于行業(yè)競爭的考慮,其源碼文檔并不公開,導致嵌入式設備的安全測試工作難以順利進行,同時,出于成本和安全的考慮,嵌入式設備的計算資源十分有限,主頻通常只有幾百兆赫茲,導致動態(tài)分析等需要大量運行資源的漏洞挖掘技術遷移到嵌入式設備中的挖掘效率較低[4].
之前多數(shù)研究人員對嵌入式設備和固件的安全分析僅通過靜態(tài)分析技術[5-8].雖然嵌入式設備和固件的靜態(tài)分析技術取得了不錯的成果,但是面對數(shù)量龐大的嵌入式設備,靜態(tài)分析人工成本高、誤報率高的缺點逐漸暴露.而相比之下動態(tài)分析技術準度度高、自動化程度高,可以大幅提高漏洞挖掘的效率,消除不同平臺間的環(huán)境壁壘,幫助研究人員實現(xiàn)通用、高效的安全分析方案.然而,嵌入式設備硬件依賴性高,如何分離嵌入式固件和底層硬件或實現(xiàn)嵌入式設備固件全系統(tǒng)硬件仿真,即嵌入式固件仿真技術,成為目前學術界的研究熱點和工業(yè)界的首選分析工具[9-12].將嵌入式固件重新部署或重新托管到虛擬環(huán)境可以增加其物理系統(tǒng)上不具備的功能,例如可檢查性、可變性、可復制性、可擴展性和可處置性.這種虛擬環(huán)境可脫離嵌入式設備的硬件約束,能夠以任何粒度檢查重新托管的嵌入式固件的執(zhí)行狀態(tài)[13].通俗來講,這種虛擬系統(tǒng)的狀態(tài)是完全可變的處理器狀態(tài),在嵌入式固件執(zhí)行的任何階段都可以修改內存,控制非確定性的來源,以便保證分析結果的可復制性.重新托管的嵌入式系統(tǒng)可以非常容易地克隆來進行分布式動態(tài)分析,提高漏洞挖掘效率或者與合作者共享分析進程.同時,虛擬系統(tǒng)的可復制性使得分析者不需要擔心某些危險操作損害系統(tǒng).因此,在原始物理系統(tǒng)上不可行的模糊測試、符號執(zhí)行等動態(tài)分析技術變得可行[14].然而,雖然傳統(tǒng)的嵌入式系統(tǒng)仿真研究例如嵌入式Linux 系統(tǒng)仿真已經開展多年,但隨著基于微控制器的嵌入設備廣泛地應用,其無法適用于各種專用嵌入式系統(tǒng)設備,難以應對日益增長的物聯(lián)網設備硬件仿真需求.
本文檢索了2013—2023 年間的網絡與系統(tǒng)安全國際四大頂級會議(IEEE S&P,CCS,USENIX Security,NDSS)中嵌入式設備固件仿真器的相關工作,從圖1中可以看到,固件仿真器的相關工作論文數(shù)量總體呈上升趨勢.
Fig.1 Number of papers related to firmware emulators published in international conferences within 10 years圖1 10 年內在國際會議中發(fā)表的與固件仿真器相關的論文數(shù)量
在嵌入式設備安全研究綜述中,大多側重于安全分析技術的總結與應用,例如 Wright 等人[15]總結了嵌入式固件的現(xiàn)狀與挑戰(zhàn),并為固件分析從業(yè)者提供選擇建議;Fasano 等人[14]主要對固件仿真工具進行對比實驗并提出新的發(fā)展方向;Feng 等人[16]和于穎超等人[4]總結了物聯(lián)網設備固件上常見的漏洞檢測技術和安全分析技術.由此可見,這些相關研究綜述并未側重固件仿真器.并且,近年來嵌入式設備仿真技術發(fā)展迅速,這些綜述大多未包含最新成果,以及未對固件仿真器發(fā)展體系總結.因此,有必要針對嵌入式設備固件仿真器的研究重新梳理,進一步分析和總結該領域的工作.
本文的架構框圖如圖2 所示,本文的主要貢獻包括5 個方面:
Fig.2 Framework diagram of our proposed paper圖2 本文框架圖
1)本文系統(tǒng)性地介紹了固件仿真器相關的基礎知識和工作流程.對固件仿真器中常見的系統(tǒng)仿真和固件重新托管進行說明和區(qū)分,幫助讀者初步了解固件仿真器的相關知識,以便更好地理解各種固件仿真器.
2)分析回顧了嵌入式設備固件仿真器的發(fā)展歷史.根據(jù)國際著名安全會議上的相關工作梳理固件仿真器的發(fā)展歷程與方向,并介紹不同方向的開創(chuàng)性工作和富含重大意義的研究成果.加入了最新的固件仿真器工具并介紹固件仿真器不同方向的發(fā)展體系.
3)根據(jù)仿真器的主要目標,將固件仿真器分為指令仿真和外設仿真2 個研究方向,進一步將外設仿真研究根據(jù)其主要仿真方式細化為硬件在環(huán)、基于符號執(zhí)行、基于人為假設、基于模糊測試反饋和基于硬件手冊等,并介紹各種固件仿真器的核心技術原理.
4)使用保真度以及應對各種挑戰(zhàn)的處理方式對各種嵌入式設備固件仿真器進行評估和比較,方便讀者更加直觀地認識各種固件仿真器的特點.固件仿真器在不同的使用場景下的性能各不相同,本文結合固件仿真器的不同特性和優(yōu)勢為使用者提供固件仿真器選擇參考.
5)結合各種新技術的發(fā)展和嵌入式設備固件仿真器的瓶頸,本文介紹了固件仿真器面臨的挑戰(zhàn)和機遇,從閉源二進制固件信息提取與還原、高保真度復雜設備外設仿真模型自動化構建、不同設備固件仿真方案的兼容與融合方案、固件仿真器的可擴展性、基于固件仿真器的動態(tài)分析技術等方面為固件仿真器的下一步研究提供了方向參考.
嵌入式設備固件指設備上所有軟件代碼的集合,其通常被存儲在只讀存儲或者閃存中.嵌入式設備固件的格式復雜多樣,沒有統(tǒng)一的標準,并且嵌入式系統(tǒng)中的數(shù)據(jù)和代碼往往交織在一起,執(zhí)行入口也通常為了中斷向量表,例如ARM Cortex-M 架構而保存在固件中.如圖3 所示,常見的嵌入式系統(tǒng)包括固件和設備,系統(tǒng)可分為4 層,分別是硬件層、驅動層、操作系統(tǒng)層和應用層.硬件層是指嵌入式設備依賴的硬件平臺,常由處理器、存儲器和外設組成.不同的嵌入式設備硬件環(huán)境的差異除了處理架構,更多地體現(xiàn)在外設種類的差異性.驅動層通過控制外設讀寫操作和硬件外設進行交互.驅動層代碼大多由設備廠商提供,包含于板級支持包(BSP)中或者使用開源的硬件抽象層接口(HAL).此外,大多嵌入式設備會包含嵌入式系統(tǒng),例如嵌入式Linux 和實時操作系統(tǒng)(RTOS)層,負責應用程序的任務調度和控制等核心功能,具有內核精簡、可配置、與應用程序緊密關聯(lián)等特點.應用層包含設備核心功能的嵌入式應用程序、邏輯代碼和算法等.
Fig.3 Embedded device firmware hierarchy diagram圖3 嵌入式設備固件層次圖
嵌入式設備的核心功能依靠對外設的控制來實現(xiàn),例如機器人、無人機等.如圖4 所示,外設可分為片上外設和片外外設,固件無法直接訪問片外外設,只能通過片上外設與片外外設進行交互.交互方式主要是通過4 種方式:1)外設的硬件寄存器映射到處理器可訪問的內存空間(memory mapped I/O,MMIO),并且外設的狀態(tài)、配置和數(shù)據(jù)都可以通過讀取和寫入特定的內存位置來查詢.2)外設的硬件寄存器不會映射到內存空間,而是通過使用指令查詢端口進行訪問.3)外設在計時器完成、新數(shù)據(jù)到達等情況時,通過觸發(fā)中斷來告知處理器,處理器再進行相應的外設操作處理.4)外設也可以獨立于處理器和其他外設直接與主存進行數(shù)據(jù)傳輸,即DMA,該方式通常適用于大數(shù)據(jù)量傳輸.
Fig.4 Hardware framework diagram of a certain microprocessor圖4 某微控制器的硬件框架圖
嵌入式設備功能的復雜程度決定它們的嵌入式系統(tǒng)的大小,既有定制版本的Linux 等桌面操作系統(tǒng)的大型多處理器系統(tǒng),又有幾KB 代碼的低成本、低功耗微處理器實時操作系統(tǒng).所以我們選擇參考Wright 等人[15]的分類方式,將嵌入式設備固件按系統(tǒng)類型分為3 類.
第1 類是基于通用操作系統(tǒng)的嵌入式設備,主要使用服務器和桌面系統(tǒng)的通用操作系統(tǒng),包括實時Linux、樹莓派等系統(tǒng).這一類嵌入式設備的操作系統(tǒng)是傳統(tǒng)計算機操作系統(tǒng)針對嵌入式空間進行的變種,保留了大部分桌面功能,與外設的交互也是由特定的設備驅動負責的.這一類嵌入式設備的優(yōu)點是可以直接使用多數(shù)通用計算機系統(tǒng)的仿真工具,例如QEMU[17]等.
第2 類是基于嵌入式操作系統(tǒng)的嵌入式設備,通常是商業(yè)物聯(lián)網產品,例如使用μCLinux 和ZephyrOS等系統(tǒng)的嵌入式設備.區(qū)分第2 類和第1 類的特征在于,第1 類的嵌入式設備中的系統(tǒng)和應用程序可以單獨編譯.第2 類系統(tǒng)通常將操作系統(tǒng)與應用程序等編譯為統(tǒng)一固件.第2 類操作系統(tǒng)適用于計算能力較低但實時性較高的嵌入式設備,例如小型無人機等.此外,如VxWorks 操作系統(tǒng),可以根據(jù)不同配置同時具備第1 類和第2 類的編譯方式和功能特點.需要注意的是,第2 類操作系統(tǒng)的仿真并不能直接使用通用計算機系統(tǒng)的仿真技術,這一類仿真需要重新托管內核和用戶空間,并且其內核和用戶空間之間分隔的模糊性也給仿真帶來了困難[15].
第3 類是不具備操作系統(tǒng)抽象的嵌入式設備,這類嵌入式設備大多只包含一個輕量級的操作系統(tǒng)庫,此時應用程序往往直接訪問硬件,并且靜態(tài)鏈接到單個二進制文件中,如小型傳感器.此類嵌入式設備不存在操作系統(tǒng)內核和應用程序代碼之間的邏輯隔離.最近的固件重新托管工作也開始側重重新托管第3 類操作系統(tǒng).
如表1 所示,第1 類操作系統(tǒng)功能豐富,內存管理系統(tǒng)和文件系統(tǒng)完善,有明確的硬件系統(tǒng)調用接口,容易托管;第2 類操作系統(tǒng)的功能簡單,驅動與系統(tǒng)邊界模糊,不一定具備獨立文件系統(tǒng),內存管理系統(tǒng)不健全;第3 類操作系統(tǒng)功能更加簡單,不存在內存管理系統(tǒng)和文件系統(tǒng),應用程序可直接對硬件進行操作.根據(jù)Chen 等人[18]統(tǒng)計的開源固件映像的信息,第1 類固件約占總固件映像的50%,第2 類固件約占總固件映像的8%,第3 類固件約占總固件映像的42%.但需要注意,實際中更多閉源嵌入式設備,如工控固件和軍用設備固件使用第2 類、第3 類嵌入式系統(tǒng).
Table 1 Comparison of Firmware for Different Devices[4]表1 不同設備固件的比較[4]
在過去,仿真技術主要的用途是在硬件生產之前進行軟件開發(fā),從而減少產品開發(fā)時間和提高硬件與軟件間的兼容性.如今,仿真技術則逐漸成為安全分析和邏輯調試的流行工具.
2005 年QEMU[17]架構首次實現(xiàn)了多種指令集架構跨平臺仿真.QEMU 將整個基本塊轉換為主機系統(tǒng)的指令集然后執(zhí)行轉換之后的指令,從而實現(xiàn)全系統(tǒng)仿真.QEMU 不需要檢查每個指令之間的中斷,減少了指令轉換開銷,并且具備一定程度的外設仿真.這些優(yōu)點使得QEMU 成為使用最廣泛的指令仿真器之一.特別是2017 年的Unicorn[19]進一步簡化QEMU 的系統(tǒng)仿真功能,只保留其指令仿真部分,同時增加了豐富的內存、寄存器和外設轉發(fā)調試接口.因此,近十年的固件仿真器相關工作大多在QEMU和Unicorn 仿真器的基礎上進行開發(fā).此外,2019 年美國國家安全局開源了強大的逆向分析工具Ghidra,其包含多架構指令仿真器Ghidra Emulator[20].Ghidra Emulator 支持比QEMU 更多的指令集仿真,能夠將逆向工程與仿真結合到同一個環(huán)境中,并允許用戶自行添加新的指令集架構.
然而,隨著物聯(lián)網設備種類的增多,特別是外設種類的多樣性和復雜化,無論是QEMU、Unicorn 還是Ghidra Emulator 均不足以支持全系統(tǒng)外設的仿真,所以近年來的研究更多地關注嵌入式設備仿真問題.
2014 年的AVATAR[21]首次提出了一個具有可擴展外設仿真、內存監(jiān)控等多種功能的接口框架,該框架基于QEMU 將仿真器的執(zhí)行與真實的硬件結合起來,即將無法仿真的外設的交互轉發(fā)給真實設備,以此支持嵌入式設備固件進行全系統(tǒng)動態(tài)分析.AVATAR 也是最早將符號執(zhí)行應用于嵌入式設備固件分析領域的工具,它擁有專門的插件接口對事件進行攔截和轉發(fā),通過符號執(zhí)行檢測固件中存在的漏洞.2014 年的PROSPECT[22]和2015 年的SURROGATES[23]與AVATAR 一樣,均采用基于QEMU 的硬件轉發(fā)方法來解決缺少外設仿真的問題.SURROGATES 則是在嵌入式設備總線和仿真器之間使用了一個低延遲的FPGA 橋接器,橋接器負責固件與外設之間的轉發(fā)和狀態(tài)傳輸,因此傳輸速度與AVATAR相比有所提升.
然而,這些“硬件在環(huán)”早期仿真器,由于硬件轉發(fā)的存在導致仿真實現(xiàn)效率過低、難以大規(guī)模分析,需要工作人員對嵌入式設備逐個調試.2015 年的PANDA[24]是一個基于QEMU 全系統(tǒng)仿真器的開源平臺,它的優(yōu)點是增加了記錄和重放的功能,可以記錄所有的硬件交互,然后在全虛擬化的環(huán)境下進行重放.然而,其并未建立外設仿真模型,因此當重放結束后仍然無法判斷后續(xù)硬件輸入.在此基礎上,2019 年的Pretender[25]通過使用機器學習來學習硬件交互記錄進行建模,從而根據(jù)模型實現(xiàn)全系統(tǒng)仿真.然而,Pretender 本身仍然無法擺脫硬件依賴.
之后研究人員摒棄了效率依舊較低且無法自動化運行的硬件在環(huán)方法,嘗試通過固件的重新托管技術犧牲掉部分虛擬運行的保真度來解決外設的仿真問題.2020 年的P2IM[26]首次提出基于外設交互的通用外設建模方案,并結合模糊測試向QEMU 仿真器提供外設的反饋,以此保證嵌入式設備固件的虛擬運行.該工具能夠在不使用硬件或外設的詳細知識的前提下,利用模糊器提供的輸入模擬運行固件.但是P2IM 需要盲猜狀態(tài)寄存器的響應,搜索范圍過大,難以適用于復雜的外設而且會導致崩潰和死機.2021 年的μEmu[27]和Jetset[28]將符號執(zhí)行框架S2E[9]或Angr[29]與固件重新托管技術結合來提高固件仿真效率.2021 年的DICE[30]在P2IM 的基礎上增加DMA仿真功能,支持識別并生成DMA 輸入來測試固件中跳過或無法訪問的代碼和狀態(tài),在不需要人工協(xié)助的情況下分析和測試DMA 相關的代碼.
為了進一提高外設仿真模型的保真度,2022 年的最新的SEmu[31]提出了基于硬件描述手冊來自動化構建高精準度外設仿真模型的方案.SEmu 通過自然語言處理技術將外設行為轉換為一組結構化的條件規(guī)則,然后為每個外設建立一個模型.因此,SEmu擁有更好的仿真準確度,并能夠進行固件代碼合規(guī)性檢查.
此外,為了進一步提高外設仿真模型的適用范圍,F(xiàn)uzzware[32]和Ember-IO[33]將部分硬件輸入也作為模糊測試輸入從而擴大模糊測試輸入空間,以此提高模糊測試的代碼覆蓋率,但卻引入了更多的漏報和誤報.
除了通過外設仿真實現(xiàn)全系統(tǒng)模擬,還有研究人員通過替換外設依賴代碼來實現(xiàn)全系統(tǒng)仿真,例如2020 年的HALucinator[34].HALucinator 觀察到嵌入式設備固件與外設的交互通常是由硬件抽象層執(zhí)行,所以它使用AVATAR2 和QEMU 來攔截硬件抽象層調用并進行替換.但AVATAR2 和QEMU 依賴標準驅動庫并且通常需要一定的人工成本.
圖5 顯示了從2002 年至今經典的嵌入式固件仿真器的研究工作.最初,傳統(tǒng)的固件仿真器的相關工作大多針對傳統(tǒng)操作系統(tǒng)仿真,例如Linux,或者QEMU,需要大量人工不斷添加新的硬件仿真支持,并不適合如今復雜多樣的嵌入式設備和外設.后來,針對復雜多樣的外設等挑戰(zhàn),相繼產生了硬件在環(huán)、抽象、基于符號執(zhí)行、基于模糊化、基于規(guī)則等更加先進自動化的嵌入式固件仿真器,不斷優(yōu)化的固件仿真器也提高了嵌入式固件的漏洞挖掘效率,使得嵌入式設備的安全性得以提升,也促進了動態(tài)分析技術的發(fā)展.
Fig.5 Technical implementation relationships between firmware simulators圖5 固件仿真器之間的技術實現(xiàn)關系
仿真和分析一個嵌入式設備固件,首先需要獲取固件.固件可以從供應商網站或Github 等第三方網站下載.當固件無法直接下載,或固件屬于不易提取的專屬文件格式時,可以使用網絡捕獲工具在固件更新期間捕獲網絡流量,從中提取固件.在獲得固件之后,需要對固件解包以提取固件的關鍵信息,例如固件的指令集架構、固件基址、分析入口點、內存布局和控制流圖等.固件解析包常用的工具有Binwalk[39]和BAT[40],F(xiàn)irmadyne[18]和Costin[41]工具均使用Binwalk 完成解包.雖然本文介紹的大多數(shù)固件仿真器默認固件的關鍵信息是已知的,但是固件獲取和固件解包是仿真和分析一個嵌入式固件必不可少的第1 環(huán).
在獲得固件的關鍵信息之后,固件仿真器開始對固件進行仿真運行或重新托管.但大多數(shù)固件仿真器并不是完全自動化仿真,此時需要根據(jù)實際情況對固件仿真器進行設置.例如為新處理器添加支持說明;為硬件在環(huán)的固件仿真器配置外設交互;給外設建模,解決固件缺少代碼的問題;設置功能識別或標簽等.手動處理的固件仿真器需要在仿真之前進行部分設置,然后才能進入固件仿真運行或重新托管階段.在此階段可能會出現(xiàn)運行失敗的問題,可能是寄存器分配錯誤、中斷處理錯誤、計時器未處理、多線程未處理等,此時需要重新設置固件仿真器或者進入調試步驟.如果順利解決問題,則固件仿真或重新托管成功,固件仿真器進入下一步驟.
當固件仿真器成功運行之后,我們需要使用模糊測試、控制流分析、污點分析、符號執(zhí)行等固件仿真器支持的動態(tài)分析技術對固件進行漏洞挖掘.最后,挖掘到的漏洞僅存在于虛擬環(huán)境下運行的固件中.還需要在真實嵌入式設備中對漏洞進行分析和復現(xiàn),確保漏洞真實存在.至此,嵌入式固件完整的仿真和分析工作完成.
在嵌入式固件的安全分析相關工作中,經常會出現(xiàn)系統(tǒng)仿真(system emulation)、系統(tǒng)模擬(system simulation)和固件重新托管(firmware re-hosting).部分研究人員可能會將這3 類工作混淆,但是這3 類工作是有區(qū)別的,特別是系統(tǒng)仿真和系統(tǒng)模擬之間的差距很大.系統(tǒng)仿真是指通過硬件和指令集仿真實現(xiàn),使嵌入式設備固件能夠在其他架構平臺上執(zhí)行.而系統(tǒng)模擬則只是針對設備常見的功能進行建模,并非對真實固件的執(zhí)行環(huán)境進行仿真.固件重新托管則是指將固件重新托管到可以用來運行該固件的虛擬環(huán)境中.這個虛擬環(huán)境可以是通過系統(tǒng)仿真的虛擬環(huán)境,也可以是通過替換一些內部構件對系統(tǒng)進行建模的系統(tǒng)模擬的虛擬執(zhí)行環(huán)境.
為了挖掘真實固件代碼中的安全問題,本文主要針對圍繞系統(tǒng)仿真或固件重新托管開展的工作進行介紹和總結.
本文參考 Fasano 等人[14]對專有名詞進行釋義:
1)虛擬執(zhí)行環(huán)境(virtual execution environment):代碼可以透明執(zhí)行的軟件環(huán)境.
2)硬件仿真系統(tǒng)(hardware emulation system):一種虛擬環(huán)境,目的是準確地重新創(chuàng)建1 個或多個特定硬件的特征,即上文提到的仿真器.
3)固件托管(firmware rehosting):為給定的嵌入式系統(tǒng)構件重組嵌入式系統(tǒng)來完成指定的分析任務的過程.托管的過程可能包含對固件的修改,其可以通過系統(tǒng)仿真來實現(xiàn)或者通過硬件依賴代碼的替換來完成.
本文把具有外設接口和指令仿真功能的QEMU、Unicorn 等工具看作基礎仿真平臺,其他工具基于基礎仿真平臺進行改造或升級,有些工具依舊保持了全系統(tǒng)仿真,有些工具只保留了嵌入式系統(tǒng)的文件系統(tǒng),有些工具則是實現(xiàn)了固件重新托管,但是本文將這些工具統(tǒng)稱為嵌入式設備固件仿真器.
根據(jù) Fasano 等人[14]的描述,仿真的層級可以從指令級到處理器內核,再到片上系統(tǒng)甚至包含到連接嵌入式系統(tǒng)的物理系統(tǒng),范圍很大,各層級保真度要求也不相同.本文中重點關注固件仿真中針對安全分析的基本要求.
例如,對于模糊測試來說,其要求測試對象具有可探測性,必須支持基本塊級別的指令仿真,并且能夠收集路徑和基本塊反饋[42].此外,為了保證程序可持續(xù)執(zhí)行以及接受和處理測試程序,模糊測試[43]也需要一定程度的外設仿真,否則固件遇到硬件操作將出現(xiàn)異常行為.而污點分析需要檢測對象的可檢查性來識別保留輸入影響固件的敏感部分的執(zhí)行路徑,以更好地發(fā)現(xiàn)漏洞,所以其對數(shù)據(jù)保真度要求更多,需要更好的指令和外設仿真能力.總而言之,安全分析領域下的固件仿真器的基本要求為:基本塊級別的指令仿真和一定程度的外設仿真.
實際上,當前的固件仿真器一般針對特定安全分析目標,犧牲一部分的準確性來提高自動化程度或者適用性.具體的仿真要求不同,其針對不同的測試對象的優(yōu)勢往往不同.雖然最新的研究開始嘗試大規(guī)模地自動化全系統(tǒng)仿真,但是該領域還有待發(fā)展和研究.因此,本文后續(xù)將進一步總結不同固件仿真器的優(yōu)勢和特點,以便固件仿真器的使用者根據(jù)不同用途選擇合適的固件仿真器.
實現(xiàn)全系統(tǒng)的固件仿真主要需要解決2 大技術難點:一是處理器架構仿真,包括指令譯碼和處理器基礎架構仿真;二是固件依賴的周圍硬件設備仿真,即外設仿真.根據(jù)不同的固件仿真器側重點不同,本節(jié)分別介紹基本的處理器架構仿真工具和通過替換函數(shù)解決硬件依賴的固件仿真工具,以及重點介紹各種不同方案的外設仿真器.
無論是系統(tǒng)仿真還是指令仿真均需要以指令仿真為基礎.不同處理器的指令集往往不同,所以處理器仿真本質是指動態(tài)指令譯碼,即從原始架構指令動態(tài)譯碼為待測主機架構指令集指令.處理器指令譯碼和基礎的處理器架構仿真都是固件仿真的基礎.
常用的基礎架構仿真器主要有Simics[44],QEMU[17]和Ghidra Emulator[20].2002 年的仿真器Simics[44]支持Alpha,x86-64,IA-64 ARM,MIPS,MSP430,PowerPC,SPARC-V8 以及x86 等多種架構的指令譯碼.并且Simics 提供配置管理、腳本編寫、自動調試等內置功能來幫助構建仿真系統(tǒng),并且Simics 允許任何2 條指令間的中斷測試,指令級別具有保真度.在2016 年的DARPA 網絡大挑戰(zhàn)就是使用Simics 自動審查提交的文件來檢查提交的二進制文件是否符合標準.
2005 年QEMU[17]推出的QEMU 指令譯碼是基于基本塊級別的,它將整個基本塊中的指令轉換成中間代碼后再整體轉換為目標主機架構指令代碼執(zhí)行.因此,與Simics 相比,QEMU 不再需要檢查每個指令間的中斷,QEMU 利用執(zhí)行緩存大大減少了譯碼轉換開銷,所以QEMU 工作得更快.QEMU 同樣支持IA-32,x86,MIPS,SPARC,ARM,SH4,PowerPC,ETRAX CRIS,MicroBlaze 和RISCV 等多種架構,還提供部分常見的外設仿真.此外,Unicorn[19]進一步簡化了QEMU 的系統(tǒng)仿真功能,只保留其指令仿真部分,同時增加豐富的內存、寄存器和外設轉發(fā)調試接口.這使得QEMU 和Unicorn 成為使用最為廣泛的全系統(tǒng)仿真器.如今的嵌入式固件仿真器大多都是在QEMU 和Unicorn 仿真器處理器架構的基礎上進行的二次開發(fā).
2019 年的Ghidra Emulato[20]是美國國家安全局開發(fā)的包含仿真工具的開源軟件逆向工具,它的一大優(yōu)勢便是能夠將逆向靜態(tài)分析與指令仿真結合到同一個環(huán)境之中.并且Ghidra Emulato 支持比QEMU更多的指令集架構,并且允許用戶自行添加新的指令集架構.Ghidra Emulator 介于Simics 和QEMU 之間,基于其自定義的子指令級P-Code 完成譯碼,每個譯碼后的機器指令可對應多個仿真器子指令,具有子指令級別的保真度.例如,最新的MetaEmu[38]通過Ghidra Emulator 解決車機固件常使用不常見處理器架構和自定義指令語言架構的難題.MetaEmu 能夠為多個不同處理器指令架構的固件統(tǒng)一合成一套仿真環(huán)境,并進行符號執(zhí)行、模糊測試等復雜的動態(tài)分析.2023 年的Icicle[37]同樣基于Ghidra Emulato r 的P-Code 實現(xiàn)更細粒度的指令插樁,從而支持模糊測試更細粒度的執(zhí)行反饋,如比較指令對比反饋等功能.
嵌入式設備不同于通用計算機系統(tǒng),通用計算機系統(tǒng)大多硬件依賴較少,借助通用處理器架構仿真器即可實現(xiàn)全虛擬化執(zhí)行.但嵌入式設備需要解決硬件環(huán)境仿真復雜的難題,所以本節(jié)介紹通過識別硬件依賴接口層進行轉發(fā)替換,實現(xiàn)固件托管的仿真方案.經典的基于硬件依賴層替換的固件仿真器有Firmadyne[18],F(xiàn)irmAE[45],ECMO[46],HALucinator[34]和PMCU[47].
傳統(tǒng)的嵌入式Linux 系統(tǒng)的第1 類固件有著明確的系統(tǒng)調用接口,例如Firmadyne,F(xiàn)irmAE 和ECMO 都是通過借助Linux 的系統(tǒng)調用接口實現(xiàn)常用的硬件轉發(fā)替換仿真.但基于微控制器的固件缺乏標準的系統(tǒng)調用接口,其驅動行為更加多樣化和碎片化.因此,2020 年HALucinator 提出通過對固件的硬件抽象層接口進行替換轉發(fā),可以適用于大部分裸機第3 類固件.HALucinator 使用Avatar2 和Unicorn 攔截固件對硬件抽象接口層的函數(shù)調用,將函數(shù)調用替換為軟件實現(xiàn)的相似仿真功能.但其不僅需要使用庫匹配工具識別嵌入式設備固件中的硬件抽象層函數(shù),還需要人為編寫替換函數(shù),適用性受限且人工成本較高.
2021 年的PMCU[47]則直接使用嵌入式操作系統(tǒng)中的便攜式操作系統(tǒng)接口POSIX 來實現(xiàn)轉發(fā)替換.并且PMCU 直接將硬件架構指令依賴相關代碼也進行了替換,從而實現(xiàn)將嵌入式源代碼直接編譯為目標主機代碼,直接省去了指令譯碼的過程,大幅度提高了代碼執(zhí)行效率.但需要注意的是PMCU 需要依賴源代碼進行插樁,其替換在本質上并不屬于固件仿真器而是屬于嵌入式系統(tǒng)源碼仿真器.
基于替換的固件托管仿真方案,雖然相比原始外設仿真效率有所提高,保真度適中,但是存在人工成本較高且無法測試被替換代碼的安全性問題.
由于物聯(lián)網的快速發(fā)展,物聯(lián)網設備外設種類的多樣性成為現(xiàn)今固件全系統(tǒng)仿真工具的最主要技術挑戰(zhàn).如何自動化構建針對一個物聯(lián)網設備高保真度的外設仿真模型是一項復雜且艱巨的任務.針對每個外設人工建模的方案顯然無法滿足自動化大規(guī)模的測試需求.因此,現(xiàn)階段學術界通常以犧牲準確度和適用范圍為代價,自動化構建各種外設仿真模型.
根據(jù)不同固件仿真器在處理外設建模時的應對方法不同,本節(jié)將固件仿真器分為硬件在環(huán)的固件仿真器、基于人為假設的仿真模型、基于符號執(zhí)行的外設仿真模型、基于模糊測試的外設仿真模型和基于硬件手冊的外設仿真模型這5 類.
2.3.1 硬件在環(huán)的固件仿真器
硬件在環(huán)HITL(hardware in the loop)是指使用固件仿真器執(zhí)行指令,但是當需要對外設進行訪問時,固件仿真器將其對外設的讀寫訪問轉發(fā)到實際硬件中進行交互.簡而言之,硬件在環(huán)技術是將對硬件和外設的訪問轉發(fā)到實際物理設備上,來實現(xiàn)高保真度的模擬執(zhí)行.經典的使用硬件在環(huán)方法的固件仿真器有AVATAR[21],PROSPECT[22],SURROGATES[23],和Inception[48].
如上所述,2014 年的AVATAR[21]和AVATAR2[35]是最早基于QEMU 設計的可實現(xiàn)硬件轉發(fā)的框架,其可轉發(fā)QEMU 對外設的讀寫訪問到真實硬件,同樣也可以兼容Angr[29]等動態(tài)程序分析工具.PROSPECT[22]通過與嵌入式設備進行正常的總線連接來轉發(fā)仿真器與外設和硬件之間的交互.與AVATAR 相比,PROSPECT 這種通過總線連接來轉發(fā)交互的方法提高了仿真器與真實物理硬件之間交互的效率,提高了仿真速度.SURROGATES[23]則是在主機PCI Express總線和被測系統(tǒng)之間使用了一個定制的低延遲的FPGA 橋.通過定制的低延遲FPGA 橋,SURROGATES的系統(tǒng)與外設硬件之間的轉發(fā)和狀態(tài)傳輸速度更快、更穩(wěn)定,但同時提高了硬件成本.“硬件在環(huán)”本質上并不是實現(xiàn)外設仿真,而是通過轉發(fā)硬件操作到真實設備而繞過外設仿真這一難題.因此,理論上其可以實現(xiàn)更準確的仿真執(zhí)行效果,但受限于真實設備硬件的效率,硬件在環(huán)的固件仿真器難以支持模糊測試自動化測試,效率過低.盡管從AVATAR 到Inception 不斷優(yōu)化硬件在環(huán)的固件仿真器運行效率,但是依舊不能滿足如今大規(guī)模固件自動動態(tài)分析的需要.
2019 年Pretender[25]試圖將硬件在環(huán)和外設仿真分開.即首先記錄固件在硬件在環(huán)時真實的硬件反饋,然后利用機器學習來生成不同的外設仿真模型從而支持全系統(tǒng)固件仿真.然而Pretender 仍然需要硬件依賴,在實際固件分析中分析人員難以獲得原始的真實硬件設備.
2.3.2 基于人為假設的外設仿真模型
2020 年的P2IM[26]提出無硬件依賴的自動化外設仿真模型構建方法,其根據(jù)固件對外設的使用模式來推測外設寄存器類型,繼而利用更加不同的外設寄存器類別來建立不同的外設反饋模型.實踐證明,該方法可以成功重新托管外設簡單的嵌入式設備固件.但由于其人為假設無法處理外設,特別是針對復雜的初始化判斷時,其寄存器類別常常推斷錯誤,成功率較低.2021 年的DICE[30]采取了類似的方法,通過對DMA 訪問模式建模來自動化構建DMA 仿真模型,從而使固件仿真能夠支持基于DMA 的外設.但其同樣受限于過多的人為假設,無法適用于以太網和USB 等復雜設備的DMA 傳輸模擬.
2.3.3 基于符號執(zhí)行的外設仿真模型
基于符號執(zhí)行的外設仿真模型是指利用符號執(zhí)行探索可達的路徑范圍,從而生成對應的路徑約束來作為外設反饋模擬,代表性工作包括Laelaps[36],μEmu[27],Jetset[28].
2020 年,Laelasps[36]首先提出結合符號執(zhí)行來進行外設反饋模擬的方案,即遇到未知外設讀取則返回符號值,然后利用符號執(zhí)行探索一定范圍內的后續(xù)程序執(zhí)行路徑,從而確定合理的執(zhí)行路徑.但這種仿真一直需要符號執(zhí)行在執(zhí)行循環(huán)中,實際開銷成本過大,特別是具體執(zhí)行和符號執(zhí)行切換時.
2021 年的μEmu[27]提出通過觀察程序的異常狀態(tài)從而自動化判斷合理的執(zhí)行路徑,從而將其外設建模與模擬執(zhí)行分離.即首先利用符號執(zhí)行的學習合理路徑約束生成外設反饋知識庫,進而在仿真執(zhí)行時利用此靜態(tài)知識庫即可,無需持續(xù)切換符號執(zhí)行狀態(tài),避免了LaeLaps 的性能開銷問題,并且其相比人為假設模型準確度更高.與μEmu 相似的基于路徑約束條件來實現(xiàn)固件重新托管的工作是2021 年的Jetset[28],Jetset 使用符號執(zhí)行自動推斷嵌入式設備固件對其目標硬件的期望行為,并使用這種推斷的行為來合成可用于在模擬器中執(zhí)行固件的目標硬件設備的模型,從而實現(xiàn)固件的重新托管,它通過基于增量控制流圖構建的搜索策略引導符號執(zhí)行保證固件運行.
2.3.4 基于模糊測試反饋的外設仿真模型
雖然基于符號執(zhí)行生成的路徑約束可以支持構建外設仿真模型,但2022 年的Fuzzware[32]指出基于符號執(zhí)行路徑約束的仿真方案會過度限制可達路徑,導致模糊測試時難以覆蓋到一些特定程序執(zhí)行路徑.為了提高代碼覆蓋率,F(xiàn)uzzware 提出了結合模糊測試的外設反饋方案,即只使用符號執(zhí)行生成粗粒度的外設反饋約束,而不是直接使用路徑約束的具體值,在模糊測試階段允許輸入各種滿足約束的變異值,從而探索更多的可達路徑.此方案相比于之前的基于符號執(zhí)行路徑約束的外設仿真模型,其在模糊測試階段代碼覆蓋率提高更大,但也引入了更多的誤報和漏報.
2023 年的Ember-IO[33]進一步提出了全模糊測試反饋方案,即不生成外設仿真模型,所有硬件輸入均通過模糊測試生成,只是利用代碼覆蓋率更大的模糊測試值進行緩存來提高模糊測試的執(zhí)行速度,從而進一步快速提高代碼覆蓋率,但與此同時引入了更多的誤報和漏報.
2.3.5 硬件手冊的外設仿真模型構建
2022 年的SEmu[31]指出之前的通用外設仿真模型無論是基于假設、符號執(zhí)行或者是模糊測試均缺少真實外設的硬件邏輯如中斷觸發(fā)時機,因此只能實現(xiàn)近似的外設仿真,應用模糊測試時的誤報和漏洞較高.為了進一步提高外設仿真模型的自動化,SEmu 利用自然語言處理技術將人類語言中的外設行為描述語句轉換為一組結構化條件動作規(guī)則,然后通過運行時正確執(zhí)行和鏈接這些規(guī)則,從而自動為固件執(zhí)行期間訪問的每個外設動態(tài)建立一個外設模型,以此在簡單外設上達到接近100%的基本塊級別的真機一致性.
表2 總結了目前最新的和經典的固件仿真器的分類及其核心技術特點.
Table 2 Classification and Feature of Common Firmware Emulators表2 常見的固件仿真器類別與特性
保真度是固件重新托管工作中非常重要的屬性,所以本文決定引入指令執(zhí)行保真度和數(shù)據(jù)內存保真度這二維保真度來對各種分析工具進行分類.這種分類下,我們不用詳細區(qū)分DRAM、SRAM、閃存等各種內存,只需要簡單區(qū)分內部內存和外部內存即可,其中外部內存可以被認為是外設.根據(jù)仿真器在仿真嵌入式設備與真實嵌入式系統(tǒng)運行的匹配程度,本文參考Wright 等人[15]的分類方法,將仿真器的執(zhí)行仿真度分為黑盒執(zhí)行保真度、模塊執(zhí)行保真度、函數(shù)執(zhí)行保真度、基本塊執(zhí)行保真度、指令級執(zhí)行保真度、周期級執(zhí)行保真度、完美執(zhí)行保真度.數(shù)據(jù)和內存保真度則是從最粗糙的粒度到最精細的粒度分為黑盒數(shù)據(jù)內存保真度、內存級數(shù)據(jù)內存保真度、寄存器級數(shù)據(jù)內存保真度和完美數(shù)據(jù)內存保真度.
保真度的分類是從嵌入式固件的角度看嵌入式設備固件仿真時的執(zhí)行過程和內存與真實的嵌入式硬件設備的一致程度.執(zhí)行保真度是指嵌入式固件的指令執(zhí)行與真實的嵌入式固件指令執(zhí)行相比,是完全相同的指令執(zhí)行還是只保證外部行為模式相同而不保證指令執(zhí)行的順序和內容相同.數(shù)據(jù)內存保真度是指嵌入式固件在運行時各個周期的數(shù)據(jù)和內存與真實的嵌入式固件相比,是保證各個寄存器中的數(shù)據(jù)與真實嵌入式設備完全相同還是只保證輸入和輸出的數(shù)據(jù)與嵌入式設備完全相同.
黑盒執(zhí)行保真度的仿真器在執(zhí)行層面表現(xiàn)出和真實嵌入式系統(tǒng)運行相同的外部行為模式,但是它的內部可能僅執(zhí)行與真實嵌入式系統(tǒng)執(zhí)行的部分指令,或者直接不執(zhí)行與真實嵌入式系統(tǒng)執(zhí)行的任何相似指令.模塊執(zhí)行保真度會提供模塊級別的保真度,例如Firmadyne[18]直接將原始固件的內核替換成自己的內核,固件的某些模塊未被修改就執(zhí)行,并且其他模塊都被替換,所以這類固件重新托管技術僅提供模塊級別的執(zhí)行保真度.函數(shù)執(zhí)行保真度是在函數(shù)級別對真實嵌入式系統(tǒng)進行建模,例如HALucinator[34]替換了函數(shù)級別的硬件抽象層調用,以實現(xiàn)外設的建模仿真.基本塊執(zhí)行保真度和指令級執(zhí)行保真度分別是指仿真器在基本塊層面和指令級層面精準地仿真嵌入式系統(tǒng).周期級執(zhí)行保真度則是完全模擬處理器指令周期,這是當前仿真器最高級別的執(zhí)行保真度.完美執(zhí)行保真度是指完全一致地仿真真實嵌入式系統(tǒng)的執(zhí)行過程,但當前仿真器無法做到.
黑盒數(shù)據(jù)內存保真度意味著仿真器只有外部可見的數(shù)據(jù)是和真實嵌入式系統(tǒng)的數(shù)據(jù)相同的,即仿真器只能保證給定與真實嵌入式系統(tǒng)相同的輸入時相同的輸出.內存級數(shù)據(jù)內存保真度則是指在固件運行的每個執(zhí)行點,仿真器的隨機存取存儲器等內部存儲器與真實嵌入式設備的內部存儲器一致.寄存器級數(shù)據(jù)內存保真度則是指內部存儲器和寄存器在較高的執(zhí)行保真度下都是正確的.而完美數(shù)據(jù)內存保真度則是指所有存儲組件在所需的執(zhí)行保真度級別上與給定的真實嵌入式系統(tǒng)完全一致,這是極為困難的,當前仿真器無法完美做到該級別數(shù)據(jù)內存保真度.
劃分完具體的執(zhí)行保真度和數(shù)據(jù)內存保真度后,本文為每個固件仿真器分配它的執(zhí)行保真度和數(shù)據(jù)內存保真度.當然,每個固件仿真器都是在權衡自己需要解決的問題以及固件仿真器的性能和復雜性等方面之后選擇的特定保真度.因為過高的保真度通常意味著較低的性能和較高的復雜性,所以根據(jù)保真度對不同固件仿真器進行分類并不是對固件仿真器的好壞進行分類,利用保真度對固件仿真器進行評估的目的是加深對不同固件仿真器間區(qū)別的理解.
如表3 所示,Simics[44]和Ghidra Emulator[20]屬于指令級仿真,所以其具有指令級執(zhí)行保真度,指令執(zhí)行的特點使得Simics 和Ghidra Emulator 在數(shù)據(jù)內存保真度方面具有寄存器級數(shù)據(jù)內存保真度,它們屬于保真度極高的指令仿真器.而QEMU[17]只支持基本塊級別的指令譯碼,所以QEMU 的執(zhí)行保真度和數(shù)據(jù)內存保真度都略低于Simics 和Ghidra Emulator仿真器,屬于基本塊執(zhí)行保真度和內存級數(shù)據(jù)內存保真度.AVATAR2[35],Inception[48],SURROGATES[23]和PROSPECT[22]這些硬件在環(huán)仿真器,因為含有真實硬件,所以具有較高的執(zhí)行保真度和數(shù)據(jù)內存保真度.
Table 3 Firmware emulator evaluation表3 固件仿真器評估
對于替換類型的固件仿真器,如HALucinator[34],其等效替換了硬件仿真功能,因此其雖然無法達到內存級別的數(shù)據(jù)一致性,但高于黑盒級別的功能一致性.
最后,對于通用外設仿真模型,其大多僅適用于模糊測試,只需保證程序控制流的基本一致性,數(shù)據(jù)層面大多低于黑盒級別,即無法仿真真實的硬件輸出和功能,特別是對基于模糊測試反饋的外設仿真工具,如Fuzzware[32]等.此外,雖然Pretender[25]使用了硬件記錄來生成仿真模型,其仿真模型的準確度相比無硬件依賴的方案有所提高,但其本質并未理解硬件本身的邏輯,因此其數(shù)據(jù)保真度無法達到內存級別.相比之下,SEmu[31]借助硬件手冊,按照真實硬件邏輯生成反饋,其數(shù)據(jù)保真度大多數(shù)情況下可以到達內存級別.
不同的嵌入式固件仿真器各有優(yōu)劣,使用者的需求不同,適合的固件仿真器也不同.如果單純考慮仿真執(zhí)行的準確度,可以考慮將實際硬件與仿真結合使用,那么AVATAR[21],AVATAR2[35],PROSPECT[22],SURROGATES[23],Muench[49]或Inception[48]這些“硬件在環(huán)”的固件仿真器,雖然不具備大規(guī)模自動化分析的能力,但是在人工配置成功后,可提供最接近真實硬件的仿真調試環(huán)境.
如果研究人員目標僅為支持固件模糊測試并且沒有原始設備,那么可以選擇通用的外設仿真器進行測試,例如P2IM[26],μEmu[27],Jetset[28],DICE[30],F(xiàn)uzzware[32],Ember-IO[33],但存在需要人為處理誤報的問題,特別是基于純模糊測試反饋的外設仿真方案.雖然P2IM,μEmu,Jetset,Pretender 等仿真器的數(shù)據(jù)內存保真度有所降低,但是其自動化程度較高,對使用人員的門檻更低.如果需要考慮兼容固件仿真器的保真度,并且不考慮驅動層面的代碼測試的話,HALucinator 等基于函數(shù)替換的固件托管效率和準確度更高.如果同時需要測試驅動代碼,那么最新的SEmu 固件仿真器將是最好的選擇,即使需要一定程度的人工成本來修正自然語言處理的結果是錯誤的.
雖然近年來業(yè)界對嵌入式設備固件仿真以及相關動態(tài)安全分析技術研究的逐漸興起,并取得了一定的進展,然而由于物聯(lián)網設備海量、異構和閉源等問題,相比于通用計算機軟件,該領域仍處于起步階段,面臨諸多開放性技術挑戰(zhàn),亟待進一步研究.本節(jié)通過對大量工作的總結分析,指出現(xiàn)階段固件仿真技術特別是針對安全的五大關鍵挑戰(zhàn)討論相應的解決方案,并在圖6 中展示五大挑戰(zhàn)對應的研究機遇.
現(xiàn)階段大多數(shù)固件動態(tài)仿真器均需要開發(fā)者配置固件的基本內存布局、起始地址等信息,或者假設固件為elf 等包含符號表或完整動態(tài)運行所需信息格式的固件.但對于真實設備中保存的固件,通常為去除符號信息的純二進制固件,其加載內存地址、起始運行地址的定義根據(jù)不同的微處理器型號均有所不同.同時,一些設備的啟動代碼、功能代碼會分別編譯為不同的固件存放在不同的存儲器中.因此,真實設備固件代碼通常難以被提取完整.待分析的固件代碼會出現(xiàn)不完整和信息嚴重缺失的情況.此外,由于固件中語義缺失和硬件加載方式的差異,導致固件中包含的文件系統(tǒng)和其他關鍵代碼難以被提取和分析.
然而,固件動態(tài)仿真必須依賴例如固件指令集架構、入口地址、內存布局等這些基本信息才可正確運行.
1)指令集判定與文件系統(tǒng)提取.Binwalk[39]固件解包工具使用capstone 反匯編程序確定固件的指令集等基本信息并提取其包含的文件系統(tǒng).然而其只針對標準格式的Linux 系統(tǒng)的elf 文件,對于更多未知架構和系統(tǒng)例如Vxworks 固件等,目前仍然難以實現(xiàn)自動化固件指令集準確判斷與文件系統(tǒng)還原.
2)內存布局與基址獲取.Firmadyne[18]和Costin等人[41]基于Linux 的工具通過QEMU 定制Linux 內核統(tǒng)一的運行基址.然而針對其他系統(tǒng)固件,業(yè)界并沒有提供有效的解決方案.
3)固件入口點獲取.Ghidra 和IDA[50]針對二進制的固件具有掃描二進制文件的腳本,試圖查找函數(shù)序言指令和函數(shù)返回等信息,生成并分析有向函數(shù)調用圖,調用圖中弱連接組件的任何根節(jié)點都可以被視為潛在的入口點.雖然固件通常具有多個有效的入口點,但是也必須從調用圖技術返回的多個入口點中識別正確的仿真入口點.Firmadyne[18]和Costin等人[41]依舊是使用替換內核的方法成功繞過了尋找入口點.
這些基礎信息缺失大大限制了現(xiàn)階段學術界研發(fā)的動態(tài)分析工具面對真實固件的實用性.如何結合靜態(tài)分析技術例如通過對固定編譯變量的分析確定基址等方法實現(xiàn)自動化提取和補充構建豐富的固件信息知識庫成為現(xiàn)階段固件仿真器需要首先解決的技術難題之一.
現(xiàn)階段雖然研究人員提出了多種自動化外設模型構建方案,但面對復雜的真實嵌入式設備特別是一些自定義硬件設備時,這些自動化構建技術的適用性會大大降低,與真實設備的一致性(保真度)也會大大下降,現(xiàn)階段還有沒有任何一個工具可以準確自動化構建例如USB,WiFi 一類的復雜外設.基于低保真度外設仿真模型的固件模擬與動態(tài)分析平臺應用的漏洞檢測技術效率和準確度均會大大下降.因此,現(xiàn)階段面對復雜設備的固件分析仍然以人工輔助的靜態(tài)分析為主,或者是人工定制化外設仿真模型.如何保證自動化以及脫離真實硬件環(huán)境下復雜外設仿真模型的高精度復現(xiàn)仍然是現(xiàn)階段固件仿真技術面臨的主要技術瓶頸.
隨著固件仿真技術的發(fā)展,如本文第2 節(jié)介紹這些仿真方案大多面向不同層次,例如基于Linux 系統(tǒng)或硬件抽象層的替換方案和直接面向外設硬件仿真方案,或面向不同應用場景如MetaEmu 主要針對車機汽車控制單元,因此,其適用范圍和適用類型各不相同,導致其針對不同的測試集效果差異大、穩(wěn)定性不足.因此,對于固件模擬器的可擴展性主要分為2個方面,一方面是仿真平臺是否能夠兼容并且容易擴展到其他硬件架構的固件中,另一方面是仿真平臺是否能夠支持不同的或者新的動態(tài)分析技術,特別是模糊測試以外的技術,例如符號執(zhí)行、污點分析等.
現(xiàn)階段的固件仿真器大多僅針對特定架構例如ARM Cortex-M 以及特定的動態(tài)分析工具例如模糊測試技術.因此,對于固件仿真器的可擴展性主要可分為2 個方面:1)仿真平臺是否能夠兼容并且容易擴展到其他硬件架構的固件中;2)仿真平臺是否能夠支持不同的或者新的動態(tài)分析技術,特別是除了模糊測試以外的例如符號執(zhí)行、污點分析等技術.
目前,固件仿真器工作大多僅關注固件能否成功地在虛擬化環(huán)境下執(zhí)行,從而直接應用面向傳統(tǒng)軟件的動態(tài)分析技術來挖掘嵌入式固件中的漏洞.然而,由于固件自身的特性,專門用于仿真環(huán)境下的固件動態(tài)分析技術仍然有待進一步研究,其中包括模糊分析、污點分析和符號執(zhí)行[16].
1)模糊測試.需要針對性地設計一個可處理具有實時性要求的固件的模糊框架,并探索根據(jù)固件的時間敏感行為來確定測試案例生成的優(yōu)先級的策略;此外需要研究自動推斷和模擬固件特定的輸入格式或協(xié)議的技術,例如創(chuàng)建一個可以處理具有復雜或定制通信接口(如I2C、SPI 或CAN 總線)的固件的模糊測試解決方案,以提高嵌入式系統(tǒng)模糊測試的適用性.
2)污點分析.需要研究針對固件中特定數(shù)據(jù)類型、結構或編碼方案的污點傳播策略,以提高嵌入式系統(tǒng)中污點分析的精度和召回率;并且探索使用污點分析自動識別和跟蹤固件中敏感數(shù)據(jù)的技術,如加密密鑰或認證憑證等.
3)符號執(zhí)行.利用選擇性符號執(zhí)行、狀態(tài)合并或協(xié)同執(zhí)行等技術[51-58],研究為大型或復雜固件擴展符號執(zhí)行的策略;探索識別并模擬固件運行的特定假設或約束(如硬件配置、時鐘速率或中斷優(yōu)先級)的方法,以實現(xiàn)更準確和高效的符號執(zhí)行.
面對日益嚴峻的嵌入式設備安全威脅,自動化嵌入設備漏洞檢測與分析成為迫在眉睫的安全需求.嵌入設備固件仿真已經成為嵌入式設備固件動態(tài)分析的首選方案.本文對嵌入式設備固件仿真器進行了全面總結,系統(tǒng)介紹了固件仿真器的發(fā)展歷程以及工作流程基礎信息,幫助讀者更好地理解固件仿真器.然后對固件仿真器進行分類和評估,幫助固件仿真器使用者根據(jù)不同需求來選擇適合的固件仿真器.最后對固件仿真器面臨的挑戰(zhàn)和機遇進行展望.為實現(xiàn)自動高效的安全分析,固件仿真器既需要追求自動化,又需要有較高的保真度.早期的固件仿真器在自動化和保真度方面往往不能兼得,現(xiàn)階段隨著程序分析與人工智能技術的不斷發(fā)展,同時具備高自動化、高保真度和廣泛適用的固件仿真分析平臺將成為未來研究的熱點.
作者貢獻聲明:張浩負責論文的整體撰寫;申珊靛、劉鵬、楊澤霖負責部分章節(jié)的撰寫;周威、張玉清負責論文的指導和修改.