國(guó)家保密局網(wǎng)站>>保密科技

嵌入式環(huán)境下代碼安全分析與研究

2025年02月20日    來(lái)源:國(guó)家保密科技測(cè)評(píng)中心【字體: 打印

【摘 要】 為有效提高嵌入式軟件在投入生產(chǎn)環(huán)境前發(fā)現(xiàn)潛在安全問(wèn)題的效率,本文對(duì)嵌入式環(huán)境下軟件開發(fā)中的代碼安全控制進(jìn)行了深入分析與研究,闡述了在資源受限環(huán)境下軟件安全測(cè)試的方法和技術(shù),并重點(diǎn)介紹了在軟件編譯鏈接之后,通過(guò)對(duì)二進(jìn)制文件進(jìn)行測(cè)試進(jìn)一步發(fā)現(xiàn)嵌入式軟件安全問(wèn)題的方法。

【關(guān)鍵詞】 嵌入式 代碼安全 模糊測(cè)試

1 引言

據(jù)調(diào)查顯示,全球嵌入式系統(tǒng)市場(chǎng)收入在6年內(nèi)增長(zhǎng)達(dá)40%,從2015年的1590億美元增長(zhǎng)到2021年的22534億美元。這一增長(zhǎng)的主要驅(qū)動(dòng)力是市場(chǎng)對(duì)節(jié)能、智能的電子設(shè)備日益增長(zhǎng)的需求。此外,行業(yè)提供的新可能性及在嵌入式系統(tǒng)中使用多核架構(gòu)提供的新應(yīng)用也加速了這種增長(zhǎng)。嵌入式系統(tǒng)是一種包含微處理器和軟件的電子產(chǎn)品,廣泛應(yīng)用于工業(yè)生產(chǎn)、醫(yī)療電子、汽車電子、網(wǎng)絡(luò)通信、軍事航天等領(lǐng)域。嵌入式系統(tǒng)一般都包含相對(duì)固定的組件,如芯片、閃存、固件等。組件組成主要包括硬件和軟件部分,其中軟件部分直接與硬件交互,因此對(duì)于其安全性和可靠性有著更高的要求。

近20年來(lái),有關(guān)嵌入式軟件的零日(0Day)漏洞層出不窮,而分析其中大多數(shù)漏洞成因往往是較為低級(jí)的錯(cuò)誤導(dǎo)致的。如果能在軟件的開發(fā)階段或應(yīng)用驗(yàn)證階段通過(guò)一系列測(cè)試方法及流程,將可能引發(fā)的安全問(wèn)題盡可能規(guī)避掉,將大大提高軟件的安全性。這一需求在無(wú)法經(jīng)常更新迭代的嵌入式環(huán)境下顯得尤為重要。本文將針對(duì)C/C++環(huán)境的嵌入式系統(tǒng)中常見的軟件安全問(wèn)題進(jìn)行討論,并介紹幾種常見的測(cè)試方法,以提高嵌入式軟件的安全性、健壯性。

2 嵌入式系統(tǒng)常見的安全問(wèn)題

在安全方面,針對(duì)嵌入式系統(tǒng)的攻擊可大體分為3類,分別是針對(duì)嵌入式軟件的攻擊、針對(duì)網(wǎng)絡(luò)的攻擊和側(cè)信道攻擊。本文將針對(duì)嵌入式軟件的安全問(wèn)題和幾種常見的影響系統(tǒng)穩(wěn)定性的編碼問(wèn)題進(jìn)行討論。

2.1 緩沖區(qū)溢出漏洞

緩沖區(qū)溢出是各類軟件中十分普遍的安全問(wèn)題,不僅在嵌入式軟件中存在,在其他應(yīng)用軟件和操作系統(tǒng)中也十分常見。表1為國(guó)家信息安全漏洞庫(kù)(CNNVD)收錄的2022年6月漏洞類型統(tǒng)計(jì)表,從表中可以看出緩沖區(qū)錯(cuò)誤類型漏洞占比高達(dá)8.4%。緩沖區(qū)溢出問(wèn)題的根本原因在于過(guò)于信任輸入,而沒(méi)有正確檢查動(dòng)態(tài)空間的邊界,開發(fā)者將長(zhǎng)于目標(biāo)的數(shù)據(jù)進(jìn)行拷貝,因此覆蓋了與目標(biāo)相鄰的區(qū)域。緩沖區(qū)溢出的問(wèn)題十分嚴(yán)重,可能導(dǎo)致目標(biāo)系統(tǒng)宕機(jī)、命令執(zhí)行等后果。實(shí)踐得出,緩沖區(qū)溢出可以發(fā)生在堆、棧、bss等存放變量的任何區(qū)域,攻擊者可以通過(guò)事先計(jì)算好的長(zhǎng)度構(gòu)造payload來(lái)修改函數(shù)的返回地址,或替換成惡意代碼的起始地址,以完成攻擊。

