999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于適應度和輸入約束模型的內(nèi)核驅(qū)動漏洞挖掘

2023-12-31 00:00:00佘庚達付才岑澤威呂建強
計算機應用研究 2023年7期

摘 要:針對驅(qū)動程序在運行過程中難以監(jiān)控和輸入復雜的問題,提出并實現(xiàn)基于適應度和輸入約束模型的驅(qū)動程序模糊測試工具DrgenFuzzer。該工具利用內(nèi)核跟蹤技術(shù)結(jié)合二進制程序的靜態(tài)分析實現(xiàn)驅(qū)動運行的信息監(jiān)控;分析驅(qū)動接口參數(shù),設計了樣本約束的方案;提出了新型適應度計算方案和交叉變異方案。實驗證明,與常用的內(nèi)核模糊測試工具對比,該工具經(jīng)過輸入約束模型之后生成的樣本測試成功率達到了其他工具的10倍以上,生成的樣本質(zhì)量更高。該工具對驅(qū)動程序進行模糊測試,挖掘到 i2c驅(qū)動中的空指針引用漏洞。DrgenFuzzer能有效引導和規(guī)范樣本生成,提高了樣本測試成功率和運行效率,增強了漏洞挖掘能力。

關鍵詞:模糊測試; 遺傳算法; 適應度; 輸入約束模型

中圖分類號:TP311

文獻標志碼:A

文章編號:1001-3695(2023)07-035-2151-06

doi:10.19734/j.issn.1001-3695.2022.11.0772

Kernel driver vulnerability mining based on fitness and input constraint model

She Gengda, Fu Cai?, Cen Zewei, Lyu Jianqiang

(Hubei Key Laboratory of Distributed System Security, Hubei Engineering Research Center on Big Data Security, School of Cyber Science amp; Engineering, Huazhong University of Science amp; Technology, Wuhan 430074, China)

Abstract:In order to solve the problem that the driver is difficult to monitor and input complex during the running process, this paper proposed and implemented a driver fuzzing tool DrgenFuzzer based on the fitness and input constraint model. The tool utilized the kernel tracing technology combined with the static analysis of binary programs to realize the information monitoring of the driver operation, analyzed the driver interface parameters, designed a sample constraint scheme, proposed a new fitness calculation scheme and a crossover mutation scheme. Experiments show that compared with the commonly used kernel fuzzing tools, the test success rate of samples generated by this tool after the input constraint model is more than 10 times that of other tools, and the quality of the generated samples is higher. This tool performed a fuzzy test on the driver and exploits the 1 pointer reference vulnerability in the i2c driver. DrgenFuzzer can effectively guide and standardize sample generation, improve the success rate and operating efficiency of sample testing, and enhance the vulnerability mining ability.

Key words:fuzzing; genetic algorithm; fitness; input constraint model

驅(qū)動程序作為操作系統(tǒng)內(nèi)核與外界硬件設備的通信媒介1,運行在內(nèi)核態(tài),因此驅(qū)動程序的安全漏洞具有強大的破壞力。從漏洞的位置看,驅(qū)動程序是大部分內(nèi)核漏洞的來源2。近年來,研究人員越來越重視驅(qū)動程序的安全問題3,很多相關漏洞被公開。因此,如何高效準確地挖掘驅(qū)動程序漏洞對操作系統(tǒng)安全具有重要意義。

模糊測試是非常有效的漏洞挖掘技術(shù)4。近年來,工業(yè)界和學術(shù)界都投入大量資源來研究內(nèi)核模糊測試,已有相關工作開發(fā)或改造出優(yōu)秀的內(nèi)核模糊測試工具5,如HFL、Syzkaller、PeriScope。其中HFL將靜態(tài)分析和符號執(zhí)行結(jié)合來進行混合模糊測試6,相比其他工具提升了性能和代碼覆蓋率。Syzkaller是目前最先進的內(nèi)核模糊器之一7,其借助虛擬化技術(shù)實現(xiàn)模糊測試,具有通用性強、應用范圍廣的優(yōu)點。PeriScope利用外部設備傳輸數(shù)據(jù)來進行內(nèi)核模糊測試8,在驅(qū)動與內(nèi)核之間存在監(jiān)視器監(jiān)視數(shù)據(jù)流,該工具無須虛擬化技術(shù)。

以上工具都存在共同的不足,即面對驅(qū)動程序時測試樣本成功率不高,生成的樣本在執(zhí)行過程中沒有通過驅(qū)動中的參數(shù)有效性檢查。根本原因是ioctl調(diào)用的參數(shù)不穩(wěn)定,不同功能的驅(qū)動設備參數(shù)類型的變化較大,導致測試用例構(gòu)造的效率和質(zhì)量明顯下降。因此,研究針對驅(qū)動程序的模糊測試具有重要現(xiàn)實意義。針對參數(shù)不穩(wěn)定問題,設計了輸入約束模型,通過模型有效規(guī)范參數(shù)類型,保證了參數(shù)的穩(wěn)定性;同時引入了遺傳算法和適應度引導測試樣本的生成,保障了驅(qū)動程序模糊測試效率。基于上述現(xiàn)狀和思路,本文提出了基于適應度和輸入約束模型的模糊測試方法,通過尋找函數(shù)中的理想基本塊來計算適應度,適應度函數(shù)的設計綜合考慮其后繼關系和影響層數(shù),通過輸入約束模型約束輸入?yún)?shù)格式,不斷變異生成高質(zhì)量測試樣本來進行漏洞挖掘。

