王麗娜,張?jiān)龉猓瑥?桐,陳 思
空天信息安全與可信計(jì)算教育部重點(diǎn)實(shí)驗(yàn)室,武漢大學(xué)國(guó)家網(wǎng)絡(luò)安全學(xué)院,湖北 武漢 430072
當(dāng)前,隨著物聯(lián)網(wǎng)技術(shù)的不斷發(fā)展,嵌入式設(shè)備被廣泛應(yīng)用于各行各業(yè)中[1],例如汽車(chē)、醫(yī)療等領(lǐng)域。這些嵌入式設(shè)備通常將軟件驅(qū)動(dòng)的微控制器與外圍設(shè)備結(jié)合在一起,運(yùn)行在此類(lèi)設(shè)備上的軟件又稱(chēng)為固件。與傳統(tǒng)個(gè)人計(jì)算機(jī)中的處理器相比,微控制器體積小、能耗低、擴(kuò)展性強(qiáng),非常適合被嵌入到系統(tǒng)中執(zhí)行特定的任務(wù),但這是以增加有限的處理資源為代價(jià)的,會(huì)導(dǎo)致嵌入式設(shè)備更加難以編程和與外界進(jìn)行交互。近年來(lái),由于設(shè)備制造商對(duì)安全設(shè)計(jì)的忽視、設(shè)備固件更新不及時(shí)或難以更新等原因,越來(lái)越多的設(shè)備漏洞被披露[2,3]。因此,對(duì)嵌入式設(shè)備進(jìn)行安全性測(cè)試至關(guān)重要。
模糊測(cè)試是一種有效的漏洞挖掘技術(shù),該技術(shù)被廣泛應(yīng)用于網(wǎng)絡(luò)協(xié)議、瀏覽器、操作系統(tǒng)內(nèi)核、圖像處理、音視頻文件解析等各類(lèi)軟件的漏洞挖掘工作中,并產(chǎn)生了良好的效果。然而,現(xiàn)有的模糊測(cè)試無(wú)法直接應(yīng)用到固件測(cè)試中,這是因?yàn)楣碳ㄟ^(guò)外圍設(shè)備與外界進(jìn)行交互,缺少直接從外界獲取數(shù)據(jù)運(yùn)行的接口[4]。為了解決這一問(wèn)題,系統(tǒng)仿真、軟硬件結(jié)合和固件托管等三種固件測(cè)試技術(shù)被提出。系統(tǒng)仿真[5,6]對(duì)設(shè)備硬件進(jìn)行仿真以在不使用物理硬件的情況下對(duì)固件進(jìn)行測(cè)試,可以有效地利用現(xiàn)有的漏洞挖掘技術(shù)。軟硬件結(jié)合[7,8]既提供了可以有效利用現(xiàn)有漏洞挖掘技術(shù)的仿真環(huán)境,又可以使用實(shí)際的物理設(shè)備來(lái)處理無(wú)法仿真的外設(shè)請(qǐng)求。固件托管[9,10]通過(guò)分析嵌入式設(shè)備固件與外圍設(shè)備的交互來(lái)理解固件需要的外設(shè)輸入,用建模替代硬件,進(jìn)而在軟件層面上對(duì)固件進(jìn)行測(cè)試。因此通過(guò)以上三種技術(shù),模糊測(cè)試可直接應(yīng)用到固件測(cè)試中。
使用模糊測(cè)試技術(shù)對(duì)固件進(jìn)行測(cè)試稱(chēng)為固件模糊測(cè)試。當(dāng)前的一些固件模糊測(cè)試技術(shù)有IoTFuzzer[11]、RPFuzzer[12],它 們 重 點(diǎn) 研 究 的 是 如何在嵌入式設(shè)備固件上應(yīng)用模糊測(cè)試,而如何提升應(yīng)用的效果尚未有明確的案例。上述技術(shù)在測(cè)試固件時(shí)將AFL(American fuzzy lop)簡(jiǎn)單繼承并使用[13]。作為一個(gè)簡(jiǎn)單的灰盒模糊測(cè)試器,AFL并不擅長(zhǎng)突破復(fù)雜的路徑條件,因此測(cè)試用例進(jìn)入到固件執(zhí)行之后很難訪(fǎng)問(wèn)到新路徑。一個(gè)典型的例子是固件與外設(shè)進(jìn)行數(shù)據(jù)傳輸時(shí)通常使用校驗(yàn)和作為錯(cuò)誤校驗(yàn)機(jī)制以確保數(shù)據(jù)的完 整 性,例 如USART(universal asynchronous re?ceiver/transmitter)協(xié)議設(shè)置奇偶校驗(yàn)位,Modbus RTU協(xié)議使用16位的CRC(cyclic redundancy check)作為校驗(yàn),一般的模糊測(cè)試很難突破這一復(fù)雜的路徑條件。對(duì)此,F(xiàn)eng等[14]提出了固件模糊測(cè)試方案p2im(processor-peripheral interface modeling)。p2im的解決方法是通過(guò)逆向工程手動(dòng)將固件包含的校驗(yàn)和部分進(jìn)行注釋并重新編譯,以在測(cè)試階段獲得更多的代碼,這些工作需要那些擁有專(zhuān)業(yè)知識(shí)的人花費(fèi)大量時(shí)間完成。
針對(duì)校驗(yàn)和檢查這一復(fù)雜路徑條件,本文提出了一種高效省時(shí)的固件測(cè)試改進(jìn)方法,它可以被用于改進(jìn)現(xiàn)有的固件模糊測(cè)試方案。在測(cè)試固件時(shí),根據(jù)固件與外設(shè)交互使用的通信協(xié)議來(lái)修改模糊測(cè)試器產(chǎn)生的測(cè)試用例,使得測(cè)試用例在輸入到固件之后可以突破校驗(yàn)和檢查這一復(fù)雜的路徑條件。我們使用此方法對(duì)p2im方案進(jìn)行了改進(jìn),并通過(guò)測(cè)試兩個(gè)來(lái)自真實(shí)設(shè)備的固件來(lái)對(duì)比改進(jìn)前后的測(cè)試性能。
模糊測(cè)試器是被用來(lái)產(chǎn)生模糊測(cè)試所需的測(cè)試用例的,大部分模糊測(cè)試器實(shí)現(xiàn)復(fù)雜,但其基本工作流程和功能的相似度較高,存在較多共性[15]。AFL是一款基于覆蓋引導(dǎo)(coverage-guided)的模糊測(cè)試工具,它通過(guò)記錄輸入樣本的代碼覆蓋率,調(diào)整輸入樣本以提高覆蓋率,增加發(fā)現(xiàn)漏洞的概率。它可以配合QEMU(quick emulator)對(duì)閉源的二進(jìn)制文件進(jìn)行模糊測(cè)試[16],挖掘可能存在的內(nèi)存安全漏洞,如堆棧溢出、double free等。其工作流程[13]大致為:1)在源碼編譯程序時(shí)進(jìn)行插樁,記錄代碼覆蓋率;2)選擇一些輸入文件作為原始測(cè)試集加入輸入隊(duì)列;3)將隊(duì)列中的文件按一定的策略進(jìn)行“突變”;4)如果變異文件更新了覆蓋范圍,則將其保留并添加到隊(duì)列中;5)上述過(guò)程會(huì)一直循環(huán),期間使程序崩潰的文件會(huì)被記錄下來(lái)。
p2im提供了一種新的固件測(cè)試方法,其思想在于提取固件處理器和外設(shè)寄存器之間的數(shù)據(jù)傳遞模式,構(gòu)造出模塊化的寄存器行為邏輯,并因此在處理器訪(fǎng)問(wèn)外設(shè)寄存器時(shí)正確判斷傳遞的數(shù)據(jù)類(lèi)型和大小,從而在保證固件正常運(yùn)行的前提下實(shí)現(xiàn)直接和模糊測(cè)試產(chǎn)生的輸入對(duì)接。其工作流程分為兩步:1)模型抽象。以ARM Cortex-M[17]架構(gòu)為例,根據(jù)外設(shè)寄存器在固件執(zhí)行邏輯中的具體功能,p2im將所有寄存器分為4個(gè)種類(lèi),即控制寄存器、狀態(tài)寄存器、數(shù)據(jù)寄存器和控制&狀態(tài)寄存器,并分別得到每個(gè)種類(lèi)寄存器與固件處理器傳輸數(shù)據(jù)時(shí)的訪(fǎng)問(wèn)模式和處理策略。2)模型實(shí)例化。在得到各種寄存器的訪(fǎng)問(wèn)模式和處理策略后,p2im在支持ARM Cortex-M指令集的QEMU中運(yùn)行固件代碼,在發(fā)現(xiàn)固件嘗試訪(fǎng)問(wèn)外設(shè)寄存器時(shí),識(shí)別出寄存器種類(lèi),并根據(jù)應(yīng)對(duì)策略返回合適的值。除此之外,外設(shè)和固件之間還會(huì)通過(guò)中斷來(lái)傳遞數(shù)據(jù)。p2im在處理中斷時(shí),先收集目前能夠觸發(fā)的所有中斷,然后簡(jiǎn)單地每隔一段固定代碼基本塊按順序觸發(fā)一個(gè)中斷。
嵌入式固件在與外界進(jìn)行數(shù)據(jù)交互的過(guò)程中,通常使用校驗(yàn)和檢查機(jī)制以確保數(shù)據(jù)的可靠性。圖1展示了校驗(yàn)和檢查在固件中的應(yīng)用,固件在從外設(shè)獲得數(shù)據(jù)之后對(duì)其進(jìn)行校驗(yàn)和檢查,只有通過(guò)校驗(yàn)和檢查后才能夠繼續(xù)執(zhí)行其他任務(wù)。
圖1 校驗(yàn)和檢查在固件中的應(yīng)用Fig.1 Checksum check in firmware
現(xiàn)有的固件測(cè)試方案p2im直接使用AFL生成的數(shù)據(jù)作為固件的輸入進(jìn)行測(cè)試。由于AFL生成數(shù)據(jù)的過(guò)程是隨機(jī)的,當(dāng)其對(duì)具有校驗(yàn)和檢查的固件進(jìn)行測(cè)試時(shí),測(cè)試用例很難通過(guò)校驗(yàn)和檢查。以Modbus RTU通信協(xié)議使用的16位CRC為例,在簡(jiǎn)單考慮數(shù)據(jù)部分不變的情況下AFL生成正確校驗(yàn)和的概率為2-16,即AFL產(chǎn)生的測(cè)試用例將極難通過(guò)固件的校驗(yàn)和檢查。針對(duì)這種情況,p2im的處理方法為刪除固件中的校驗(yàn)和檢查部分代碼。由于p2im是針對(duì)固件二進(jìn)制文件進(jìn)行測(cè)試的,而且固件的源代碼很難獲得,這種方法需要擁有專(zhuān)業(yè)知識(shí)的人對(duì)固件二進(jìn)制文件進(jìn)行逆向分析,將固件中的校驗(yàn)和檢查部分進(jìn)行注釋之后重新編譯固件進(jìn)行測(cè)試,因此會(huì)帶來(lái)大量的人力和時(shí)間成本。
針對(duì)AFL產(chǎn)生的測(cè)試用例極難通過(guò)固件校驗(yàn)和檢查的問(wèn)題,本文的解決思路為對(duì)AFL生成的測(cè)試用例進(jìn)行一定的修改,使得測(cè)試用例能夠成功通過(guò)固件的校驗(yàn)和檢查。固件往往以二進(jìn)制文件的形式存在,因此不能夠根據(jù)固件源代碼去分析固件所使用的校驗(yàn)和檢查格式。但是通過(guò)查看固件的相關(guān)文檔,可以獲得固件與外界進(jìn)行數(shù)據(jù)交互的通信協(xié)議,通信協(xié)議規(guī)定了數(shù)據(jù)的格式以及校驗(yàn)和檢查機(jī)制。在獲得固件對(duì)輸入數(shù)據(jù)格式的要求之后,可以使用一個(gè)后處理程序?qū)FL產(chǎn)生的測(cè)試用例中的校驗(yàn)和部分進(jìn)行修改,使其在測(cè)試時(shí)可以成功通過(guò)固件的校驗(yàn)和檢查。這種方法簡(jiǎn)單高效,避免了對(duì)固件二進(jìn)制文件進(jìn)行復(fù)雜耗時(shí)的逆向工程。
AFL提供了一個(gè)后處理程序的接口,數(shù)據(jù)生成程序可以調(diào)用后處理程序來(lái)對(duì)所有變異的測(cè)試用例進(jìn)行最終清理。具體來(lái)說(shuō),AFL將為每個(gè)突變的輸出緩沖區(qū)調(diào)用后處理函數(shù),用戶(hù)可以對(duì)測(cè)試用例進(jìn)行修改。
通過(guò)查看固件的說(shuō)明文檔獲得固件所使用的通信協(xié)議,在明確固件與外設(shè)之間傳輸數(shù)據(jù)的格式之后,利用一個(gè)后處理程序?qū)FL生成的測(cè)試用例進(jìn)行相應(yīng)的修改,使得每次產(chǎn)生的測(cè)試用例都符合數(shù)據(jù)格式要求。我們?cè)O(shè)計(jì)的后處理程序流程為:1)分配適當(dāng)大小的緩沖區(qū),并將測(cè)試用例移到該緩沖區(qū)中;2)根據(jù)固件使用通信協(xié)議的格式讀取數(shù)據(jù)并計(jì)算校驗(yàn)和;3)使用新計(jì)算的校驗(yàn)和覆蓋原始校驗(yàn)和;4)返回新的緩沖區(qū)指針。
圖2展示了使用本文提出方法對(duì)p2im方案改進(jìn)后的固件測(cè)試框架??蚣芤砸粋€(gè)固件二進(jìn)制文件作為輸入,使用QEMU運(yùn)行固件,之后對(duì)處理器外設(shè)接口建模。在發(fā)現(xiàn)固件嘗試訪(fǎng)問(wèn)外設(shè)寄存器時(shí),識(shí)別出寄存器種類(lèi)并將每個(gè)外設(shè)寄存器以及寄存器之間的相互依賴(lài)關(guān)系映射到內(nèi)存中。在運(yùn)行時(shí),模糊測(cè)試器生成的測(cè)試用例經(jīng)過(guò)我們?cè)O(shè)計(jì)的后處理程序處理后,通過(guò)數(shù)據(jù)寄存器訪(fǎng)問(wèn)進(jìn)入固件執(zhí)行,固件在獲得輸入數(shù)據(jù)后對(duì)數(shù)據(jù)進(jìn)行校驗(yàn)和檢查,校驗(yàn)成功之后執(zhí)行相應(yīng)功能對(duì)數(shù)據(jù)進(jìn)行處理。并將QEMU收集的代碼覆蓋信息返回給模糊測(cè)試器。
圖2 本文固件測(cè)試框架Fig.2 The firmware test framework of this paper
使用經(jīng)本文方法對(duì)p2im改進(jìn)后的固件測(cè)試方案(improved p2im,Ip2im)對(duì)固件進(jìn)行24小時(shí)的測(cè)試,通過(guò)對(duì)比Ip2im與p2im方案的固件測(cè)試結(jié)果來(lái)評(píng)估本方法的效果。除此之外,我們還手動(dòng)驗(yàn)證了Ip2im可以在固件測(cè)試時(shí)繞過(guò)固件的校驗(yàn)和檢查。
選 擇PLC(programmable logic controller)和Heat Press這兩個(gè)在真實(shí)環(huán)境下使用的固件進(jìn)行測(cè)試,不對(duì)其固件二進(jìn)制文件做任何的修改。通過(guò)查看固件的相關(guān)文檔,發(fā)現(xiàn)它們通過(guò)串行端口連接到總線(xiàn)上,使用Modbus RTU通信協(xié)議與外設(shè)進(jìn)行數(shù)據(jù)交互,獲得數(shù)據(jù)之后都會(huì)對(duì)其進(jìn)行校驗(yàn)和檢查。對(duì)這兩個(gè)固件的說(shuō)明如下。
1)PLC:可編程控制器是一種堅(jiān)固耐用的嵌入式設(shè)備,用于控制生產(chǎn)流程。我們選擇的固件是消毒機(jī)的一部分,并通過(guò)工業(yè)通信協(xié)議Modbus管理PLC與遠(yuǎn)程SCADA(supervisory control and data acquisition)系統(tǒng)的通信[18]。
2)Heat Press:該固件對(duì)應(yīng)于紡織品升華生產(chǎn)線(xiàn)中使用的工業(yè)熱壓機(jī)。固件實(shí)現(xiàn)了配方管理器,用于控制升華過(guò)程的溫度、時(shí)間和壓力。該系統(tǒng)具有觸摸屏和一個(gè)使用Modbus協(xié)議的遠(yuǎn)程工業(yè)I/O通道。
表1是Ip2im和p2im基本塊覆蓋率對(duì)比。與p2im相比,Ip2im在對(duì)兩個(gè)固件的測(cè)試中基本塊覆蓋率都有提升。在對(duì)PLC的測(cè)試中Ip2im的基本塊覆蓋率比p2im的高3.01%;在對(duì)Heat Press的測(cè)試中Ip2im的基本塊覆蓋率比p2im的高5.81%。表2展示了兩種固件測(cè)試方案函數(shù)覆蓋率的對(duì)比。從表2中看Ip2im固件的函數(shù)覆蓋率比p2im的也有提高,這是因?yàn)楣碳赽oot階段訪(fǎng)問(wèn)了大量的函數(shù)進(jìn)行自檢,此類(lèi)函數(shù)不會(huì)對(duì)輸入數(shù)據(jù)進(jìn)行操作?;緣K覆蓋率和函數(shù)覆蓋率的提升表明使用本文提出的改進(jìn)方法可以覆蓋固件的更多代碼。通過(guò)反匯編工具Ghidra[19]查看多出的代碼,發(fā)現(xiàn)它們是固件對(duì)輸入數(shù)據(jù)進(jìn)行相應(yīng)處理的部分,可見(jiàn)測(cè)試用例已經(jīng)通過(guò)了固件的校驗(yàn)和檢查。經(jīng)過(guò)后續(xù)實(shí)驗(yàn)我們發(fā)現(xiàn),在多出的代碼中對(duì)輸入數(shù)據(jù)進(jìn)行處理時(shí)沒(méi)有對(duì)數(shù)組邊界進(jìn)行很好地檢查,固件在執(zhí)行到這里的時(shí)候出現(xiàn)了緩沖區(qū)溢出,程序發(fā)生崩潰。
表1 基本塊覆蓋率對(duì)比Table 1 Comparison of basic block coverage%
表2 函數(shù)覆蓋率對(duì)比Table 2 Comparison of function coverage %
固件測(cè)試的目的是盡可能多地去探索固件可能存在的路徑,得到使得固件崩潰或掛起的測(cè)試用例,進(jìn)而去發(fā)掘固件可能存在的漏洞。圖3是兩種方案在固件測(cè)試過(guò)程中探索的路徑數(shù)量對(duì)比,在使用Ip2im之后,路徑數(shù)量有了顯著的增加,這是由于測(cè)試用例只有在通過(guò)固件的校驗(yàn)和檢查之后才能探索更多的路徑,執(zhí)行固件更多的功能。圖4展示了在測(cè)試中引起固件程序崩潰的測(cè)試用例數(shù)量。從圖4可以看出,使用Ip2im后顯著提升了測(cè)試用例數(shù)量,為之后挖掘新的漏洞提供了可能。
圖3 固件測(cè)試中兩種方案探索的路徑數(shù)量Fig.3 The number of paths explored in the firmware test of the two schemes
圖4 固件測(cè)試產(chǎn)生崩潰時(shí)兩種方案測(cè)試用例數(shù)量Fig.4 The number of crash test cases generated by the firmware test of the two schemes
表3展示了固件測(cè)試發(fā)現(xiàn)的漏洞數(shù)量,p2im在PLC和Heat Press中都沒(méi)有發(fā)現(xiàn)漏洞,而Ip2im在PLC和Heat Press卻發(fā)現(xiàn)了漏洞。手動(dòng)分析漏洞的具體類(lèi)型見(jiàn)表4。表4的結(jié)果表明了Ip2im在實(shí)際應(yīng)用中的價(jià)值。
表3 兩種方案發(fā)現(xiàn)的漏洞數(shù)量Table 3 The number of bugs found with the two schemes
表4 Ip2im發(fā)現(xiàn)的漏洞Table 4 Bugs found with Ip2im
綜合以上的實(shí)驗(yàn)結(jié)果可知,本文提出的改進(jìn)方法在測(cè)試具有校驗(yàn)和檢查固件存在的問(wèn)題時(shí),不需要對(duì)固件二進(jìn)制文件進(jìn)行復(fù)雜、耗時(shí)的逆向處理,并且取得了較好的代碼覆蓋率,提升效果顯著。
本文研究了在測(cè)試具有校驗(yàn)和檢查這一復(fù)雜路徑條件的固件時(shí),現(xiàn)有固件測(cè)試方案存在的問(wèn)題,并給出了相應(yīng)的改進(jìn)方法。根據(jù)固件與外設(shè)交互使用的通信協(xié)議來(lái)修正模糊測(cè)試器生成的測(cè)試用例,進(jìn)而在測(cè)試時(shí)突破固件中的校驗(yàn)和檢查這一復(fù)雜路徑條件。我們使用該方法對(duì)固件測(cè)試方案p2im進(jìn)行了改進(jìn),并通過(guò)測(cè)試兩種具有校驗(yàn)和檢查的真實(shí)固件來(lái)評(píng)估本方法的效果。實(shí)驗(yàn)結(jié)果表明,在固件測(cè)試中使用此方法可以成功突破校驗(yàn)和檢查這一復(fù)雜的路徑條件,提升了基本塊覆蓋率和函數(shù)覆蓋率,并成功發(fā)掘了固件存在的漏洞。