表1 2022年6月漏洞類型統(tǒng)計(jì)表(只截取前10種)

2.2 內(nèi)存泄漏

內(nèi)存泄漏是指程序中已被動(dòng)態(tài)分配的堆區(qū)內(nèi)存由于編程人員或者其他原因而未進(jìn)行釋放,造成的系統(tǒng)內(nèi)存浪費(fèi),內(nèi)存泄漏問(wèn)題并沒(méi)有泄漏大小之分,無(wú)論內(nèi)存泄漏多么輕微,都會(huì)導(dǎo)致程序運(yùn)行性能降低,最終將會(huì)在有限的時(shí)間內(nèi)消耗掉全部?jī)?nèi)存,導(dǎo)致系統(tǒng)的崩潰。內(nèi)存泄漏問(wèn)題在嵌入式系統(tǒng)下顯得格外重要,嵌入式系統(tǒng)的內(nèi)存資源通常比其他平臺(tái)要小得多,如果存在內(nèi)存泄漏問(wèn)題,將在更短的時(shí)間內(nèi)造成嚴(yán)重后果。

2.3 空指針引用

空指針引用顧名思義就是使用了一個(gè)沒(méi)有指向合法地址空間的指針,通常是由這個(gè)指針沒(méi)有被初始化、正確賦值或原本指針指向的內(nèi)存空間已經(jīng)被釋放等原因?qū)е碌?。如果編程人員在使用一個(gè)指針之前沒(méi)有對(duì)其進(jìn)行非空判斷,都有可能造成空指針引用,原因是在C/C++環(huán)境中即使使用了malloc/new內(nèi)存分配函數(shù)對(duì)其賦值,如果不對(duì)返回結(jié)果進(jìn)行檢查,也無(wú)法確保此時(shí)的內(nèi)存分配是成功的??罩羔樢脝?wèn)題比內(nèi)存泄漏問(wèn)題更為嚴(yán)重,因?yàn)榍罢呖赡軐?dǎo)致系統(tǒng)直接崩潰。

2.4 格式化字符串漏洞

格式化字符串漏洞主要利用C語(yǔ)言中print系列的函數(shù),如printf、sprintf、fprinf等C庫(kù)函數(shù)。格式化是為了控制顯示文本的樣式,如%d是以整數(shù)的形式輸出,%p打印指針地址等,在使用此類函數(shù)前,如果能給定預(yù)料之內(nèi)的參數(shù),并不會(huì)有任何安全問(wèn)題。但是若對(duì)輸入格式不進(jìn)行控制,支持用戶任意輸入,將會(huì)造成嚴(yán)重的安全問(wèn)題。其攻擊原理可以泄露特定寄存器和棧上的值,從而給攻擊者創(chuàng)造了發(fā)揮的空間,造成系統(tǒng)內(nèi)存信息泄露、控制代碼執(zhí)行邏輯、遠(yuǎn)程命令執(zhí)行(RCE)等嚴(yán)重后果。

3 嵌入式軟件安全測(cè)試的方法和技術(shù)

3.1 靜態(tài)測(cè)試

靜態(tài)測(cè)試主要通過(guò)靜態(tài)測(cè)試工具對(duì)軟件的源代碼進(jìn)行安全掃描,一般靜態(tài)測(cè)試常用的工具有Fortify SCA(Static Code Analyzer)、VCG(Visual Code Grepper)等。此類工具的基本思想都是從源代碼中提取原始特征,如字符串、基本塊、指令序列、語(yǔ)法樹、函數(shù)調(diào)用圖等,之后再對(duì)這些特征與先準(zhǔn)備的軟件安全規(guī)則庫(kù)進(jìn)行匹配來(lái)確定源代碼中是否存在相應(yīng)的漏洞。靜態(tài)分析是在不執(zhí)行源程序的情況下對(duì)代碼進(jìn)行安全檢測(cè)的方式,它包含很多方面的技術(shù),如控制流分析、數(shù)據(jù)流分析、常量傳播和指針?lè)治龅取lo態(tài)測(cè)試作為一種保證源代碼安全的測(cè)試方法,可以較為有效地檢測(cè)出空指針引用、格式化字符串等問(wèn)題,將軟件的安全問(wèn)題控制在編碼階段。靜態(tài)測(cè)試的流程如圖1所示。

圖1 靜態(tài)安全測(cè)試流程

3.2 動(dòng)態(tài)測(cè)試