1 相關理論與技術(shù)

1.1 eBPF和Kprobes

eBPF技術(shù)可以實現(xiàn)內(nèi)核監(jiān)控、跟蹤和調(diào)試。該技術(shù)是由伯克利包過濾(Berkerley packet filter,BPF)優(yōu)化而來。BPF主要功能是抓取和過濾特定規(guī)則的網(wǎng)絡包,以避免從內(nèi)核到用戶空間無用的數(shù)據(jù)包復制行為。Alexei Starovoitov在原BPF基礎上,增加了性能分析、系統(tǒng)追蹤等新功能,增強了其性能9,命名為eBPF。對于內(nèi)核信息的監(jiān)測和追蹤,eBPF技術(shù)提供了Kprobes方案。

Kprobes是一種跟蹤內(nèi)核函數(shù)執(zhí)行狀態(tài)的調(diào)試工具。通過內(nèi)核函數(shù)符號表,Kprobes可以在任意一個導出函數(shù)的入口位置插入探測點進行監(jiān)控10。如果需要粒度比函數(shù)級更小的探測點,可以通過加上合適的偏移量來進行探測,所以理論上Kprobes可以定位到內(nèi)核里幾乎所有的地址空間。Kprobes生成監(jiān)測模塊并將其加載到內(nèi)核,同時設置探針到目的地址,設置探針不會破壞內(nèi)核結(jié)構(gòu)和原有的任何功能。當內(nèi)核執(zhí)行到探針位置時,會調(diào)用監(jiān)測模塊中的回調(diào)函數(shù)。探針位置可由函數(shù)或具體地址表示。在無須監(jiān)測內(nèi)核時,用戶可以移除這些探針,不會對原驅(qū)動運行產(chǎn)生任何影響。

Kprobes提供了kprobe、jprobe和kretprobe三種不同類型的探針。其中kprobe是該內(nèi)核調(diào)試技術(shù)最基礎的探測手段,其余兩個都基于kprobe實現(xiàn),都只是在kprobe的基礎上進行優(yōu)化封裝。在實際使用過程中,用戶通過設置內(nèi)核函數(shù)名、相對偏移量或者直接設定具體的地址以在對應的位置設置探針。

1.2 模糊測試技術(shù)

模糊測試技術(shù)簡單描述就是模擬用戶輸入的過程,其核心思想在短時間內(nèi)產(chǎn)生大量的隨機樣本輸入到目標程序中,以觸發(fā)內(nèi)存中可能存在的漏洞11。按生成數(shù)據(jù)的方式劃分,主流的模糊測試技術(shù)有基于生成的模糊測試和基于變異的模糊測試12

基于生成的模糊測試技術(shù)通過模型控制生成樣本,生成的輸入滿足目標程序的格式需求,所以需要了解程序。同時在程序邏輯漏洞挖掘上,這類技術(shù)表現(xiàn)不好。因為輸入很規(guī)范,一些非法輸入造成的漏洞被忽略掉了。

基于變異的模糊測試技術(shù)是灰盒模糊測試技術(shù)。這項技術(shù)在工業(yè)界和學術(shù)界內(nèi)很常用。AFL就是基于變異的模糊測試技術(shù)。這類技術(shù)通常會計算樣本的變異價值,在變異生成新樣本時,會對所有的樣本文件計算適應度,從中選擇一個適應度高的樣本來進行變異。適應度高意味著變異潛力高。其中潛力通常是指產(chǎn)生新的路徑和產(chǎn)生新的覆蓋的能力。

這兩個模糊測試技術(shù)都是基于目標程序?qū)斎腧炞C的不完整性假設13,采用隨機的方法,所以輸入狀態(tài)空間往往很大,又因為其隨機特性,使得模糊測試效果很大程度依賴于生成的測試用例數(shù)量。

2 模糊測試方案

本文的模糊測試方法是基于驅(qū)動程序特征的。傳統(tǒng)的模糊測試方法不能很好地監(jiān)視內(nèi)核驅(qū)動的運行狀況,生成的測試樣本有效率較低,存在大量的無效樣本,導致模糊測試的效率低。為了更好地監(jiān)控內(nèi)核驅(qū)動程序的運行狀態(tài),同時保證樣本的有效率高,本文提出了新型適應度并引入到模糊測試中,用于樣本的生成和變異。

2.1 內(nèi)核監(jiān)控

eBPF中的技術(shù)Kprobes幾乎可以在內(nèi)核任何位置加入插樁代碼,但需要提供插樁點具體內(nèi)存地址。因此內(nèi)核運行監(jiān)控的問題轉(zhuǎn)換為插樁點的具體地址獲取。內(nèi)核導出函數(shù)的地址Funaddi可以通過導出符號表(linux系統(tǒng)文件/proc/kallsyms)來獲取。驅(qū)動程序中函數(shù)由若干個基本塊組成,覆蓋率統(tǒng)計粒度以基本塊為單位,所以對每個基本塊都要設置探測點。這樣就需要獲取每個基本塊的首地址用于打點,獲取首地址采取相對偏移量計算的方式。

對于相對偏移量Offseti,工具IDA Pro能夠幫助研究人員自動化地完成二進制程序的基本塊劃分,在FlowChart模式下,IDA Pro不僅能夠給出直觀的基本塊流程圖,還能輸出每個函數(shù)、每個基本塊的相對地址,故而有

Addressi=Funaddi+bbl_reladdi-fun_reladdi(1)

