亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        嵌入式C代碼釋放后重用缺陷檢測(cè)

        2021-01-29 04:31:02王亞昕李孝慶伍高飛唐士建朱亞杰
        關(guān)鍵詞:污點(diǎn)測(cè)試用例數(shù)據(jù)流

        王亞昕,李孝慶 ,伍高飛,唐士建,朱亞杰,董 婷

        (1.北京空間機(jī)電研究所,北京,100094;2.西安電子科技大學(xué) 網(wǎng)絡(luò)與信息安全學(xué)院,陜西 西安 710071)

        C語(yǔ)言是一種面向過(guò)程的通用程序設(shè)計(jì)語(yǔ)言。編譯系統(tǒng)的交叉編譯能力使得C語(yǔ)言能夠適用于ARM、C51等多種嵌入式體系架構(gòu)。由C語(yǔ)言編寫(xiě)的嵌入式代碼廣泛應(yīng)用于操作系統(tǒng)內(nèi)核及驅(qū)動(dòng)、應(yīng)用程序及代碼庫(kù)、單片機(jī)軟件等,其使用場(chǎng)景包括移動(dòng)終端、IoT設(shè)備[1]、工控設(shè)施、航空航天系統(tǒng)[2]等。這對(duì)其安全性和可靠性提出了很高的要求。

        因此,針對(duì)嵌入式C代碼中的缺陷進(jìn)行及時(shí)檢測(cè)和修復(fù)極為重要。C代碼中的釋放后重用 (Use-after-Free,UaF) 缺陷極為常見(jiàn)且危害嚴(yán)重。雖然不同嵌入式平臺(tái)使用的動(dòng)態(tài)內(nèi)存管理函數(shù)各不相同,但是UaF缺陷的成因是相同的,即C代碼在內(nèi)存釋放之后未將內(nèi)存指針清零,導(dǎo)致“野指針”留存,并在后續(xù)代碼執(zhí)行中繼續(xù)被用來(lái)進(jìn)行相應(yīng)操作。Android手機(jī)所使用的嵌入式內(nèi)核驅(qū)動(dòng)[3]就曾因一個(gè)UaF缺陷導(dǎo)致了華為、三星等諸多廠商的智能手機(jī)面臨極為嚴(yán)重的安全風(fēng)險(xiǎn),惡意應(yīng)用可獲得手機(jī)的完全控制權(quán)。這一案例充分證明了嵌入式C代碼中UaF缺陷的危害性。

        現(xiàn)有的嵌入式代碼缺陷檢測(cè)工作未能有效支持UaF缺陷,在一般計(jì)算機(jī)系統(tǒng)中較為成熟的自動(dòng)化UaF檢測(cè)工具又不能支持復(fù)雜多樣的嵌入式平臺(tái)。因此,筆者設(shè)計(jì)了一套支持不同嵌入式平臺(tái)的靜態(tài)代碼分析工具,實(shí)現(xiàn)了對(duì)于C代碼UaF缺陷的自動(dòng)化檢測(cè)。主要貢獻(xiàn)如下:

        (1) 實(shí)現(xiàn)了基于內(nèi)存指向的、支持?jǐn)?shù)據(jù)結(jié)構(gòu)操作的、上下文和路徑約束敏感的過(guò)程間數(shù)據(jù)流分析。

        (2) 歸納了UaF缺陷代碼的數(shù)據(jù)操作和傳遞的特征,并基于數(shù)據(jù)流分析開(kāi)展污點(diǎn)追蹤。

        (3) 利用大量測(cè)試用例與大型嵌入式項(xiàng)目代碼開(kāi)展驗(yàn)證性實(shí)驗(yàn),論證了該工具在發(fā)現(xiàn)UaF缺陷的有效性、可靠性及準(zhǔn)確性,證明了其在不同架構(gòu)平臺(tái)、大規(guī)模代碼項(xiàng)目上的適用性。

        1 相關(guān)工作

        C語(yǔ)言具有廣泛而復(fù)雜的應(yīng)用場(chǎng)景。對(duì)C代碼UaF缺陷開(kāi)展檢測(cè)有助于提高其在各種應(yīng)用場(chǎng)景中的可靠性與安全性。現(xiàn)有的代碼缺陷檢測(cè)技術(shù)多針對(duì)操作系統(tǒng)或應(yīng)用程序等單一場(chǎng)景開(kāi)展研究,針對(duì)嵌入式C代碼UaF的檢測(cè)未能得到有效支持。

        1.1 嵌入式代碼缺陷檢測(cè)

        為了有效利用嵌入式設(shè)備的有限計(jì)算資源,通常情況下嵌入式系統(tǒng)對(duì)于代碼復(fù)雜度有較高限定,并會(huì)以此來(lái)評(píng)價(jià)軟件的代碼質(zhì)量。評(píng)價(jià)方法所涵蓋的軟件度量單元包括控制流節(jié)點(diǎn)度量、扇入扇出度量、循環(huán)深度度量、圈復(fù)雜度等[4]。Mccabe公司的ASM8086,奧吉通公司的CRESTS/ATAT等工具能對(duì)此類(lèi)問(wèn)題開(kāi)展基于代碼規(guī)范的自動(dòng)化分析。

        從代碼缺陷角度來(lái)看:在高安全性高穩(wěn)定性要求的領(lǐng)域,對(duì)于嵌入式軟件的堆棧使用情況的安全測(cè)試必不可少,基于匯編代碼的堆棧溢出靜態(tài)測(cè)試方案可以實(shí)現(xiàn)對(duì)此類(lèi)缺陷的自動(dòng)化測(cè)試[5];具體到航天器軟件產(chǎn)品,其常見(jiàn)的代碼缺陷包括變量未初始化、數(shù)組越界、整型溢出、操作符優(yōu)先級(jí)錯(cuò)誤、循環(huán)變量錯(cuò)誤等,使用代碼分析可實(shí)現(xiàn)相關(guān)缺陷檢測(cè)[6]。

        1.2 UaF缺陷檢測(cè)

        常見(jiàn)的C語(yǔ)言UaF檢測(cè)工作主要針對(duì)計(jì)算機(jī)系統(tǒng)及其程序,分為動(dòng)態(tài)執(zhí)行和靜態(tài)分析兩種方法。

        動(dòng)態(tài)執(zhí)行以Fuzz測(cè)試[7]為代表,利用惡意構(gòu)造的測(cè)試用例觸發(fā)并捕獲目標(biāo)代碼中的異常行為。主要難點(diǎn)在于如何捕獲UaF代碼異常。對(duì)于源代碼,可利用編譯框架提供的ASAN選項(xiàng),進(jìn)行異常檢測(cè)代碼的插裝[8-9];對(duì)于二進(jìn)制代碼,通常需要仿真調(diào)試或者二進(jìn)制指令插裝[10]的方式實(shí)現(xiàn)異常監(jiān)控。動(dòng)態(tài)執(zhí)行還需解決生成測(cè)試用例以觸發(fā)更多代碼分支的問(wèn)題[11-12]。

        靜態(tài)分析不需運(yùn)行被測(cè)代碼。對(duì)于源代碼,通常轉(zhuǎn)換為中間語(yǔ)言(Intermediate Representation,IR)開(kāi)展分析,現(xiàn)有工作涵蓋了單線程應(yīng)用程序[13]和多線程內(nèi)核驅(qū)動(dòng)[14]中UaF缺陷的檢測(cè)方法。針對(duì)二進(jìn)制的靜態(tài)分析則需結(jié)合反匯編工具[15]。靜態(tài)分析的優(yōu)勢(shì)在于理論上能覆蓋代碼所有執(zhí)行路徑,漏報(bào)率低;缺點(diǎn)在于誤報(bào)率較高,其主要原因是無(wú)效的代碼執(zhí)行路徑未被識(shí)別,通常會(huì)引入符號(hào)執(zhí)行[16]工具以降低誤報(bào)。

        1.3 小 結(jié)

        綜合分析相關(guān)工作,現(xiàn)有的嵌入式代碼缺陷檢測(cè)方案并不能實(shí)現(xiàn)有效的UaF檢測(cè);而針對(duì)一般計(jì)算機(jī)C程序的UaF檢測(cè)工作雖然已有較多,但其在復(fù)雜多樣的嵌入式平臺(tái)并不完全適用。因此,設(shè)計(jì)一種適配多類(lèi)型嵌入式平臺(tái)的UaF檢測(cè)工具是十分必要的。

        2 UaF缺陷檢測(cè)方案設(shè)計(jì)

        靜態(tài)代碼分析能更好適應(yīng)于多種嵌入式平臺(tái),而動(dòng)態(tài)執(zhí)行技術(shù)則受限于代碼執(zhí)行和調(diào)試環(huán)境,適用場(chǎng)景有限。因此,選擇靜態(tài)代碼分析中的污點(diǎn)追蹤技術(shù)開(kāi)展UaF自動(dòng)化檢測(cè)。由于C語(yǔ)言是一種直接面向內(nèi)存的編程語(yǔ)言,其污點(diǎn)分析工具在設(shè)計(jì)與實(shí)現(xiàn)過(guò)程中比其他語(yǔ)言更為復(fù)雜,須支持:① 內(nèi)存指向分析,跟蹤內(nèi)存指針在寄存器和內(nèi)存之間的傳遞,記錄指針變量指向關(guān)系;② 數(shù)據(jù)結(jié)構(gòu)內(nèi)部變量追蹤,數(shù)據(jù)結(jié)構(gòu)是C語(yǔ)言中極為重要和廣泛應(yīng)用的數(shù)據(jù)格式;③ 跨函數(shù)的過(guò)程間追蹤,追蹤函數(shù)調(diào)用和返回過(guò)程的數(shù)據(jù)傳遞;④ 上下文敏感,以處置基于代碼上下文進(jìn)行選擇性變量賦值的操作;⑤ 路徑約束敏感,記錄約束條件并求解,防止無(wú)效路徑。

        基于上述分析,設(shè)計(jì)如圖 1所示的系統(tǒng)架構(gòu)。整個(gè)分析過(guò)程如下:

        (1) 將C源碼文件編譯為IR代碼。

        (2) 開(kāi)展直接函數(shù)調(diào)用圖分析。

        (3) 開(kāi)展跨函數(shù)控制流分析。

        (4) 開(kāi)展跨函數(shù)數(shù)據(jù)流分析,并特別針對(duì)函數(shù)指針、內(nèi)存指針和路徑約束變量進(jìn)行數(shù)據(jù)追蹤。

        (5) 基于數(shù)據(jù)流追蹤,實(shí)現(xiàn)間接函數(shù)調(diào)用分析、指向分析和路徑約束分析。

        (6) 基于UaF漏洞特征開(kāi)展污點(diǎn)追蹤。

        可以看出,全面的數(shù)據(jù)追蹤是進(jìn)一步開(kāi)展指向分析、污點(diǎn)追蹤和路徑約束分析的基礎(chǔ)。為了實(shí)現(xiàn)準(zhǔn)確、全面的數(shù)據(jù)流分析,定義了如表1中所示的存儲(chǔ)單元和存儲(chǔ)元素,每種存儲(chǔ)單元可存儲(chǔ)任意一種存儲(chǔ)元素。

        表1 數(shù)據(jù)存儲(chǔ)單元與數(shù)據(jù)存儲(chǔ)元素

        3 UaF缺陷檢測(cè)工具實(shí)現(xiàn)

        數(shù)據(jù)流分析是實(shí)現(xiàn)整個(gè)缺陷檢測(cè)的核心,以此為基礎(chǔ)可開(kāi)展全面有效的污點(diǎn)追蹤技術(shù),從而準(zhǔn)確判定UaF缺陷是否存在。靜態(tài)代碼分析中常見(jiàn)的路徑爆炸、誤報(bào)率高等難點(diǎn)也得到了有效處置。

        表2 針對(duì)特定LLVM IR語(yǔ)句進(jìn)行數(shù)據(jù)流分析

        3.1 數(shù)據(jù)流分析

        數(shù)據(jù)流分析采用正向分析,沿著執(zhí)行路徑分析每條語(yǔ)句是否會(huì)引起:① 存儲(chǔ)單元之間傳遞了存儲(chǔ)元素;② 新創(chuàng)建的存儲(chǔ)元素被存入了目的存儲(chǔ)單元;③ 存儲(chǔ)單元中的原有存儲(chǔ)元素遭到了覆蓋。表2展示了不同LLVM IR語(yǔ)句所導(dǎo)致的存儲(chǔ)元素從源存儲(chǔ)單元向目的存儲(chǔ)單元的數(shù)據(jù)傳遞關(guān)系。

        3.2 污點(diǎn)追蹤

        結(jié)合UaF代碼行為特征的污點(diǎn)追蹤技術(shù)可實(shí)現(xiàn)有效的缺陷檢測(cè)。算法1展示了污點(diǎn)源的判定規(guī)則。當(dāng)一條指令進(jìn)行內(nèi)存釋放,分析代碼將獲取內(nèi)存指針對(duì)應(yīng)的內(nèi)存對(duì)象,并為其添加釋放標(biāo)簽。算法2展示了污點(diǎn)陷入的判定規(guī)則。首先獲取語(yǔ)句使用的變量集合,逐一分析其是否為內(nèi)存指針,并且指向已添加了釋放標(biāo)簽的內(nèi)存對(duì)象,如是則判斷是否為安全敏感的UaF操作。為了實(shí)現(xiàn)完整的污點(diǎn)追蹤:在數(shù)據(jù)結(jié)構(gòu)內(nèi)部變量的獲取時(shí),需進(jìn)行污點(diǎn)傳遞;在內(nèi)存對(duì)象不被其他內(nèi)存指針引用時(shí),需進(jìn)行污點(diǎn)消除。

        算法1內(nèi)存釋放的標(biāo)簽添加過(guò)程。

        輸入1 待分析函數(shù)調(diào)用指令callInst。

        輸入2 代碼狀態(tài)記錄analysisState。

        返回值:更新后的代碼狀態(tài)記錄analysisState。

        ① func =獲取callInst 被調(diào)函數(shù)

        ② if(func不是內(nèi)存釋放函數(shù))

        ③ 返回analysisState

        ④ freedOpe =獲取被釋放的目的內(nèi)存寄存器

        ⑤ freedPointer =從analysisState 中查詢(xún)freedOpe 存儲(chǔ)的值

        ⑥ freedMemoryBlock=從analysisState 中查詢(xún)freedPointer 指針指向的內(nèi)存塊

        ⑦ freeTag =創(chuàng)建記錄了釋放操作的內(nèi)存塊標(biāo)簽

        ⑧ 向analysisState 中添加記錄:freedMemoryBlock 被打上了freeTag 標(biāo)簽

        ⑨ 返回analysisState

        算法2釋放后重用導(dǎo)致污點(diǎn)陷入的判定。

        輸入1 待分析指令inst。

        輸入2 代碼狀態(tài)記錄analysisState。

        返回值:更新后的代碼狀態(tài)記錄analysisState。

        ① allOpes =獲取inst 的所有操作數(shù)寄存器

        ② for(依次取出allOpes 里每一個(gè)的操作數(shù)寄存器)

        ③ ope=本次取出的操作數(shù)寄存器

        ④ value=從analysisState 中查詢(xún)ope 存儲(chǔ)的值

        ⑤ if(value不是一個(gè)內(nèi)存指針

        ⑥ 進(jìn)行下一輪循環(huán)

        ⑦ memoryBlock=從analysisState 中查詢(xún)value 代表的內(nèi)存塊

        ⑧ hasFreeTag=從analysisState 中查詢(xún)memoryBlock 是否有內(nèi)存釋放標(biāo)簽

        ⑨ if (hasFreeTag == false)

        ⑩ 進(jìn)行下一輪循環(huán)

        3.3 技術(shù)難點(diǎn)與解決方案

        在工具實(shí)現(xiàn)過(guò)程中面臨著靜態(tài)代碼分析工具普遍存在的一些難點(diǎn)。文中以降低漏報(bào)率、適度容忍誤報(bào)率為原則,對(duì)這些難點(diǎn)設(shè)計(jì)實(shí)現(xiàn)了解決方案。

        (1) 函數(shù)調(diào)用圖不完善。直接函數(shù)調(diào)用分析無(wú)法涵蓋復(fù)雜代碼中基于函數(shù)指針進(jìn)行間接調(diào)用的情況。文中設(shè)計(jì)了針對(duì)函數(shù)指針這一特殊的常量型存儲(chǔ)元素的追蹤方法,補(bǔ)全了函數(shù)調(diào)用圖中的間接函數(shù)調(diào)用路徑,從而提高了分析過(guò)程的準(zhǔn)確性和全面性。

        (2) 控制流路徑爆炸。路徑爆炸問(wèn)題主要來(lái)源于循環(huán)語(yǔ)句、遞歸調(diào)用等。通過(guò)限制基礎(chǔ)代碼塊在當(dāng)前函數(shù)分析過(guò)程中的分析次數(shù)、限定代碼執(zhí)行路徑上每個(gè)函數(shù)的被執(zhí)行次數(shù)的手段提高了測(cè)試的成功率,并進(jìn)一步利用路徑約束求解降低進(jìn)入無(wú)效代碼路徑的可能性,提高了測(cè)試準(zhǔn)確性。

        (3) 針對(duì)數(shù)組元素的數(shù)據(jù)流分析。如果在數(shù)組元素的數(shù)據(jù)訪問(wèn)過(guò)程中索引值為符號(hào)值,則文中將嘗試統(tǒng)計(jì)目標(biāo)數(shù)組中可訪問(wèn)范圍內(nèi)的所有元素,并在后續(xù)分析中對(duì)于每種取值情況開(kāi)展數(shù)據(jù)流分析,從而覆蓋所有可能的取值情況。這樣可確保數(shù)據(jù)流分析過(guò)程的全面性,降低漏報(bào)率。

        (4) 起始函數(shù)設(shè)計(jì)與測(cè)試流程調(diào)控。對(duì)于一些測(cè)試目標(biāo),需為其創(chuàng)建虛擬的測(cè)試起始函數(shù),實(shí)現(xiàn)測(cè)試過(guò)程調(diào)控。例如Linux內(nèi)核的seq_file文件操作接口,會(huì)利用代碼段 1的數(shù)據(jù)結(jié)構(gòu)對(duì)響應(yīng)函數(shù)接口進(jìn)行設(shè)定。

        代碼段 1 seq_file文件響應(yīng)函數(shù)的結(jié)構(gòu)定義如下:

        ① struct seq_operations {

        ② void * (*start) (struct seq_file *m,loff_t*pos);

        ③ void (*stop) (struct seq_file *m,void *v);

        ④ void * (*next) (struct seq_file *m,void *v,loff_t *pos);

        ⑤ int (*show) (struct seq_file *m,void *v);

        ⑥ };

        ⑦ struct seq_operationstest_op;

        假設(shè)測(cè)試目標(biāo)為名為test_op的該數(shù)據(jù)結(jié)構(gòu)實(shí)例,則測(cè)試起始函數(shù)的設(shè)計(jì)如代碼段 2所示,從而模擬進(jìn)行讀文件操作時(shí)的響應(yīng)流程。此方案可解決在多次內(nèi)核響應(yīng)過(guò)程中的代碼狀態(tài)存留問(wèn)題,提高準(zhǔn)確率。

        代碼段 2 針對(duì)seq_file的測(cè)試起始函數(shù)如下:

        ① void TEST(struct seq_file *m,void *v,loff_t*pos){

        ② for(i=0;i< 2;i++){

        ③ test_op.start(m,pos);

        ④ test_op.next(m,v,pos);

        ⑤ test_op.show(m,v);

        ⑥ test_op.stop(m,pos);

        ⑦ }}

        4 UaF缺陷檢測(cè)工具實(shí)驗(yàn)驗(yàn)證

        UaF缺陷檢測(cè)工具實(shí)驗(yàn)驗(yàn)證分為兩個(gè)部分,第1部分通過(guò)自行編寫(xiě)的和公開(kāi)的測(cè)試用例集合(所用測(cè)試用例已開(kāi)源:http://dwz.date/dn35),驗(yàn)證該工具發(fā)現(xiàn)代碼安全問(wèn)題的效果和準(zhǔn)確性;第2部分則通過(guò)有真實(shí)漏洞編號(hào)的UaF案例,驗(yàn)證該工具在大型項(xiàng)目上的應(yīng)用效果。

        4.1 測(cè)試用例進(jìn)行功能驗(yàn)證

        4.1.1 自有測(cè)試用例設(shè)計(jì)與實(shí)驗(yàn)

        在UaF缺陷檢測(cè)工具工具的實(shí)現(xiàn)過(guò)程中,同步編寫(xiě)了自有測(cè)試用例,涵蓋了數(shù)據(jù)流、調(diào)用圖、控制流等多個(gè)方面。具體測(cè)試內(nèi)容包括:① 調(diào)用圖全面性測(cè)試,包括直接調(diào)用和間接調(diào)用;② 控制流分析,包括路徑分支、代碼循環(huán);③ 數(shù)據(jù)流分析,包括面向局部變量、全局變量、數(shù)據(jù)結(jié)構(gòu)、數(shù)組元素的數(shù)據(jù)追蹤。圖2左側(cè)展示的為測(cè)試用例代碼,右側(cè)為測(cè)試結(jié)果。測(cè)試結(jié)果以基礎(chǔ)代碼塊為單位,"L:XX"代表源代碼行數(shù),虛線框表示所屬函數(shù)。其中代碼塊標(biāo)注:橢圓,代表分析起點(diǎn);點(diǎn)狀,代表發(fā)生內(nèi)存申請(qǐng);橫線,代表發(fā)生內(nèi)存釋放;豎線,代碼發(fā)生內(nèi)存重用。跳轉(zhuǎn)的標(biāo)注:C(all) 代表函數(shù)調(diào)用;Y(es)和N(o)分別代表?xiàng)l件語(yǔ)句為是和否;括號(hào)中的編號(hào)則標(biāo)注了代碼執(zhí)行流程。該結(jié)果直接、清晰地呈現(xiàn)了UaF缺陷觸發(fā)時(shí)的代碼執(zhí)行路徑。

        ④ void foo(int argc) {

        ⑤ char* buf=malloc(10);

        ⑥ if(buf == NULL)

        ⑦ return;

        ⑧ buf[0]=100;

        ⑨ free(buf);

        ⑩ if(buf != NULL)

        (a)測(cè)試用例代碼

        4.1.2 開(kāi)源測(cè)試用例集實(shí)驗(yàn)驗(yàn)證

        Juliet測(cè)試用例集是軟件保障參考數(shù)據(jù)庫(kù)中的一個(gè)公開(kāi)測(cè)試樣本集 ,其中包含138個(gè)C代碼UaF缺陷樣本,每個(gè)文件代碼量為數(shù)百行。利用這些樣本開(kāi)展了驗(yàn)證性實(shí)驗(yàn)。實(shí)驗(yàn)結(jié)果如表3所示,證明了該工具能以較低的資源消耗完成準(zhǔn)確、快速的UaF檢測(cè)。限于篇幅,不再對(duì)單個(gè)用例的測(cè)試結(jié)果展開(kāi)分析。

        表3 Juliet測(cè)試結(jié)果統(tǒng)計(jì)

        4.2 大型嵌入式軟件系統(tǒng)實(shí)驗(yàn)驗(yàn)證

        選取在嵌入式操作系統(tǒng)領(lǐng)域和應(yīng)用軟件領(lǐng)域有廣泛應(yīng)用的Linux操作系統(tǒng)內(nèi)核和OpenSSL安全通信程序進(jìn)行驗(yàn)證。實(shí)驗(yàn)過(guò)程使用ThinkPad X1,處理器為英特爾I7-8 750H,設(shè)備擁有16 GB內(nèi)存。

        4.2.1 針對(duì)嵌入式操作系統(tǒng)漏洞的實(shí)驗(yàn)驗(yàn)證

        Linux內(nèi)核被廣泛應(yīng)用于嵌入式系統(tǒng),其代碼量超過(guò)27 000 000行。在4.7.1版本之前的disk_seqf_stop函數(shù)存在UaF漏洞[17]。該函數(shù)是/proc/diskstats文件的內(nèi)核響應(yīng)接口,在內(nèi)存釋放后未對(duì)指針變量seqf->private進(jìn)行清零,遺留了“野指針”,最終導(dǎo)致UaF觸發(fā)。測(cè)試過(guò)程參考4.3節(jié)編寫(xiě)了針對(duì)性的測(cè)試起始代碼。

        選擇Linux 4.7版本開(kāi)展測(cè)試。實(shí)驗(yàn)過(guò)程進(jìn)行了38分11秒,完成了1 399 020條路徑組合的分析工作。在對(duì)無(wú)關(guān)函數(shù)調(diào)用進(jìn)行了自動(dòng)化“剪枝”后,得到了精簡(jiǎn)版的測(cè)試結(jié)果,如圖3所示。結(jié)果顯示disk_seqf_stop函數(shù)中被釋放的內(nèi)存在disk_seqf_next函數(shù)中發(fā)生了重用。

        根據(jù)縱線方框的標(biāo)注,定位disk_seqf_next異常代碼,如代碼段3。此段代碼在第844行進(jìn)行函數(shù)調(diào)用,將seqf->private作為調(diào)用參數(shù),這一指針正是被disk_seqf_stop釋放的內(nèi)存。因此確認(rèn)存在UaF缺陷。

        代碼段 3 Linux內(nèi)核disk_seqf_next實(shí)現(xiàn)代碼如下:

        839 static void *disk_seqf_next(struct seq_file *seqf,

        void *v,loff_t *pos)

        840 {

        841 struct device *dev;

        842

        843 (*pos)++;

        844 dev=class_dev_iter_next(seqf->private);

        此外,disk_seqf_start函數(shù)在第2次被調(diào)用的執(zhí)行路徑(編號(hào)為17-18的有向線段)與第1次調(diào)用時(shí)是顯著不同的。結(jié)合代碼段4中該函數(shù)的源碼,可看出成功發(fā)現(xiàn)了一條可避免在第2次被調(diào)用時(shí)seqf->private野指針被覆蓋的執(zhí)行路徑。這也驗(yàn)證了此測(cè)試報(bào)告的準(zhǔn)確性。

        代碼段 4 disk_seqf_start實(shí)現(xiàn)代碼如下:

        818 static void *disk_seqf_start(struct seq_file *seqf,…){

        820 loff_t skip=*pos;

        821 struct class_dev_iter *iter;

        822 struct device *dev;

        824 iter=kmalloc(sizeof(*iter),GFP_KERNEL);

        825 if (!iter)

        826 return ERR_PTR(-ENOMEM);

        827

        828 seqf->private=iter;

        圖3 Linux內(nèi)核UaF漏洞的測(cè)試結(jié)果

        4.2.2 針對(duì)嵌入式應(yīng)用軟件的實(shí)驗(yàn)驗(yàn)證

        OpenSSL是一款Linux嵌入式系統(tǒng)上廣泛使用的軟件,代碼量約為450 000行。其1.1.0a版本中存在一個(gè)嚴(yán)重的UaF缺陷[18]。實(shí)驗(yàn)選取了針對(duì)漏洞版本開(kāi)展測(cè)試,選取了以服務(wù)程序的讀狀態(tài)機(jī)實(shí)現(xiàn)函數(shù)read_state_machine為測(cè)試起始點(diǎn)。測(cè)試過(guò)程持續(xù)7分51秒,完成286 567條代碼執(zhí)行路徑分析。為了驗(yàn)證結(jié)果準(zhǔn)確性,設(shè)立了對(duì)比實(shí)驗(yàn),基于ASAN異常捕獲機(jī)制獲取缺陷動(dòng)態(tài)觸發(fā)時(shí)的調(diào)用棧信息,如圖4所示。將其與圖5中的靜態(tài)分析結(jié)果比較,可發(fā)現(xiàn)兩者的結(jié)果相符合。

        圖4 OpenSSL UaF漏洞動(dòng)態(tài)觸發(fā)調(diào)用棧

        圖5 OpenSSL軟件UaF漏洞測(cè)試結(jié)果

        5 現(xiàn)有方法對(duì)比

        在UaF的自動(dòng)化缺陷檢測(cè)領(lǐng)域,靜態(tài)分析和動(dòng)態(tài)測(cè)試是特點(diǎn)鮮明的兩種方法。兩者并沒(méi)有優(yōu)劣之分,只是因其特點(diǎn)的不同,有著各自的適用場(chǎng)景。表4中總結(jié)了在現(xiàn)有研究工作中具有代表性的檢測(cè)方法。

        表4 現(xiàn)有UaF缺陷檢測(cè)方法對(duì)比

        對(duì)比表4中各項(xiàng)工作可發(fā)現(xiàn):動(dòng)態(tài)測(cè)試環(huán)境更加適用于通用計(jì)算機(jī)代碼的缺陷檢測(cè),該場(chǎng)景下的代碼執(zhí)行環(huán)境和異常捕獲機(jī)制均較為完善,但對(duì)嵌入式代碼言并不適用;二進(jìn)制靜態(tài)分析工具受限于其依賴(lài)的反匯編工具和符號(hào)執(zhí)行工具的適用范圍,僅能支持部分嵌入式平臺(tái)上的缺陷檢測(cè)。理論上來(lái)講,源代碼分析工具最適用于嵌入式代碼UaF的檢測(cè),但現(xiàn)有工作[13-14]不能實(shí)現(xiàn)文中全面的數(shù)據(jù)流分析,使得開(kāi)展UaF代碼特征識(shí)別的過(guò)程中存在較高的誤報(bào)率和漏報(bào)率,檢測(cè)效果并不理想。

        6 結(jié)束語(yǔ)

        筆者提出了一種針對(duì)嵌入式C代碼的UaF缺陷檢測(cè)方法,并基于LLVM編譯框架編寫(xiě)了自動(dòng)化檢測(cè)工具,實(shí)現(xiàn)了針對(duì)操作系統(tǒng)、應(yīng)用程序、單片機(jī)程序等多種嵌入式代碼的UaF缺陷檢測(cè)。工具具有全面、準(zhǔn)確的數(shù)據(jù)流分析能力,能夠針對(duì)UaF缺陷代碼特征開(kāi)展污點(diǎn)追蹤,從而實(shí)現(xiàn)自動(dòng)化缺陷檢測(cè)和報(bào)告輸出。驗(yàn)證實(shí)驗(yàn)在測(cè)試樣本集、嵌入式操作系統(tǒng)和應(yīng)用程序等多個(gè)目標(biāo)上開(kāi)展。實(shí)驗(yàn)結(jié)果表明,文中方法能夠準(zhǔn)確、高效地實(shí)現(xiàn)不同場(chǎng)景下UaF缺陷的自動(dòng)化檢測(cè),并且能適用于大規(guī)模嵌入式代碼項(xiàng)目。

        猜你喜歡
        污點(diǎn)測(cè)試用例數(shù)據(jù)流
        基于代碼重寫(xiě)的動(dòng)態(tài)污點(diǎn)分析
        基于SmartUnit的安全通信系統(tǒng)單元測(cè)試用例自動(dòng)生成
        汽車(chē)維修數(shù)據(jù)流基礎(chǔ)(下)
        基于混合遺傳算法的回歸測(cè)試用例集最小化研究
        一種提高TCP與UDP數(shù)據(jù)流公平性的擁塞控制機(jī)制
        使用Lightroom污點(diǎn)去除工具清理照片中的瑕疵
        基于數(shù)據(jù)流聚類(lèi)的多目標(biāo)跟蹤算法
        我國(guó)“污點(diǎn)證人”刑事責(zé)任豁免制度的構(gòu)建
        基于依賴(lài)結(jié)構(gòu)的測(cè)試用例優(yōu)先級(jí)技術(shù)
        北醫(yī)三院 數(shù)據(jù)流疏通就診量
        亚洲va精品va国产va| 久久精品人人做人人爽| 最近高清中文在线字幕观看| 超碰观看| 国产精品髙潮呻吟久久av| 又黄又爽又色视频| 国产女主播喷水视频在线观看| 亚洲免费av电影一区二区三区| 手机在线观看亚洲av | 亚洲中文字幕日产无码| 无码午夜成人1000部免费视频| 樱花AV在线无码| 在线观看人成网站深夜免费| av影院在线免费观看不卡| 国产二级一片内射视频插放| 日本韩国一区二区三区| 手机在线中文字幕av| 国产免费又色又爽粗视频| 国产激情精品一区二区三区| 亚洲一区二区自拍偷拍| 中文字幕人妻被公喝醉在线| 国产欧美性成人精品午夜| 久久天天躁狠狠躁夜夜96流白浆| 欧美日韩国产在线人成dvd| 99久久婷婷国产一区| 亚洲色欲色欲www在线观看| 欧美在线观看一区二区| 国产一区二区三区特区| 人人爽久久久噜人人看| 亚洲精品久久无码av片软件| 日日躁欧美老妇| 色久悠悠婷婷综合在线| 欧美a级毛欧美1级a大片免费播放| 99精品一区二区三区免费视频| 久久国产女同一区二区| 大又大又粗又硬又爽少妇毛片| 国产va免费精品观看| 国产日韩午夜视频在线观看| 亚洲一区二区三区四区地址| 久久久久久久岛国免费观看| 免青青草免费观看视频在线|