動(dòng)態(tài)測(cè)試是針對(duì)軟件或系統(tǒng)非常有效的測(cè)試方法,同時(shí)也是使用最多的針對(duì)嵌入式設(shè)備的動(dòng)態(tài)漏洞分析技術(shù)。動(dòng)態(tài)測(cè)試是在真實(shí)環(huán)境或者模擬環(huán)境中對(duì)運(yùn)行中的程序通過(guò)對(duì)輸入進(jìn)行隨機(jī)變換,觀察在不同的輸入下程序的運(yùn)行結(jié)果,分析和判斷其結(jié)果是否滿足預(yù)期。例如,對(duì)于內(nèi)存泄漏問(wèn)題,通常可以使用一些開源的內(nèi)存泄漏掃描工具,在被測(cè)程序源碼中進(jìn)行插樁,檢查程序從開始到運(yùn)行結(jié)束的內(nèi)存釋放情況。當(dāng)然,無(wú)論何種工具,都存在誤報(bào)的情況,但使用工具的好處是可以盡量縮小范圍,再由研究人員分析當(dāng)前結(jié)果是否為安全問(wèn)題。

動(dòng)態(tài)測(cè)試在理論上幾乎可以驗(yàn)證所有存在的安全問(wèn)題,其誤報(bào)率也比靜態(tài)測(cè)試少。但是,動(dòng)態(tài)測(cè)試也存在著過(guò)于依賴程序運(yùn)行、程序分支路徑覆蓋不全、漏報(bào)等缺點(diǎn)。動(dòng)態(tài)測(cè)試還與測(cè)試人員的能力及測(cè)試用例的準(zhǔn)備密切相關(guān),如果被測(cè)系統(tǒng)規(guī)模過(guò)大,測(cè)試用例集合也隨之增大,則會(huì)導(dǎo)致漏報(bào)率提高。

3.3 嵌入式軟件二進(jìn)制模糊測(cè)試

靜態(tài)和動(dòng)態(tài)測(cè)試方法可能無(wú)法有效避免全部的安全問(wèn)題,若要進(jìn)一步挖掘安全問(wèn)題,還需要借助一些其他測(cè)試方法。發(fā)現(xiàn)嵌入式系統(tǒng)中的安全問(wèn)題是一項(xiàng)具有挑戰(zhàn)性的工作,因?yàn)榍度胧较到y(tǒng)與其他傳統(tǒng)計(jì)算機(jī)相比,具備體積小、可移植性好、直接與應(yīng)用程序集成等特點(diǎn);在運(yùn)行時(shí),它們占用較少的內(nèi)存資源和空間,而相應(yīng)的安全機(jī)制占用較多的存儲(chǔ)空間,降低了內(nèi)存的可利用率。因?yàn)樵谑芟薜那度胧较到y(tǒng)沒(méi)有額外的安全機(jī)制,模糊測(cè)試技術(shù)(Fuzz)作為尋找安全問(wèn)題最有效的手段之一,一直受到安全測(cè)試人員的青睞。在安全程序中使用模糊測(cè)試技術(shù)可以幫助發(fā)現(xiàn)系統(tǒng)中未知的漏洞。對(duì)于嵌入式環(huán)境下的安全測(cè)試,針對(duì)二進(jìn)制文件的模糊測(cè)試是十分必要的選擇,此方法可用來(lái)排除在編碼過(guò)程中出現(xiàn)的大部分安全問(wèn)題。模糊測(cè)試通過(guò)向目標(biāo)插入事先構(gòu)建的輸入來(lái)發(fā)現(xiàn)漏洞和故障,對(duì)于查找程序問(wèn)題的效率較高,如內(nèi)存錯(cuò)誤、空指針引用、格式化字符串、死鎖、無(wú)限循環(huán)、不當(dāng)?shù)馁Y源管理等。如圖2所示,二進(jìn)制模糊測(cè)試一般分為以下5個(gè)階段。

圖2 模糊測(cè)試一般流程

首先是準(zhǔn)備階段,將準(zhǔn)備好的被測(cè)二進(jìn)制格式文件進(jìn)行輸入;其次是模糊數(shù)據(jù)生成,一般模糊數(shù)據(jù)生成就是改變特定的數(shù)據(jù);接下來(lái)將模糊數(shù)據(jù)作為輸入進(jìn)行執(zhí)行和檢測(cè),如果未結(jié)束,將回到數(shù)據(jù)生成階段;周而復(fù)始,直至程序崩潰;最后生成報(bào)告。

在通過(guò)對(duì)二進(jìn)制代碼進(jìn)行模糊測(cè)試的過(guò)程中,測(cè)試人員可能面臨的難題是在不同的嵌入式環(huán)境下系統(tǒng)所產(chǎn)生的不同二進(jìn)制代碼,如不同的編譯器的代碼生成算法、不同的指令集等,導(dǎo)致安全測(cè)試人員難以通過(guò)相似性來(lái)判斷存在的安全問(wèn)題。為了克服這種困難,可以借助一些第三方開源模糊器加QEMU等仿真器對(duì)嵌入式環(huán)境下的二進(jìn)制代碼進(jìn)行模糊測(cè)試。目前常見的模糊器有以下2種。