其中:Addressi表示第i個插樁分析點的具體地址;Funaddi表示第i個插樁分析點對應的內(nèi)核函數(shù)首地址;bbl_reladdi為第i個基本塊的相對地址;fun_reladdi為第i個基本塊對應的函數(shù)相對地址。

2.2 驅(qū)動接口參數(shù)分析

驅(qū)動程序所有接口中ioctl是最為復雜的一個接口,其原型為int ioctl(int fd,unsigned int cmd, unsigned long arg)。其中fd是open函數(shù)打開設備文件返回的文件描述符;cmd是驅(qū)動程序?qū)拿畲a,負責功能控制;arg是需要的參數(shù)14

由于ioctl的特性,fd、cmd、arg這三個參數(shù)并非互不相關的,不同的fd對應有不同的cmd命令集合,不同的cmd值所對應的arg參數(shù)類型也是不一樣的。在驅(qū)動程序?qū)嶋H運行的過程中,驅(qū)動程序會進行參數(shù)有效性檢查。如果采取隨機參數(shù)生成的形式,需要測試的樣本組合就會非常巨大,同時這些龐大的樣本組合中包含著大量無法通過有效性檢查的測試樣本,因此,對于ioctl函數(shù)的測試并不能簡單地通過三個隨機參數(shù)來完成。在模糊測試的過程中需要將三個參數(shù)進行關聯(lián)約束。

a)fd。根據(jù)open函數(shù)打開的設備確定fd。

b)cmd。每一個驅(qū)動,對應的cmd命令集合也是確定的。可以從內(nèi)核驅(qū)動代碼中提取出設備對應的cmd命令集合。一般cmd命令集合保存在各驅(qū)動的頭文件中,表示方式分為宏定義和十六進制。

c)arg。驅(qū)動的每一個命令,都會有對應的參數(shù)arg,其中,大部分參數(shù)的類型是結(jié)構(gòu)體,所以在約束過程中會涉及到結(jié)構(gòu)體里的多個基礎類型的變量。多數(shù)情況下,cmd參數(shù)的宏定義中就包含了arg類型。少數(shù)的cmd宏定義中不包含參數(shù)信息,這時候要到驅(qū)動中的ioctl函數(shù)尋找。通過查看參數(shù)傳遞函數(shù)copy_from_user和get_user來了解參數(shù)類型。

在分析出函數(shù)ioctl參數(shù)fd、cmd、arg參數(shù)的對應關系,可以總結(jié)出輸入約束模型。

2.3 輸入約束模型

該模型用于約束函數(shù)ioctl的輸入?yún)?shù),其內(nèi)容是對驅(qū)動程序源碼靜態(tài)分析所得,以json文件格式總結(jié)每個驅(qū)動的設備名、所有命令和所有參數(shù)。通過對該輸入約束模型的提取分析,可以生成輸入樣本。

代碼1 輸入約束模型文件格式

dev: 設備名

cmd: {

cmd1, //本設備的命令碼集合

cmd2,

}

type: {//參數(shù)意義對應命令碼集合

arg1{type},

//基礎參數(shù)類型

arg2{type,element{arg2_1,arg2_2…}},//結(jié)構(gòu)體類型

}

由于約束的存在,生成的待測樣本質(zhì)量更高,大多能夠通過驅(qū)動程序初步的邏輯監(jiān)測,這些待測樣本就能夠進入到驅(qū)動程序更深層次的邏輯,發(fā)現(xiàn)程序更多的問題。

2.4 基于新型適應度的模糊測試

在遺傳算法中評價個體優(yōu)劣程度的指標是適應度,適應度越高則個體越優(yōu)秀,遺傳生成下一代的可能性也越大15。在模糊測試過程中,樣本適應度越高說明覆蓋率提升的概率越大,則樣本越優(yōu)質(zhì)。因此將樣本產(chǎn)生新覆蓋的可能性數(shù)值轉(zhuǎn)換為新型適應度函數(shù),保證樣本變異方向是覆蓋更多的未訪問基本塊。本文定義理想基本塊和覆蓋率的概念,設計了與覆蓋率提升可能性對應的適應度計算函數(shù)。

2.4.1 定義概念

本文定義了模糊測試中的三個概念:

a)理想基本塊。該基本塊是模糊測試過程中已覆蓋基本塊,但是還存在至少一個后繼塊未覆蓋。圖1中灰色節(jié)點表示執(zhí)行中已覆蓋的基本塊,B是圖中唯一理想基本塊。

b)覆蓋率。用于表示驅(qū)動程序在模糊測試過程中的已執(zhí)行代碼在總代碼中的占比率Coverage。

其中:BBLexecuted表示模糊測試進行到目前為止已經(jīng)執(zhí)行過的基本塊數(shù)量;BBLall表示整個驅(qū)動程序中所有的基本塊數(shù)量。

c)適應度。本文中的適應度分為理想基本塊適應度和樣本適應度。理想基本塊適應度是指該理想基本塊產(chǎn)生新覆蓋的可能性;樣本適應度是指樣本覆蓋率提升的可能性。適應度越高,新覆蓋增加可能性越大。

2.4.2 適應度計算

在遺傳算法中,優(yōu)質(zhì)樣本意味著覆蓋率越高;適應度高的樣本代表著生成優(yōu)質(zhì)樣本的可能性越高。樣本的適應度代表著覆蓋率提升的可能性。

1)理想基本塊適應度

根據(jù)定義,新覆蓋的基本塊都是理想基本塊的子塊,所以計算理想基本塊的適應度來反映樣本的優(yōu)劣。根據(jù)漏洞挖掘?qū)嶒灪徒?jīng)驗,本文總結(jié)了理想基本塊適應度計算的三條規(guī)則:

規(guī)則1 理想基本塊的后繼塊數(shù)量越多,產(chǎn)生新覆蓋的可能性就越大,這兩者成正比關系。

規(guī)則2 調(diào)用圖中越往后,產(chǎn)生新覆蓋和理想基本塊的關聯(lián)越小,需設置層數(shù)上限。后繼塊數(shù)量不變的情況下,理想基本塊被執(zhí)行的次數(shù)和產(chǎn)生新覆蓋的能力成反比關系。

規(guī)則3 同等情況下,適應度計算中后繼塊數(shù)量比基本塊執(zhí)行次數(shù)影響更大。

可得理想基本塊適應度函數(shù)公式如下:

其中:Fitnessi表示基本塊i的適應度;Succi表示基本塊i后繼未被訪問的基本塊數(shù)(最多4層);Vis_numi表示整個模糊測試過程中基本塊i被訪問次數(shù)。

圖1中,B是唯一的理想基本塊,B的后繼塊有7個D、E、F、G、H、I、J和K,但最多記錄4層,所有SuccB=6。

2)樣本適應度

樣本的適應度和樣本執(zhí)行的所有理想基本塊相關,所以樣本的適應度等于所有理想基本塊適應度的和。一般來說測試次數(shù)不會影響樣本覆蓋率的提升,但如果測試次數(shù)到達了較大值,說明樣本開發(fā)潛力已盡。這里乘一個以測試次數(shù)為自變量的函數(shù)對適應度進行調(diào)整。

由此可得待測樣本的適應度函數(shù),計算方法如下:

其中:FITNESSi表示第j個待測樣本的適應度;∑numj=1Fitnessj表示第j個待測樣本所覆蓋的所有希望節(jié)點的適應度之和;x表示該待測樣本測試次數(shù);F(x)為調(diào)整函數(shù)。

根據(jù)模糊測試的實際情況,得到

其中:x表示該待測樣本測試次數(shù);Maxnum為設置的模糊測試次數(shù)上限;A為調(diào)整參數(shù)。實驗時設置Maxnum為2 000,A為100。

2.4.3 樣本選擇

樣本選擇是從上次測試群體中選擇優(yōu)秀樣本,之后將優(yōu)秀樣本進行交叉變異后生成下一代,將劣質(zhì)樣本淘汰,這種選擇將樣本的優(yōu)秀特征保存了下來。完成樣本池的保優(yōu)去劣。本文選擇的樣本方式是輪盤賭選擇。樣本被選中的概率與其適應度大小成正比。根據(jù)樣本適應度計算樣本被選中的概率:

其中:pi表示樣本i被選中的概率;FITNESSi表示樣本i的適應度。

和自然界中一樣,需要設置樣本池容量上限和樣本淘汰機制,淘汰的概率也和樣本適應度相關,適應度越高,淘汰的幾率越低:

其中:Disi表示樣本i被淘汰的概率;FITNESSi表示樣本i的適應度。為了維持待測樣本池的穩(wěn)定性,每生成一個新的樣本進入樣本池,樣本池都會選擇一個樣本丟棄。

3 DrgenFuzzer的設計和實現(xiàn)

3.1 系統(tǒng)架構(gòu)

如圖2所示,DrgenFuzzer系統(tǒng)由內(nèi)核監(jiān)控、接口分析和模糊測試三個部分組成。

a)內(nèi)核監(jiān)控。以IDA Pro作為靜態(tài)分析工具分析目標驅(qū)動程序,劃分基本塊并提取每個函數(shù)、每個基本塊的相對地址;計算探測點地址之后結(jié)合 kprobes技術(shù)完成對目標驅(qū)動程序的插樁。

b)接口分析。首先,找到目標驅(qū)動程序的命令碼集合,記錄備用;然后,通過每一個命令確定對應的參數(shù)類型;最后,總結(jié)出輸入約束模型。

c)模糊測試。首先,根據(jù)輸入約束模型中的信息生成輸入樣本;其次,將樣本傳入測試程序進行ioctl接口調(diào)用;接下來,分析監(jiān)控日志中是否有漏洞存在;然后,計算適應度作為選擇樣本的標準并進行樣本選擇;之后,對選擇的樣本進行交叉變異。以上過程將一直循環(huán),直到發(fā)現(xiàn)漏洞。

3.2 功能設計

3.2.1 內(nèi)核監(jiān)控

內(nèi)核監(jiān)控主要基礎是在驅(qū)動中插樁。利用IDA Pro,提取出每一個基本塊和對應函數(shù)的相對地址,計算出每一個基本塊相對于函數(shù)首地址的偏移量,如圖3所示。結(jié)合符號表中驅(qū)動函數(shù)首地址的實際地址以及式(1),計算得到每個基本塊的實際地址信息。整理準備用于后續(xù)的插樁操作。

kprobes能夠以探測點具體地址進行插樁。因為已經(jīng)得到了所有基本塊的實際地址信息,就可以對驅(qū)動程序進行插樁。通過自動化腳本生成監(jiān)測模塊,將其載入內(nèi)核。這樣當驅(qū)動運行時,內(nèi)核日志會輸出記錄信息。

3.2.2 接口分析