(1)American Fuzz Lop

American Fuzz Lop(AFL)是一款基于覆蓋引導(dǎo)的模糊測(cè)試工具,其原理是通過(guò)記錄輸入樣本的代碼覆蓋率,從而調(diào)整輸入樣本以提高覆蓋率,提高發(fā)現(xiàn)漏洞的概率,AFL模糊器的工作流程大致如下:

①在編譯階段進(jìn)行插樁(在每個(gè)基本塊的開頭插入一段匯編代碼),用來(lái)記錄源碼的覆蓋率;

②選擇輸入文件,作為初始測(cè)試集;

③將讀入的文件按照策略進(jìn)行“變異”(按位反轉(zhuǎn)、替換邊界等);

④如果文件更新了范圍,將其保留;

⑤在循環(huán)以上步驟時(shí),若觸發(fā)了crash的文件,將被記錄。

(2)PTFuzzer

PTFuzzer是在AFL的基礎(chǔ)上實(shí)現(xiàn)的一款模糊測(cè)試工具,它采用了Intel Processor Trace硬件部件來(lái)收集程序執(zhí)行的路徑信息,優(yōu)化了原來(lái)AFL通過(guò)編譯插樁方式獲取程序執(zhí)行路徑信息的方法。由于AFL要Fuzz二進(jìn)制格式文件,需要借助QEMU的虛擬化支持,在這方面PTFuzzer要優(yōu)于AFL,但是PTFuzzer需要使用Intel系列芯片的PT支持,造成PTFuzzer有一定的局限性,導(dǎo)致在測(cè)試嵌入式軟件時(shí)可能需要解決嵌入式軟件的平臺(tái)支持問(wèn)題。

綜合比較以上工具特點(diǎn),使用QAFL(QEMU與AFL的組合)更適合針對(duì)嵌入式軟件進(jìn)行模糊測(cè)試,其原因是使用QAFL的組合不依賴于特定的芯片支持,能夠保證在多變的嵌入式環(huán)境下順利進(jìn)行軟件的模糊測(cè)試。

使用二進(jìn)制Fuzz的方法可以在不依賴程序源碼或者真實(shí)運(yùn)行環(huán)境下對(duì)嵌入式軟件進(jìn)行測(cè)試,當(dāng)與其他漏洞檢測(cè)方法如使用代碼靜態(tài)測(cè)試工具、人工審查、逆向工程(通過(guò)對(duì)二進(jìn)制文件進(jìn)行反編譯,分析各個(gè)代碼模塊的邏輯內(nèi)容與調(diào)用關(guān)系,從而發(fā)現(xiàn)嵌入式系統(tǒng)中可能存在的漏洞的一種技術(shù)手段)進(jìn)行比較時(shí),基于二進(jìn)制的模糊測(cè)試可以更高效率地發(fā)現(xiàn)諸如緩沖區(qū)溢出、內(nèi)存泄漏、空指針引用、格式化字符串等安全問(wèn)題。此外,它還具有可以進(jìn)行大規(guī)模測(cè)試且無(wú)人值守的優(yōu)勢(shì),因?yàn)槟:^(guò)程通常是自動(dòng)化的。模糊測(cè)試的技術(shù)特點(diǎn)使其漏洞檢測(cè)的準(zhǔn)確率接近100%,并且可為每個(gè)漏洞提供詳細(xì)的回溯調(diào)試信息,降低運(yùn)維成本,消除誤報(bào)帶來(lái)的噪音。但是,由于誤報(bào)的原因,在進(jìn)行模糊測(cè)試后,還需手動(dòng)驗(yàn)證測(cè)試結(jié)果以精確定位程序存在的安全問(wèn)題。

4 結(jié)語(yǔ)

本文歸納了嵌入式環(huán)境中安全風(fēng)險(xiǎn)較大的幾種常見安全問(wèn)題,并討論了嵌入式環(huán)境下的一些測(cè)試方法,主要介紹了靜態(tài)測(cè)試、動(dòng)態(tài)測(cè)試和幾種二進(jìn)制的模糊測(cè)試工具的特點(diǎn)和原理。但是本文提出的測(cè)試方法僅僅是處于軟件測(cè)試或軟件開發(fā)周期的其中一個(gè)階段,如果希望嵌入式軟件更為健壯、安全,還需要控制好各個(gè)環(huán)節(jié),從編碼開發(fā)、測(cè)試、維護(hù)等階段來(lái)提高嵌入式軟件的安全性。

 (原載于《保密科學(xué)技術(shù)》雜志2023年2月刊)