首先,確定并記錄備用驅(qū)動程序所有命令碼;然后,確定每一個命令對應的參數(shù)類型;最后,根據(jù)上述的分析過程給出輸入約束模型。圖4表示的是接口分析的過程。

3.2.3 模糊測試

針對驅(qū)動設備的模糊測試系統(tǒng)可以專注在待測樣本的生成、測試、選擇和變異上。

1)生成樣本

輸入約束模型中包含fd、cmd命令信息,直接填入樣本。只有參數(shù)arg需要根據(jù)模型內(nèi)部信息生成。arg參數(shù)分為基本參數(shù)類型和結(jié)構(gòu)體參數(shù)類型。

對于基本參數(shù)類型來說,比如int、long int、bool、char、int[]、long int[]、char[]等,基本參數(shù)類型的構(gòu)造可以直接填充隨機初始值。非數(shù)組類型以int為例,它可以選擇-2 147 483 648~2 147 483 647的任意一個數(shù)。對于數(shù)組類型,填入取值范圍內(nèi)的任意值,定義聲明范圍內(nèi)的數(shù)組長度。以char[16]為例,可能為NULL,也有可能是長度小于16的隨機字符串。

對于結(jié)構(gòu)體參數(shù)類型來說,需要按結(jié)構(gòu)體內(nèi)的每個基本參數(shù)類型生成數(shù)據(jù),然后將其組合到一起,通過ioctl調(diào)用傳給驅(qū)動程序。

2)執(zhí)行樣本

接收到生成的樣本后,根據(jù)樣本生成測試程序。之后測試程序通過函數(shù)ioctl進行模糊測試。

3)適應度計算

計算適應度需要統(tǒng)計新樣本運行的記錄信息。記錄信息包含基本塊被訪問次數(shù)、理想基本塊序列、所有基本塊的后繼塊序列和樣本適應度。當新樣本測試后,監(jiān)控日志不斷生成,此時就需要準備計算適應度。如果覆蓋的基本塊沒有變多,增加訪問次數(shù)。如果有新增覆蓋基本塊,增加訪問次數(shù),更新理想基本塊序列,更新其附近的后繼塊信息。根據(jù)以上數(shù)據(jù)和式(3)~(5),計算出當前測試樣本的適應度。

算法1 適應度計算算法

輸入:本次測試所有基本塊集合v;覆蓋基本塊集合vis;基本塊訪問次數(shù)vis_num;基本塊關系樹dc_tree;理想基本塊集合h;后繼基本塊集合s;樣本測試次數(shù)x。

輸出:樣本適應度p。

def fiteness(v,vis,vis_num,dc_tree,h,s,x)

flag=1

for item in v://遍歷所有基本塊

for j in range(len(v[item]))

node=v[item][j]

if node==1 //篩選本次測試覆蓋的基本塊

if vis[item][j]==0:

flag=true

vis[item][j]=1 //更新覆蓋基本塊集合

vis_num[item][j]+=1//更新測試次數(shù)

dc_tree[item].visit(TreeNode(str(j)))

else

continue

if flag

updatehopeseq(v,dc_tree,h)//更新理想基本塊集合

updatesuccseq(v,dc_tree,h,s)//更新后繼塊集合

sum=0

for it in h:

for node in h[it]:

sum=sum+calffitness(it,node,vis_num,s)

//計算適應度,F(xiàn)(x)為調(diào)整函數(shù)

p=float(sum×F(x))

return p

4)樣本選擇

依據(jù)式(6)和(7),計算出各個樣本被選擇和被淘汰的概率。根據(jù)輪盤賭方法,生成隨機數(shù)實現(xiàn)對樣本的選擇。根據(jù)測試參數(shù)的類型,對樣本有不同的處理。

a)基本類型。選擇完成。

b)結(jié)構(gòu)體類型。暫時從樣本池剔除當前選擇樣本,重新選擇一個樣本,并和當前樣本一起進行交叉變異。

5)交叉變異

樣本中參數(shù)類型不同,交叉變異也采取相應的策略。

a)對于int、float、long等基礎參數(shù)類型,不進行交叉操作,只將數(shù)據(jù)變異。這里引入六種不同的變異算子:{x=x2,x=-x,x=2x,x=x/100,x=x+1,x=x}。生成一個0~5的隨機數(shù),對應六種變異算子。數(shù)值根據(jù)變異算子進行相應的運算得到新數(shù)據(jù),作為下一輪的新樣本輸入。而對于int、float等類型的數(shù)組,首先生成隨機新長度。新長度比原有長度更短時,按新長度對原數(shù)組進行變異。新長度更長時,將原有數(shù)組按基礎類型逐個進行變異。而空白部分按類型隨機生成。對于指針類型,保持不變或者置空。

b)對于結(jié)構(gòu)體類型,除了變異還需要對兩個樣本進行交叉變異操作。對其進行二進制編碼,統(tǒng)計結(jié)構(gòu)體內(nèi)參數(shù)變量數(shù)量為m。生成0~2m-1的隨機數(shù),然后將這個數(shù)以二進制的形式表示,二進制位為1則對應的變量作為交叉的部分。比如(5)2=101,選中了第1和第3個參數(shù)作為交叉變量。將選中的參數(shù)交換。生成一個1~500的隨機數(shù),當隨機數(shù)≤100時,對交叉結(jié)果中所有參數(shù)進行變異。否則,不對交叉結(jié)果進行操作。

4 實驗及結(jié)果分析

本章主要通過實驗測試框架的功能實現(xiàn)和運行效率。功能實現(xiàn)方面是指測試和驗證功能是否正確實現(xiàn)。運行效率方面是比較DrgenFuzzer與其他的模糊測試框架,總結(jié)出優(yōu)勢和不足。

實驗的硬件平臺為Intel? CoreTM i7-9700 CPU @ 3.00 GHz,內(nèi)存4.00 GB,Ubuntu 20.04;開發(fā)語言為Python 2.7。

4.1 內(nèi)核監(jiān)控性能測試

監(jiān)控功能的實現(xiàn)基于在內(nèi)核實現(xiàn)kprobe插樁,所以需要測試插樁是否造成大量的性能損失。以函數(shù)執(zhí)行時間大小評估性能損失。本次實驗對象是內(nèi)核Linux-5.17-rc8中的e1000、psmouse和usbhid等在內(nèi)的12個驅(qū)動程序。實驗中分別測試DrgenFuzzer插樁、kcov插樁和空白組。實驗原理是在驅(qū)動模塊中選擇一個驅(qū)動函數(shù),在調(diào)用該函數(shù)語句的前后加入函數(shù)ktime_get_boottime_ts64,兩者的差值是函數(shù)執(zhí)行時間,計算時間并輸出。為了排除抵消特殊情況對實驗整體造成的影響,取多次執(zhí)行的時間對比分析。

以e1000驅(qū)動作為樣例說明實驗的過程,在模塊中選定e1000_clean_rx_irq作為目標函數(shù),在不同實驗組下計算該函數(shù)執(zhí)行時間。

a)DrgenFuzzer插樁實驗。根據(jù)IDA Pro分析,數(shù)據(jù)包接收函數(shù)e1000_clean_rx_irq被劃分成46個基本塊。在每個基本塊的開始地址進行插樁,總共46個探測點。

b)kcov插樁實驗。kcov插樁是在驅(qū)動編譯時插樁。

c)空白對照組。不對驅(qū)動程序進行插樁。

三個實驗都從內(nèi)核日志中收集函數(shù)時間消耗,取測試三十次的平均值作為最終結(jié)果。

如圖5所示,測試不同的驅(qū)動,空白對照組執(zhí)行時間都遠遠小于其他兩組。對于DrgenFuzzer插樁和kcov插樁,這兩組實驗的曲線沒有很大的差距,非常接近。根據(jù)圖中的執(zhí)行時間來說,DrgenFuzzer插樁組的執(zhí)行時間略高于kcov插樁組,甚至在snd驅(qū)動處,kcov插樁反超了前者。綜合所有數(shù)值,兩者的差值沒有超過150 ns。這說明DrgenFuzzer插樁對實現(xiàn)模糊測試帶來的時間消耗是可以接受的,ns級別的執(zhí)行時間遠小于應用處理消耗的時間。

綜合兩者實現(xiàn)的結(jié)果來看,DrgenFuzzer插樁能反饋基本塊關系來指導生成高質(zhì)量樣本。但是kcov組只提供覆蓋率,并沒有反饋各個基本塊的關系,不能指導樣本變異方向。DrgenFuzzer的插樁方式在收集覆蓋基本塊關聯(lián)關系上優(yōu)于kcov插樁。在性能損失方面上,兩者接近。

4.2 輸入約束模型有效性

對于不同的模糊測試架構(gòu),如果生產(chǎn)的輸入樣本數(shù)量一致,能夠成功被執(zhí)行的樣本數(shù)越多,代表架構(gòu)生成樣本的質(zhì)量越高。測試輸入約束模型生成的樣本有效率,定義樣本測試成功率為

其中:Succ表示樣本測試成功率;Num表示成功執(zhí)行的測試樣本數(shù);All表示生成樣本總數(shù)。

為了證明DrgenFuzzer輸入約束模型的有效性,將其與內(nèi)核模糊測試工具Trinity比較。Trinity沒有約束樣本的輸入約束模型。比較兩者的樣本測試成功率。

測試對象為Linux系統(tǒng)下snd、input、i2c、ppp和e1000等十個驅(qū)動程序,分別使用兩個工具測試,將產(chǎn)生的所有待測樣本和有效執(zhí)行的待測樣本進行記錄,然后根據(jù)式(8)計算得到樣本測試成功率。

如表1、2所示,以測試驅(qū)動i2c為例,Trinity樣本測試成功率僅為0.03%,DrgenFuzzer樣本測試成功率有6.8%,遠遠高于前者。這是因為Trinity沒有有效地約束樣本的生成和變異,在Trinity生成的待測樣本中許多測試用例的fd和cmd不匹配。雖然在中途進行了優(yōu)化,但是本質(zhì)上還是隨機變異,測試效率依然很低。多數(shù)的無效樣本基本都是因為生成arg參數(shù)的格式有效但語義無效,關于語義的判斷很難只通過輸入約束模型來完成,超過了本次實驗的范疇。

在圖6中,雖然不同的驅(qū)動程序成功率不同,但大多數(shù)情況下DrgenFuzzer的成功率遠遠高于Trinity,是后者的數(shù)倍。說明輸入約束模型讓測試樣本的有效性和高質(zhì)量樣本生成效率提高。

4.3 漏洞挖掘

本次漏洞挖掘的測試對象是內(nèi)核Linux-5.17-rc8和Linux-5.8.4中的各個驅(qū)動(4.2節(jié)中的10個驅(qū)動)。為了說明DrgenFuzzer的優(yōu)勢,實驗采用了幾款常用開源工具對驅(qū)動程序來進行漏洞挖掘。

在現(xiàn)有的工具中,Trinity是最早的內(nèi)核模糊測試工具。Syzkaller是最先進的內(nèi)核模糊測試工具,通用性強且應用范圍廣。Peach能以自定義文件格式的形式進行模糊測試。在這些方面上,其他工具不具備優(yōu)勢。上述三種工具都在驅(qū)動程序中發(fā)現(xiàn)過許多漏洞。本文分別使用這幾個工具和DrgenFuzzer對內(nèi)核驅(qū)動程序進行漏洞挖掘測試。

如表3所示,在兩種不同內(nèi)核版本下,DrgenFuzzer的測試用例數(shù)量都是最少,但挖掘到的漏洞數(shù)量最多,具有較大的優(yōu)勢。對結(jié)果和工具原理進行分析可知,因為Peach和Trinity不存在輸入約束模型約束生成樣本,存在大量的無效樣本。Syzkaller是從內(nèi)核中系統(tǒng)調(diào)用設計出發(fā)的,內(nèi)核功能復雜,存在許多無關系統(tǒng)調(diào)用測試,所以對單個驅(qū)動程序的測試效率不高。DrgenFuzzer中總結(jié)了輸入約束模型來約束樣本的生成,待測樣本測試成功率更高;提出了新型適應度計算方案,樣本向覆蓋率提高的方向變異,漏洞挖掘效果更好。

4.4 漏洞總結(jié)

對i2c、e1000、ppp、input、snd等驅(qū)動進行模糊測試。通過接口分析,得到如表4的信息。

DrgenFuzzer在四個驅(qū)動中發(fā)現(xiàn)多個漏洞,選取一個i2c漏洞說明。i2c中有命令碼I2C_RDWR,當使用這個命令的過程中會調(diào)用函數(shù)i2cdev_ioctl_rdwr,出錯的位置在這個函數(shù)中。

與錯誤相關的結(jié)構(gòu)體是struct i2c_msg,結(jié)構(gòu)體聲明如下。

代碼2 結(jié)構(gòu)體聲明

struct i2c_msg {

__u16 addr;

__u16 flags;

__u16 len;

__u8 *buf;

};

結(jié)構(gòu)體參數(shù)中l(wèi)en和buf分別代表緩沖區(qū)長度和緩沖區(qū)長度。驅(qū)動代碼中有判斷i2c_msg是否安全的語句。其代碼如下。

代碼3 判斷代碼

if (msgs[i].len gt; 8192) {

res=-EINVAL;

break;

}

data_ptrs[i]=(u8 __user *)msgs[i].buf;

可以看到代碼只考慮了len數(shù)值過大即緩沖區(qū)過長的問題,但是當指針msgs[i].buf值為NULL時,可以通過判斷l(xiāng)en的if語句。之后在執(zhí)行buf賦值給data_ptrs[i]時造成空指針引用的問題。

5 結(jié)束語

本文在分析驅(qū)動程序接口參數(shù)的基礎上,總結(jié)出輸入約束模型來約束生成樣本。同時考慮到內(nèi)核驅(qū)動運行難以監(jiān)測的問題,提出了基于eBPF的內(nèi)核監(jiān)控方案,并根據(jù)程序參數(shù)的特性,引入理想基本塊的新定義,提出新的適應度計算方案,能夠高效地指導樣本進行交叉變異,從而設計并實現(xiàn)了DrgenFuzzer工具,并與其他常見工具進行對比,證明了DrgenFuzzer功能實現(xiàn)完備、運行效率優(yōu)秀、生成樣本更優(yōu)質(zhì)和漏洞挖掘能力強。下一步是分析結(jié)構(gòu)體中的各個參數(shù)間的關聯(lián)關系,接口靜態(tài)分析不能分析出這些關系。嘗試其他方法進行分析,使系統(tǒng)能夠更高效地生成高質(zhì)量樣本。對于不同類型的數(shù)據(jù)采取不同的變異手段,使測試樣本更多樣化。

參考文獻:

[1]Zhao Bodong, Li Zheming, Qin Shisong, et al. StateFuzz: system call-based state-aware Linux driver fuzzing[C]//Proc of the 31st USENIX Security Symposium[S.l.]:USENIX Association,2022:3273-3289.

[2]Zhao Wenjia, Lu Kangjie, Wu Qiushi, et al. Semantic-informed driver fuzzing without both the hardware devices and the emulators[C]//Proc of Network and Distributed Systems Security Symposium.2022.

[3]Wang Daimeng, Zhang Zheng, Zhang Hang, et al. SyzVegas: bea-ting kernel fuzzing odds with reinforcement learning[C]//Proc of the 30th USENIX Security Symposium.[S.l.]:USENIX Association,2021:2741-2758.

[4]吳志勇,王紅川,孫樂昌,等.fuzzing技術(shù)綜述[J].計算機應用研究,2010,27(3):829-832.(Wu Zhiyong, Wang Hongchuan, Sun Lechang, et al. Overview of fuzzing technology[J].Application Research of Computers,2010,27(3):829-832.)

[5]張策,孟凡超,考永貴,等.軟件可靠性增長模型研究綜述[J].軟件學報,2017,28(9):2402-2430.(Zhang Ce, Meng Fanchao, Kao Yonggui, et al. Survey of software reliability growth model[J].Journal of Software,2017,28(9):2402-2430.)

[6]Kim K, Jeong D R, Kim C H, et al. HFL: hybrid fuzzing on the Linux kernel[C]//Proc of the 27th Annual Network and Distributed System Security Symposium.2020.

[7]Carabas C, Carabas M. Fuzzing the Linux kernel[C]//Proc of Computing Conference.Piscataway,NJ:IEEE Press,2017:839-843.

[8]Song D, Hetzelt F, Das D, et al. PeriScope: an effective probing and fuzzing framework for the hardware-OS boundary[C]//Proc of Network and Distributed Systems Security Symposium.2019.

[9]姜歐涅.基于eBPF的網(wǎng)絡數(shù)據(jù)包捕獲與分析系統(tǒng)的設計與實現(xiàn)[D].武漢:華中科技大學,2020.(Jiang Ounie. Design and implementation of network packet capture and analysis system based on eBPF[D].Wuhan:Huazhong University of Science and Technology,2020.)

[10]Sun Hao, Shen Yuheng, Liu Jianzhong, et al. KSG: augmenting kernel fuzzing with system call specification generation[C]//Proc of USENIX Annual Technical Conference.[S.l.]:USENIX Association,2022:351-366.

[11]Liang Hongliang, Pei Xiaoxiao, Jia Xiaodong, et al. Fuzzing: state of the art[J].IEEE Trans on Reliability,2018,67(3):1199-1218.

[12]徐鵬,劉嘉勇,林波,等.基于循環(huán)神經(jīng)網(wǎng)絡的模糊測試用例生成[J].計算機應用研究,2019,36(9):2679-2685.(Xu Peng, Liu Jiayong, Lin Bo, et al. Generation of fuzzing test case based on recurrent neural networks[J].Application Research of Computers,2019,36(9):2679-2685.)

[13]廉美,鄒燕燕,霍瑋,等.動態(tài)資源感知的并行化模糊測試框架[J].計算機應用研究,2017,34(1):52-57.(Lian Mei, Zou Yanyan, Huo Wei, et al. Dynamic resource awareness framework for parallel fuzzing[J].Application Research of Computers,2017,34(1):52-57.)

[14]何遠,張玉清,張光華.基于黑盒遺傳算法的Android驅(qū)動漏洞挖掘[J].計算機學報,2017,40(5):1031-1043.(He Yuan, Zhang Yuqing, Zhang Guanghua. Android driver vulnerability discovery based on black-box genetic algorithm[J].Chinese Journal of Computers,2017,40(5):1031-1043.)

[15]鄧一杰,劉克勝,朱凱龍,等.基于動態(tài)適應度函數(shù)的模糊測試技術(shù)研究[J].計算機應用研究,2019,36(5):1415-1418.(Deng Yijie, Liu Kesheng, Zhu Kailong, et al. Research on fuzzing technique based on dynamic fitness function[J].Application Research of Computers,2019,36(5):1415-1418.)

主站蜘蛛池模板: 国产精品lululu在线观看| 亚洲国产成熟视频在线多多 | 天天综合网站| 欧美一级色视频| 熟女成人国产精品视频| 午夜啪啪网| 日本影院一区| 中国国产一级毛片| 国产一区二区人大臿蕉香蕉| 热这里只有精品国产热门精品| 成人免费午夜视频| 永久免费av网站可以直接看的 | 扒开粉嫩的小缝隙喷白浆视频| 亚洲精品视频免费看| 久久6免费视频| 国产亚洲欧美另类一区二区| 国产在线观看91精品| 女人av社区男人的天堂| 91福利在线看| 99热6这里只有精品| 国产屁屁影院| 日韩一区精品视频一区二区| 怡红院美国分院一区二区| 狠狠色成人综合首页| 亚洲精品卡2卡3卡4卡5卡区| 国外欧美一区另类中文字幕| 不卡国产视频第一页| 色老二精品视频在线观看| a级毛片网| 亚洲中文字幕在线一区播放| 亚洲国产精品人久久电影| 日本在线欧美在线| 国产日韩欧美精品区性色| 午夜精品影院| 国产精品亚洲专区一区| 成人综合网址| 国产亚洲精品91| 国产91丝袜在线播放动漫 | 乱色熟女综合一区二区| 国产精品污视频| 亚洲第一在线播放| 一区二区三区毛片无码| 在线看片免费人成视久网下载| 日韩视频精品在线| 婷婷五月在线| 国产男女免费完整版视频| 国产成人高清精品免费| 日韩 欧美 小说 综合网 另类| 亚洲一区波多野结衣二区三区| 尤物视频一区| 91九色国产porny| 亚洲欧美日韩成人在线| 国产精品大尺度尺度视频| 亚洲国产精品美女| 国产精品手机视频| 秋霞午夜国产精品成人片| 免费a级毛片18以上观看精品| 91久久青青草原精品国产| 国产欧美成人不卡视频| 国产乱人免费视频| 亚洲乱码在线播放| 精品亚洲国产成人AV| 国产新AV天堂| 日本久久久久久免费网络| 天堂成人在线| 久久这里只有精品23| 亚洲欧美日韩中文字幕一区二区三区| 欧美一区国产| 成人综合在线观看| 日韩精品亚洲人旧成在线| 中文字幕乱码二三区免费| 午夜老司机永久免费看片| 亚洲精品自拍区在线观看| 免费大黄网站在线观看| 99免费视频观看| 国产一区成人| 自慰高潮喷白浆在线观看| 播五月综合| 欧美在线导航| 亚洲第一区欧美国产综合| 国产高清又黄又嫩的免费视频网站| 99激情网|