陳小全 劉 劍 夏翔宇 周紹翔
1(北京城市學(xué)院信息學(xué)部 北京 100191)
2(中國(guó)科學(xué)院網(wǎng)絡(luò)測(cè)評(píng)技術(shù)重點(diǎn)實(shí)驗(yàn)室(中國(guó)科學(xué)院信息工程研究所) 北京 100093)
3(中國(guó)科學(xué)院大學(xué)網(wǎng)絡(luò)空間安全學(xué)院 北京 100049)
(chenxiaoquan@126.com)
當(dāng)前軟件中存在的漏洞是引發(fā)軟件安全事件的主要原因.因此在軟件開發(fā)過(guò)程中通過(guò)靜態(tài)和動(dòng)態(tài)的檢測(cè)技術(shù)[1-3]來(lái)發(fā)現(xiàn)軟件中存在的漏洞是很重要的工作.軟件漏洞靜態(tài)檢測(cè)是通過(guò)掃描程序的源代碼或者相應(yīng)的二進(jìn)制代碼[4],找到符合軟件漏洞特征代碼片段的過(guò)程.其實(shí)施流程是,首先根據(jù)各種漏洞的特征,建立對(duì)應(yīng)的漏洞特征庫(kù),如溢出漏洞特征庫(kù)、格式化字符串特征庫(kù)以及各種CWE 漏洞類型的特征庫(kù).接下來(lái)依據(jù)建立的特征庫(kù)對(duì)程序進(jìn)行靜態(tài)分析,檢測(cè)程序中是否存在匹配某種漏洞特征的漏洞.檢測(cè)的大致流程包括建立源代碼模型、構(gòu)建漏洞特征庫(kù)、判定漏洞,以及結(jié)果分析等關(guān)鍵步驟.檢測(cè)的技術(shù)有數(shù)據(jù)流分析[5-8](data-flowanalysis)和符號(hào)執(zhí)行[9-13](symbolic execution)等.動(dòng)態(tài)漏洞檢測(cè)技術(shù)指的是通過(guò)實(shí)際運(yùn)行被檢測(cè)的程序,記錄程序的執(zhí)行軌跡,分析程序執(zhí)行流程中的數(shù)據(jù)和函數(shù)間的調(diào)用關(guān)系等信息,以此檢測(cè)程序中是否存在某種類型的漏洞.典型的動(dòng)態(tài)漏洞檢測(cè)技術(shù)有模糊測(cè)試[14-17](fuzzing test)和動(dòng)態(tài)污點(diǎn)分析[18-21](dynamic taint analysis,DTA).此外,當(dāng)前隨著深度學(xué)習(xí)技術(shù)在惡意代碼檢測(cè)、垃圾郵件過(guò)濾等方面的不斷應(yīng)用,學(xué)術(shù)界和工業(yè)界也在不斷地嘗試將深度學(xué)習(xí)技術(shù)應(yīng)用于軟件漏洞的挖掘和分析當(dāng)中[22-25].與軟件靜態(tài)和動(dòng)態(tài)檢測(cè)技術(shù)相比較,應(yīng)用深度學(xué)習(xí)技術(shù)進(jìn)行軟件漏洞挖掘可以實(shí)現(xiàn)軟件漏洞的自動(dòng)化挖掘和分析,大幅度地提高漏洞挖掘的效率和精度.基于該目的,本文提出并實(shí)現(xiàn)一種基于比較學(xué)習(xí)的深度學(xué)習(xí)方法,其核心思想是為深度學(xué)習(xí)訓(xùn)練集中的每個(gè)樣本尋找類型相同的樣本和類型不相同的樣本.在模型訓(xùn)練的過(guò)程中,讓模型學(xué)習(xí)類型相同樣本大量的、細(xì)微的特征,也學(xué)習(xí)類型不相同樣本之間非常明顯的不同特征.通過(guò)這種方式,使得深度學(xué)習(xí)模型的漏洞識(shí)別精度大幅度提高,同時(shí)也可以檢測(cè)多達(dá)150 種的CWE 類型的漏洞.
本文的貢獻(xiàn)有3 方面:1)分析和整理了漏洞檢測(cè)技術(shù)中經(jīng)常使用的SARD 數(shù)據(jù)集.SARD 數(shù)據(jù)集包含了大量的漏洞程序和非漏洞程序,非常適合作為漏洞學(xué)習(xí)的樣本集.但該漏洞數(shù)據(jù)集里的程序存在一些問(wèn)題,如存在的非法字符阻礙深度學(xué)習(xí)模型的學(xué)習(xí)過(guò)程.通過(guò)整理,形成了一個(gè)源代碼語(yǔ)言的語(yǔ)料庫(kù),可以用于訓(xùn)練自己的源代碼詞向量模型;一個(gè)漏洞數(shù)據(jù)集,可以用于訓(xùn)練漏洞檢測(cè)學(xué)習(xí)模型.經(jīng)過(guò)實(shí)驗(yàn)驗(yàn)證,使用該數(shù)據(jù)集訓(xùn)練出來(lái)的模型,其漏洞檢測(cè)準(zhǔn)確率可以達(dá)到92.0%.2)分析并討論了基于深度學(xué)習(xí)的漏洞檢測(cè)模型訓(xùn)練中數(shù)據(jù)集的樣本程序是否符號(hào)化對(duì)模型的漏洞識(shí)別準(zhǔn)確率的影響.經(jīng)過(guò)實(shí)驗(yàn)驗(yàn)證與分析,發(fā)現(xiàn)數(shù)據(jù)集中程序樣本符號(hào)化與否對(duì)深度學(xué)習(xí)模型的檢測(cè)能力并沒(méi)有太大的影響.3)提出并實(shí)現(xiàn)一種新的深度學(xué)習(xí)方法—比較學(xué)習(xí)法.該學(xué)習(xí)方法的靈感來(lái)源于人類的學(xué)習(xí)方式,人們經(jīng)常通過(guò)比較來(lái)學(xué)習(xí)一個(gè)新的知識(shí).通過(guò)使用這種學(xué)習(xí)方法,深度學(xué)習(xí)模型在提取一個(gè)程序樣本的特征時(shí),它不是單純從一個(gè)樣本中學(xué)習(xí)程序的特征,而是同時(shí)學(xué)習(xí)該樣本的同類型樣本和非同類型樣本的特征.通過(guò)這種方式,模型不但學(xué)到了同類型樣本普遍共有的特征,也學(xué)習(xí)到了非同類型樣本不一樣的特征.這樣,模型提取特征的范圍和視野將更加開闊,有力地阻止過(guò)擬合和欠擬合現(xiàn)象的發(fā)生.
基于深度學(xué)習(xí)的源代碼漏洞檢測(cè)的思想來(lái)源于自然語(yǔ)言處理技術(shù).在自然語(yǔ)言處理技術(shù)中,可以把自然語(yǔ)言當(dāng)作一種時(shí)序字符串序列,然后訓(xùn)練一個(gè)神經(jīng)網(wǎng)絡(luò)模型捕捉時(shí)序序列中的特征,將其應(yīng)用于語(yǔ)言識(shí)別和機(jī)器翻譯等具體的應(yīng)用.與此類似,程序語(yǔ)言也是一種時(shí)序語(yǔ)言,在執(zhí)行的時(shí)候也是按照一定時(shí)間順序先后執(zhí)行.但程序語(yǔ)言與其他的語(yǔ)言(例如英語(yǔ))相比,是一種標(biāo)記語(yǔ)言,或者說(shuō)是一種“硬語(yǔ)言”,其語(yǔ)法定義可以唯一地解釋代碼含義,計(jì)算機(jī)也能根據(jù)確定的規(guī)則分析和執(zhí)行代碼.而英語(yǔ)等自然語(yǔ)言的含義和形式會(huì)靈活變化,比如含義相同的文章可以有不同的表述,或者文章存在歧義等.從上面的分析不難看出,使用深度學(xué)習(xí)技術(shù)學(xué)習(xí)程序語(yǔ)言中的特征要比學(xué)習(xí)自然語(yǔ)言中的特征更加簡(jiǎn)單,因?yàn)槌绦蛘Z(yǔ)言中的單詞含義唯一確定,不存在二義性.目前,很多的科研工作者已經(jīng)使用深度學(xué)習(xí)技術(shù)提取源代碼程序中缺陷部分的特征,訓(xùn)練相應(yīng)的神經(jīng)網(wǎng)絡(luò)模型來(lái)進(jìn)行軟件的漏洞檢測(cè).如Russell 等人[22]針對(duì)C/C++開源軟件代碼,提出了基于深度學(xué)習(xí)的函數(shù)級(jí)缺陷檢測(cè)方法.在文獻(xiàn)[22]的方法中,直接以函數(shù)體為基本單位來(lái)識(shí)別函數(shù)中是否存在對(duì)應(yīng)的缺陷,但存在的問(wèn)題是該種方法并不適用于包含跨函數(shù)數(shù)據(jù)依賴關(guān)系的代碼缺陷檢測(cè).Li 等人[23]基于深度學(xué)習(xí)方法實(shí)現(xiàn)了程序切片級(jí)別的缺陷檢測(cè)方法.在文獻(xiàn)[23]的方法中僅采用單一的詞向量作為代碼的特征向量表示,并且基于雙向LSTM 神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)了源代碼缺陷的二分類檢測(cè),但并未在多個(gè)特征融合、多種漏洞類型分類等方面做進(jìn)一步的研究.Zhou 等人[24]實(shí)現(xiàn)了基于圖神經(jīng)網(wǎng)絡(luò)的源代碼漏洞檢測(cè)系統(tǒng)Devign.該系統(tǒng)同樣是二分類的源代碼漏洞檢測(cè)系統(tǒng),即給定源代碼來(lái)判斷其中是否存在漏洞,但是卻無(wú)法識(shí)別具體的漏洞類型.Duan 等人[25]實(shí)現(xiàn)了基于注意力機(jī)制的源代碼缺陷檢測(cè)方法 VulSniper,實(shí)現(xiàn)了多類源代碼缺陷檢測(cè),但涉及到的源代碼漏洞類型較少,只涉及了CWE119 和CWE399 這2 種缺陷類型.Chakraborty等人[26]和段旭等人[27]基于代碼屬性圖和深度學(xué)習(xí)技術(shù)實(shí)現(xiàn)了漏洞檢測(cè)方法,但他們的不足在于仍然基于以函數(shù)或程序?yàn)閱挝贿M(jìn)行漏洞檢測(cè),并且他們的方法仍然是二分類方法,并不能檢測(cè)多種漏洞類型.Zou 等人[28]以及文獻(xiàn)[29]在文獻(xiàn)[23]的基礎(chǔ)上,基于程序中的控制依賴關(guān)系,提出稱之為“代碼注意力(code attention)”的新機(jī)制.在這種機(jī)制中,使用函數(shù)調(diào)用序列作為關(guān)鍵特征信息構(gòu)建了多分類的神經(jīng)網(wǎng)絡(luò)模型μVulDeePecker,該模型可以檢測(cè)多達(dá)40 種的CWE 漏洞類型.Wu 等人[30]使用了CNN與LSTM 的混合模型來(lái)進(jìn)行程序漏洞特征的提取,其實(shí)驗(yàn)結(jié)果表明采用混合模型可以提取更多的漏洞特征信息,從而使得模型的檢測(cè)效果更好.Nguyen 等人[31]把內(nèi)核方法與雙向循環(huán)神經(jīng)網(wǎng)絡(luò)(bidirectional recurrent neural network,BRNN)結(jié)合起來(lái),提出了深度代價(jià)敏感內(nèi)核機(jī)(deep cost sensitive kernel machine,DCKM)模型,可以處理機(jī)器指令集序列,實(shí)驗(yàn)結(jié)果顯示該模型可以有效解決深度學(xué)習(xí)數(shù)據(jù)集中存在的數(shù)據(jù)不平衡問(wèn)題.Li 等人[32]提出了一種基于混合神經(jīng)網(wǎng)絡(luò)的源代碼漏洞自動(dòng)檢測(cè)框架.該框架利用低級(jí)虛擬機(jī)中間表示(LLVM IR)和向后程序切片將輸入轉(zhuǎn)換為具有顯式結(jié)構(gòu)信息的中間表示,再采用混合神經(jīng)網(wǎng)絡(luò)模型對(duì)源代碼關(guān)鍵序列結(jié)構(gòu)信息進(jìn)行表征,然后自動(dòng)化地漏洞檢測(cè).其優(yōu)點(diǎn)在于該表征方式可以兼顧詞法分析并進(jìn)行細(xì)粒度地漏洞挖掘,準(zhǔn)確地識(shí)別出漏洞的具體位置.Cao 等人[33]針對(duì)緩沖區(qū)溢出漏洞和資源管理型漏洞,分別使用CNN 與LSTM提取程序所含漏洞的全局信息和局部的特征信息,實(shí)現(xiàn)一種結(jié)合了傅里葉變換的深度卷積 LSTM 神經(jīng)網(wǎng)絡(luò)模型,并應(yīng)用在程序的漏洞檢測(cè)上面.Mao 等人[34]提出了基于注意力的雙向長(zhǎng)短期記憶網(wǎng)絡(luò)(attentionbased bidirectional long short-term memory network,ABLSTM)模型,用于漏洞特征提取,取得了較好的漏洞檢測(cè)效果,此外該文獻(xiàn)也把深度學(xué)習(xí)的可解釋性用在漏洞的探測(cè)方面,使得深度學(xué)習(xí)技術(shù)不僅可以用在軟件方面,而且也使得內(nèi)在的工作機(jī)制為大眾所理解.此外,基于深度學(xué)習(xí)模型的漏洞檢測(cè)技術(shù)中還有基于抽象語(yǔ)法樹表征的漏洞挖掘模型[35-36]、基于圖表征的漏洞挖掘模型[37-41]、基于文本表征的漏洞挖掘模型[42-44]以及把抽象語(yǔ)法樹、文本表征、圖表征結(jié)合起來(lái)的漏洞檢測(cè)模型[45-46].
如圖1 所示,本文提出的基于比較學(xué)習(xí)的漏洞檢測(cè)技術(shù)分為多個(gè)步驟,下面分別介紹每一個(gè)步驟以及實(shí)現(xiàn)細(xì)節(jié).
Fig.1 Overall framework for comparative learning圖1 比較學(xué)習(xí)整體框架圖
本文采用的源程序數(shù)據(jù)集來(lái)自于NIST 軟件保障參考數(shù)據(jù)集(software assurance reference dataset,SARD)項(xiàng)目[47].該數(shù)據(jù)集能夠?yàn)檠芯空咛峁┮恍┮阎能浖踩┒?,可用于源碼漏洞檢測(cè)模型的訓(xùn)練.SARD中的源代碼主要包括三大類別:1)“Fix”類型,表示源代碼中的漏洞已被修復(fù),不再包含漏洞;2)“Flaw”類型,表示其中的源代碼含有漏洞;3)“Mixed”類型,表示相關(guān)源碼中不僅包含漏洞,同時(shí)也含有相應(yīng)的補(bǔ)丁程序.到目前為止,SARD 共有測(cè)試案例251 336條,其中包括C 代碼96 494 個(gè),C++代碼34 133 個(gè),Java 代碼46 438 個(gè),PHP 代碼42 253 個(gè),C#程序32 018個(gè).選取其中的C 程序創(chuàng)建了實(shí)驗(yàn)的數(shù)據(jù)集,如表1所示.
Table 1 Data Set Composition表1 數(shù)據(jù)集構(gòu)成
從表1 中可以看出,數(shù)據(jù)集中C 程序總數(shù)為96 494個(gè),其中“Fix”類型的程序有568 個(gè),它們沒(méi)有漏洞;“Flaw”類型的程序有6 171 個(gè),含有漏洞類型115 種;“Mixed”類型的程序有89 755 個(gè),含有漏洞類型124 種.把Flaw 類型和Mixed 類型重復(fù)的漏洞類型去掉后,漏洞類型總數(shù)為180 個(gè).同時(shí),有27 種漏洞類型對(duì)應(yīng)的程序數(shù)量超過(guò)了1 000 個(gè),如表1 最后一列所示.
在創(chuàng)建這個(gè)數(shù)據(jù)集時(shí),首先對(duì)數(shù)據(jù)集中所有的C 代碼進(jìn)行了檢查,以此發(fā)現(xiàn)其中的一些錯(cuò)誤.經(jīng)過(guò)詳細(xì)的檢查,發(fā)現(xiàn)數(shù)據(jù)集中有20 個(gè)C 代碼存在字符編碼的錯(cuò)誤,如表1 第4 列和圖1 中1)所示.這些錯(cuò)誤當(dāng)中大部分是雙引號(hào)的問(wèn)題,其余是在語(yǔ)句行的末尾多了一些隱藏的字符,如“SUB”等.這些字符編碼的錯(cuò)誤會(huì)使得在使用JSON 格式保存數(shù)據(jù)集時(shí),產(chǎn)生意想不到的問(wèn)題.因此對(duì)這些文件進(jìn)行了處理,結(jié)果如圖1 中2)所示.
在基于深度學(xué)習(xí)的漏洞檢測(cè)方法中,為了提高模型的泛化能力,普遍都會(huì)對(duì)數(shù)據(jù)集中的代碼符號(hào)化,去除代碼中個(gè)性的特征,輔之以用統(tǒng)一的符號(hào)來(lái)代替這些特征,降低模型提取程序特征的難度,提高模型的泛化能力.基于此,本文基于文獻(xiàn)[26]的方式也對(duì)數(shù)據(jù)集中的C 代碼符號(hào)化.方式是把程序所有的語(yǔ)句放在一行中,當(dāng)成一個(gè)完整的語(yǔ)句,然后符號(hào)化.此外,在符號(hào)化的過(guò)程中,由于程序語(yǔ)言本身的關(guān)鍵字、標(biāo)準(zhǔn)函數(shù)庫(kù)、API 函數(shù)庫(kù)以及常用的頭文件是程序特有的特征,所以符號(hào)化時(shí)保存了下來(lái).代碼1 顯示了1 個(gè)示例程序源代碼,代碼2 表示把程序放在單獨(dú)的一行中,代碼3 表示符號(hào)化后的代碼.表2顯示了收集的程序本身的特征信息.數(shù)據(jù)集中代碼符號(hào)化完整的流程如圖1 中步驟①~③的1)~4)所示.然而在評(píng)價(jià)模型的實(shí)驗(yàn)過(guò)程中發(fā)現(xiàn),在基于本文提出的比較學(xué)習(xí)的漏洞檢測(cè)方法中,是否對(duì)數(shù)據(jù)集中的代碼進(jìn)行符號(hào)化,并不影響模型的漏洞識(shí)別能力,這從一個(gè)側(cè)面反映出本文提出的深度學(xué)習(xí)漏洞檢測(cè)方法具有比較強(qiáng)的學(xué)習(xí)能力,詳細(xì)的實(shí)驗(yàn)內(nèi)容和結(jié)果請(qǐng)參閱本文的第3 節(jié).盡管如此,仍然在這里向大家展示深度學(xué)習(xí)中代碼符號(hào)化的具體過(guò)程,以此了解深度學(xué)習(xí)在程序漏洞檢測(cè)方面的普遍應(yīng)用流程.
Table 2 Features of C Language表2 C 語(yǔ)言的特征
代碼1.示例源代碼.
代碼2.代碼中所有的語(yǔ)句放在一行中.
代碼3.符號(hào)化后的代碼.
在符號(hào)化完數(shù)據(jù)集中的代碼后,就可以創(chuàng)建語(yǔ)料庫(kù),訓(xùn)練一個(gè)新的詞向量模型,如圖1 步驟④中的5)和6)所示.之所以要?jiǎng)?chuàng)建新的語(yǔ)料庫(kù)并且訓(xùn)練一個(gè)新的詞向量模型的原因是:當(dāng)前并沒(méi)有一個(gè)專門針對(duì)C 語(yǔ)言的詞向量模型.現(xiàn)有的word2vec[48-50]模型大多數(shù)是處理自然語(yǔ)言的詞向量模型,并不適合用在某種編程語(yǔ)言上,例如C 語(yǔ)言.而C 語(yǔ)言有其自己的語(yǔ)法、語(yǔ)義和時(shí)序特征,這是與自然語(yǔ)言以及其他編程語(yǔ)言最大的不同點(diǎn).通過(guò)創(chuàng)建專門針對(duì)C 語(yǔ)言的詞向量模型,可以讓深度學(xué)習(xí)模型更好地理解C語(yǔ)言的本質(zhì)特征和內(nèi)在豐富的語(yǔ)義,學(xué)習(xí)到區(qū)別度更大的漏洞特征.創(chuàng)建語(yǔ)料庫(kù)和詞向量模型的具體方式為:首先對(duì)數(shù)據(jù)集中經(jīng)過(guò)符號(hào)化的96 494 個(gè)C程序進(jìn)行單詞統(tǒng)計(jì),得到詞匯量為97 425 010、單詞總數(shù)為24 610 的語(yǔ)料庫(kù).然后使用word2vec 中的CBOW 方法訓(xùn)練一個(gè)詞向量模型.如圖1 步驟⑤中的6)所示.CBOW 是word2vec 中用于將文本表示成向量的一種方法.在CBOW 方法中,通過(guò)周圍詞預(yù)測(cè)中心詞,從而利用中心詞的預(yù)測(cè)結(jié)果,并基于梯度下降法(gradient descent)不斷地去調(diào)整周圍詞的向量,從而獲得整個(gè)語(yǔ)料庫(kù)中所有單詞的詞向量.此外,也可以使用word2vec 中的Skip-gram 方法來(lái)訓(xùn)練詞向量模型.在實(shí)驗(yàn)中,2 種方法訓(xùn)練的詞向量模型效果相差不多,這里不贅述.
當(dāng)詞向量模型訓(xùn)練完成后,就可以使用該模型來(lái)向量化數(shù)據(jù)集里的C 程序代碼.如圖1 步驟⑤所示.具體的實(shí)現(xiàn)方式為:1)讀取數(shù)據(jù)集中每一行內(nèi)容(一個(gè)完整的C 代碼);2)使用分詞工具NLTK[51-52]將一整行代碼分為若干個(gè)單詞;3)對(duì)每一個(gè)單詞使用前面訓(xùn)練好的詞向量模型實(shí)施向量化,生成維度固定的詞向量;4)將每一個(gè)單詞對(duì)應(yīng)的向量進(jìn)行相加,取平均值,得到整個(gè)程序?qū)?yīng)的向量,如式(1)所示.其中,XC表示一個(gè)C 代碼對(duì)應(yīng)的向量表示,XW表示代碼中一個(gè)詞匯的向量表示,n表示代碼中詞匯的數(shù)量.5)重復(fù)圖1 步驟①~④,得到數(shù)據(jù)集中所有代碼各自對(duì)應(yīng)的詞向量.結(jié)果如圖1 步驟⑥中的7)所示.基于圖1 的步驟①~⑥,得到整個(gè)數(shù)據(jù)集中所有程序的向量化表示.
其中W 表示C 代碼中的一個(gè)詞匯.
把數(shù)據(jù)集中所有的程序向量化后,就可以創(chuàng)建訓(xùn)練集樣本和測(cè)試集樣本.正如在2.1 節(jié)描述的,數(shù)據(jù)集由96 494 個(gè)C 程序構(gòu)成,有“Fix”“Flaw”“Mixed”這3 種類型的代碼.其中“Fix”類型中的代碼是已經(jīng)修復(fù)好的代碼,沒(méi)有漏洞;“Flaw”類型的代碼存在漏洞;“Mixed”類型的代碼不但存在漏洞,還有對(duì)應(yīng)的修復(fù)好的代碼.基于這樣的特點(diǎn),創(chuàng)建樣本:1)“Fix”類型的代碼由于沒(méi)有漏洞,直接就加入到樣本集里;2)“Flaw”類型的代碼由于性質(zhì)單一,沒(méi)有對(duì)應(yīng)的修復(fù)程序,并且每一個(gè)漏洞程序都有確定的CWE 類型說(shuō)明,所以也直接加入到樣本集里,其CWE 類型說(shuō)明可以作為樣本的漏洞類型標(biāo)簽;3)“Mixed”類型的代碼不但存在漏洞代碼,而且存在對(duì)應(yīng)的修復(fù)程序.基于這樣的特點(diǎn),首先把漏洞代碼提取出來(lái)加入到樣本集中(對(duì)應(yīng)的CWE 類型說(shuō)明作為樣本標(biāo)簽);其次把每一個(gè)漏洞程序?qū)?yīng)的修復(fù)程序提取出來(lái)加入到樣本集里.這里需要注意的是,“Mixed”類型代碼中的漏洞代碼對(duì)應(yīng)的修復(fù)程序數(shù)量不止1 個(gè),有時(shí)候1個(gè)漏洞代碼有多個(gè)對(duì)應(yīng)的修復(fù)代碼,其數(shù)量不固定,最少的有1 個(gè),最多的有12 個(gè).采用這3 種方式處理后,獲得了數(shù)量為280 894 的樣本集,其中含有漏洞的代碼95 926 個(gè),漏洞類型總數(shù)為180;不包含漏洞的代碼184 968 個(gè).但在實(shí)際的模型訓(xùn)練過(guò)程中,有的漏洞類型對(duì)應(yīng)的樣本數(shù)量非常少,不利于深度學(xué)習(xí)模型的學(xué)習(xí),如CWE133 漏洞類型對(duì)應(yīng)的樣本數(shù)量為1 個(gè),CWE020 對(duì)應(yīng)的樣本數(shù)量為2 個(gè).因此把這些樣本數(shù)量非常少的漏洞類型以及對(duì)應(yīng)的樣本從樣本集里刪除.經(jīng)過(guò)修正后的樣本集的樣本總數(shù)為280 793,其中含有漏洞的代碼為95 821 個(gè),漏洞類型總數(shù)為150(詳細(xì)的漏洞類型以及對(duì)應(yīng)的樣本數(shù)量請(qǐng)參閱附錄A 中的表A1);不包含漏洞的代碼為184 972 個(gè).到此為止訓(xùn)練模型需要的數(shù)據(jù)集就創(chuàng)建完成.接下來(lái)就可以把數(shù)據(jù)集隨機(jī)打亂,根據(jù)一定的比例劃分成訓(xùn)練集、測(cè)試集和驗(yàn)證集.上面的過(guò)程如圖1 步驟⑥和步驟⑦中的7)和8)所示.
比較學(xué)習(xí)思想的靈感來(lái)源于人類的一種學(xué)習(xí)方式.當(dāng)人類學(xué)習(xí)一個(gè)分類時(shí),總是尋找和這個(gè)類別相似的類和不同的類.從相同類別中學(xué)習(xí)該類別共有的一些特征,從不同的類別中學(xué)習(xí)不同類別之間明顯的區(qū)分特征.通過(guò)這種方式,人類可以非??斓卣莆漳撤N分類的重要和細(xì)微的特征.在本文中,比較學(xué)習(xí)思想采用3 種方式實(shí)現(xiàn).
1)統(tǒng)計(jì)訓(xùn)練集中每一種漏洞類型的樣本數(shù)量,也就是每個(gè)樣本屬于哪一種漏洞類型.如算法1 所示.
算法1.統(tǒng)計(jì)每一個(gè)漏洞類型的樣本數(shù)量.
2)基于1)返回的結(jié)果,為訓(xùn)練集里的每一個(gè)樣本尋找漏洞類型相同的樣本和漏洞類型不同的樣本.如算法2 所示.首先,從訓(xùn)練集Train中選取1 個(gè)樣本,稱之為目標(biāo)樣本;其次,在aDict中刪除該目標(biāo)樣本,因?yàn)槟繕?biāo)樣本本身不能作為自己比較學(xué)習(xí)的樣本;再次,在aDict中獲取與目標(biāo)樣本類型相同的樣本的數(shù)量,如果該數(shù)值大于Num那么就可以在aDict中隨機(jī)選取Num個(gè)樣本作為目標(biāo)樣本的同類型樣本,否則按aDict中實(shí)際的樣本數(shù)量為目標(biāo)樣本選取同類型的樣本;最后,采用上面相同的步驟為目標(biāo)樣本選取類型不相同的樣本.算法的輸出SameSam和DiffSam分別表示選取的同類型樣本集合和不同類型樣本集合.
算法2.選擇相同樣本和不相同樣本.
3)根據(jù)2)中返回的同類型樣本集合和不同類型樣本集合,構(gòu)建目標(biāo)樣本的同類型學(xué)習(xí)矩陣和不同類型學(xué)習(xí)矩陣.如算法3 所示.
算法3.創(chuàng)建目標(biāo)樣本的同類型學(xué)習(xí)矩陣和不同類型學(xué)習(xí)矩陣.
在算法3 中,根據(jù)目標(biāo)樣本的同類型樣本集合SameSam,創(chuàng)建同類型學(xué)習(xí)矩陣tmatr,然后把矩陣中每一個(gè)同類型樣本對(duì)應(yīng)的向量進(jìn)行相加并取平均值,得到最終的同類型學(xué)習(xí)矩陣SameMatrix.不同類型樣本集合DiffSam也采取這種方式,得到不同類型樣本集合的學(xué)習(xí)矩陣DiffMatrix.重復(fù)圖1 步驟①~③就可以為訓(xùn)練集中每一個(gè)樣本建立同類型的學(xué)習(xí)向量和不同類型的學(xué)習(xí)向量,從而創(chuàng)建比較學(xué)習(xí)的樣本基礎(chǔ).這一過(guò)程如圖1 步驟⑧中的9)所示.在9)中,第3 行表示目標(biāo)樣本,第1 行和第2 行表示同類型的樣本,第4 行和第5 行表示不同類型的樣本.當(dāng)為訓(xùn)練集建立起比較學(xué)習(xí)矩陣后,就可以將訓(xùn)練集以及比較學(xué)習(xí)矩陣輸入到深度學(xué)習(xí)網(wǎng)絡(luò)中,進(jìn)行深度學(xué)習(xí)模型的訓(xùn)練.
上面介紹了比較學(xué)習(xí)的核心思想和實(shí)現(xiàn)算法,其中必須要考慮的問(wèn)題是當(dāng)為數(shù)據(jù)集中的訓(xùn)練樣本尋找類型相同和類型不相同的學(xué)習(xí)樣本時(shí),所找的學(xué)習(xí)樣本的數(shù)量是主要的性能開銷.從直覺上看,所找的學(xué)習(xí)樣本數(shù)量越多,則深度學(xué)習(xí)模型訓(xùn)練過(guò)程中將會(huì)花費(fèi)更多的時(shí)間和消耗更大的內(nèi)存.而在本文進(jìn)行的實(shí)驗(yàn)評(píng)價(jià)過(guò)程中也證明了這一點(diǎn).在實(shí)驗(yàn)中發(fā)現(xiàn),基于比較學(xué)習(xí)的深度學(xué)習(xí)模型在訓(xùn)練過(guò)程中的性能開銷與學(xué)習(xí)樣本的數(shù)量成正比關(guān)系,即:學(xué)習(xí)樣本越多,性能開銷越大.然而在大量的實(shí)驗(yàn)過(guò)程中也發(fā)現(xiàn),基于比較學(xué)習(xí)的深度學(xué)習(xí)模型漏洞檢測(cè)的準(zhǔn)確率不會(huì)受到學(xué)習(xí)樣本數(shù)量變化劇烈的影響,也就是學(xué)習(xí)樣本的數(shù)量與深度學(xué)習(xí)模型識(shí)別漏洞的能力沒(méi)有較大的關(guān)系.基于這個(gè)發(fā)現(xiàn),在使用本文所提出的比較學(xué)習(xí)方法訓(xùn)練深度學(xué)習(xí)模型時(shí),可以選取適當(dāng)?shù)臄?shù)量值作為學(xué)習(xí)樣本的數(shù)量,從而降低深度學(xué)習(xí)模型的性能開銷,但不會(huì)對(duì)模型識(shí)別漏洞的能力造成太大的影響,詳細(xì)的實(shí)驗(yàn)過(guò)程和結(jié)果請(qǐng)參閱3.4.2 節(jié)任務(wù)2.
本文采用的深度學(xué)習(xí)模型是一個(gè)簡(jiǎn)單的全連接神經(jīng)網(wǎng)絡(luò).因?yàn)樵谘芯恐邪l(fā)現(xiàn),即使是簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò),基于本文的詞向量模型和比較學(xué)習(xí)也能獲得較高準(zhǔn)確率的漏洞識(shí)別效果.本文使用的神經(jīng)網(wǎng)絡(luò)示例圖如圖1 步驟⑨中10)所示,詳細(xì)的結(jié)構(gòu)如圖2 所示.
Fig.2 Deep learning network architecture圖2 深度學(xué)習(xí)網(wǎng)絡(luò)結(jié)構(gòu)
該深度學(xué)習(xí)模型包含1 個(gè)輸入層模塊、1 個(gè)特征抽取層模塊和1 個(gè)分類層模塊.其中,輸入層模塊由1 個(gè)全連接網(wǎng)絡(luò)和ReLU 激活函數(shù)構(gòu)成.特征抽取層模塊由數(shù)量不固定的全連接網(wǎng)絡(luò)構(gòu)成,在全連接網(wǎng)絡(luò)之間采用ReLU 激活函數(shù),以及1 個(gè)丟棄層Dropout.分類層模塊由1 個(gè)全連接網(wǎng)絡(luò)構(gòu)成,輸出每一個(gè)樣本的得分,然后使用Softmax 函數(shù)對(duì)得分進(jìn)行計(jì)算后輸出150 個(gè)漏洞類別預(yù)測(cè)的概率值,其中概率值最大的即為最終的分類結(jié)果.
模型中使用的損失函數(shù)是交叉熵?fù)p失函數(shù)(cross entropy loss),如式(2)中,Closs表示損失值.除此之外,模型中也使用余弦相似度(cosine similarity)公式來(lái)計(jì)算相同類型向量之間相似性的損失計(jì)算,以及不同類型向量之間相似性的損失計(jì)算,如式(3)和式(4).其中,式(2)中的M表示漏洞類別的數(shù)量.yic表示符號(hào)函數(shù)(0 或者1),如果樣本i的真實(shí)類別等于c,則yic=1,否則yic=0.pic表 示樣本i屬于類別c的概率預(yù)測(cè)值.式(3)中的Sloss表示目標(biāo)樣本與同類型樣本的相似性計(jì)算的損失值,式(4)中的Dloss表示目標(biāo)樣本與不同類型樣本相似性計(jì)算的損失值,Ti,Si,Di分別代表目標(biāo)樣本、同類型樣本和不同類型樣本向量的各分量.最后,把這3 個(gè)損失值進(jìn)行相加得到最終的模型損失值Loss,如式(5)所示.
實(shí)驗(yàn)所用的計(jì)算機(jī)使用的CPU 為2 顆E4216,32 核64 線程,主頻為2.1 GHz,顯卡為一塊NVIDIA Quadrp,顯存為4 GB,硬盤容量為3.6 TB,內(nèi)存大小是16 GB.軟件環(huán)境采用Linux 20.04,開發(fā)語(yǔ)言為Python 3.8.深度學(xué)習(xí)框架采用Pytorch1.10.1+Cuda11.3.
本文采用2.5 節(jié)所構(gòu)建的數(shù)據(jù)集,樣本總數(shù)為280 793,其中含有漏洞的代碼為95 821 個(gè),漏洞類型總數(shù)為150;不包含漏洞的代碼為184 972 個(gè).樣本集中所有樣本的標(biāo)簽根據(jù)SARD 數(shù)據(jù)集的注釋進(jìn)行標(biāo)注.
在深度學(xué)習(xí)領(lǐng)域,混淆矩陣是通用的衡量模型性能的指標(biāo),該矩陣描述了數(shù)據(jù)集中樣本的實(shí)際類別和預(yù)測(cè)類別之間的混合,即真陽(yáng)性(true positive,TP)、假陰性(false negative,F(xiàn)N)、假陽(yáng)性(false positive,F(xiàn)P)和真陰性(true negative,TN).其中,TP表示漏洞代碼被分類正確的情況,F(xiàn)N表示漏洞代碼被分類不正確的情況,F(xiàn)P表示非漏洞代碼被分類為漏洞代碼的情況,TN表示非漏洞代碼被分類為非漏洞代碼的情況.本文使用3 種評(píng)估指標(biāo):召回率(Recall)、精確率(Precision)和準(zhǔn)確率記為(Accuracy),如式(6)~(8)所示.基于評(píng)估指標(biāo)分別繪制模型的精確召回曲線(precision recall curve,PR)、接受者操作特征曲線(receiver operating characteristic curve,ROC).同時(shí),在實(shí)驗(yàn)的過(guò)程中也觀察了模型損失函數(shù)值的變化情況.
3.4.1 數(shù)據(jù)集的平衡性問(wèn)題
如2.5 節(jié)所述,數(shù)據(jù)集中樣本總數(shù)為280 793.其中漏洞代碼數(shù)量為95 821,非漏洞代碼數(shù)量為184 972,包含的漏洞類型為150 種,漏洞種類以及各種漏洞對(duì)應(yīng)的樣本數(shù)量請(qǐng)查閱附錄A 中的表A1.為了直觀地顯示出各種漏洞類型所占的比率,畫出它們的餅狀圖,如圖3 所示(注:由于數(shù)據(jù)集中漏洞類型較多,圖3中并沒(méi)有把所有漏洞類型的標(biāo)注顯示出來(lái)).
Fig.3 Vulnerability type distribution of datasets圖3 數(shù)據(jù)集漏洞類型分布
從圖3 中可以看出,這樣的數(shù)據(jù)集存在2 個(gè)問(wèn)題:?jiǎn)栴}1 是數(shù)據(jù)集中非漏洞代碼的數(shù)量非常大,如圖3中棕色區(qū)域所示;問(wèn)題2 是漏洞代碼分布情況非常不平衡.這2 個(gè)問(wèn)題都會(huì)使得模型產(chǎn)生嚴(yán)重的過(guò)擬合或欠擬合,降低模型的識(shí)別能力.針對(duì)這2 個(gè)問(wèn)題采用2 種方式進(jìn)行解決:1)對(duì)數(shù)據(jù)集中的非漏洞代碼進(jìn)行隨機(jī)欠采樣處理,降低非漏洞代碼的比例,處理之后的數(shù)據(jù)集分布情況如圖4 所示.經(jīng)過(guò)這樣的處理后,數(shù)據(jù)集中非漏洞代碼的數(shù)量降為16 359,各種漏洞代碼數(shù)量仍為95821.如圖4 中灰色區(qū)域所示,數(shù)據(jù)集中樣本總數(shù)為112180.經(jīng)過(guò)處理之后的數(shù)據(jù)集中非漏洞的樣本數(shù)量大幅度地降低,使得數(shù)據(jù)集整體處于基本平衡的狀態(tài).2)把數(shù)據(jù)集中的樣本數(shù)量依據(jù)6:2:2 的比例分為訓(xùn)練集、測(cè)試集和驗(yàn)證集.訓(xùn)練集用來(lái)訓(xùn)練模型,測(cè)試集用來(lái)測(cè)試模型的評(píng)價(jià)指標(biāo),驗(yàn)證集用來(lái)驗(yàn)證模型的漏洞識(shí)別效果.正如問(wèn)題2 數(shù)據(jù)集中各種漏洞類型的樣本數(shù)量存在不平衡的問(wèn)題,對(duì)這個(gè)問(wèn)題的解決采用對(duì)訓(xùn)練集中漏洞數(shù)量較少的漏洞類型進(jìn)行過(guò)度采樣的方法,具體使用邊界線-SMOTE(borderline-SMOTE)技術(shù).之所以不對(duì)測(cè)試集和驗(yàn)證集過(guò)度采樣,是因?yàn)闇y(cè)試集和驗(yàn)證集是用來(lái)檢驗(yàn)?zāi)P偷男Ч?,其?shù)據(jù)分布情況必須保持原始狀況,這樣才能保證測(cè)試的真實(shí)性和有效性.
Fig.4 Vulnerability type distribution after data set processing圖4 數(shù)據(jù)集處理后的漏洞類型分布
經(jīng)過(guò)邊界線-SMOTE 技術(shù)處理后的訓(xùn)練數(shù)據(jù)集中,樣本總數(shù)為239 691,各種漏洞類型平均樣本數(shù)量為1 597,整體分布情況如圖5 所示.從圖5 中可以看出訓(xùn)練數(shù)據(jù)集中各漏洞類型的數(shù)據(jù)量基本保持平衡,非漏洞的數(shù)據(jù)量占比稍大,如圖5 中綠色部分所示.這和漏洞分布的實(shí)際情況保持一致.在真實(shí)的漏洞分布中,存在漏洞的程序的數(shù)量畢竟較少,而不存在漏洞的程序較多.到此為止,實(shí)驗(yàn)中需要的數(shù)據(jù)集處理完成.從整體上看該數(shù)據(jù)集符合深度學(xué)習(xí)訓(xùn)練對(duì)數(shù)據(jù)集平衡性的要求,而且從圖6 中可以看出,在訓(xùn)練的過(guò)程中,模型訓(xùn)練損失值和測(cè)試損失值下降趨勢(shì)相同,并且差值比較小,說(shuō)明模型使用這樣的數(shù)據(jù)集進(jìn)行訓(xùn)練,泛化能力較強(qiáng),可以有效地防止深度學(xué)習(xí)過(guò)程中出現(xiàn)的欠擬合和過(guò)擬合現(xiàn)象的發(fā)生.此外,在3.4.2 節(jié)評(píng)價(jià)實(shí)驗(yàn)中較高的驗(yàn)證準(zhǔn)確率也說(shuō)明該數(shù)據(jù)是比較合適的,可以應(yīng)用于模型訓(xùn)練與檢測(cè)的過(guò)程.
Fig.5 Vulnerability type distribution after over-sampling圖5 過(guò)度采樣后的漏洞類型分布
Fig.6 Changes of accuracy rate and loss value when comparative learning is not used during training圖6 訓(xùn)練中未使用比較學(xué)習(xí)時(shí)準(zhǔn)確率和損失值的變化
3.4.2 實(shí)驗(yàn)評(píng)價(jià)
為了評(píng)價(jià)本文所提出的基于比較學(xué)習(xí)的方法的有效性,設(shè)置了3 個(gè)實(shí)驗(yàn)任務(wù).任務(wù)1 驗(yàn)證比較學(xué)習(xí)的漏洞識(shí)別的準(zhǔn)確率和訓(xùn)練過(guò)程中的損失值變化情況;任務(wù)2 對(duì)比較學(xué)習(xí)的性能開銷進(jìn)行分析;任務(wù)3對(duì)基于比較學(xué)習(xí)的模型學(xué)習(xí)能力進(jìn)行檢測(cè).在實(shí)驗(yàn)過(guò)程中模型的各參數(shù)進(jìn)行如下的設(shè)置:epoch=200,batchsize=2 048,pnum=10,nnum=10,dropout=0.2,learningrate=0.2,其中參數(shù)pnum表示訓(xùn)練集中每個(gè)樣本對(duì)應(yīng)的同類型樣本的數(shù)量,參數(shù)nnum表示訓(xùn)練集中每個(gè)樣本對(duì)應(yīng)的不同類型樣本的數(shù)量,它們都可以取不同的數(shù)值,這里設(shè)置為10.
任務(wù)1.比較學(xué)習(xí)在漏洞識(shí)別準(zhǔn)確率和損失值方面的表現(xiàn).
對(duì)于任務(wù)1,分為2 組實(shí)驗(yàn):第1 組實(shí)驗(yàn)比較在本文整理的數(shù)據(jù)集上應(yīng)用比較學(xué)習(xí)前后的漏洞識(shí)別的準(zhǔn)確率和損失值變化情況;第2 組實(shí)驗(yàn)比較在文獻(xiàn)[28]的數(shù)據(jù)集上應(yīng)用比較學(xué)習(xí)前后的表現(xiàn).經(jīng)過(guò)大量的實(shí)驗(yàn)后,第1 組的實(shí)驗(yàn)結(jié)果如圖6 和圖7 所示.其中圖6 顯示了未應(yīng)用比較學(xué)習(xí)時(shí)模型訓(xùn)練過(guò)程中訓(xùn)練集、測(cè)試集和驗(yàn)證集的準(zhǔn)確率變化,以及訓(xùn)練集和測(cè)試集損失值的變化情況.圖7 顯示了應(yīng)用比較學(xué)習(xí)后訓(xùn)練集、測(cè)試集和驗(yàn)證集的準(zhǔn)確率變化,以及訓(xùn)練集和測(cè)試集損失值的變化情況.
Fig.7 Changes of accuracy rate and loss value after comparative learning is used during trinting圖7 訓(xùn)練中使用比較學(xué)習(xí)后準(zhǔn)確率和損失值的變化
從圖6 中可以看出,未應(yīng)用比較學(xué)習(xí)前,模型的訓(xùn)練集、測(cè)試集和驗(yàn)證集的準(zhǔn)確率不高,訓(xùn)練集準(zhǔn)確率為68.5%,測(cè)試集的準(zhǔn)確率為62.9%,驗(yàn)證集的準(zhǔn)確率為62.5%;而且訓(xùn)練集和測(cè)試集的損失值的下降趨勢(shì)不平穩(wěn),波動(dòng)起伏較大,很不穩(wěn)定.從圖7 中可以看出,在應(yīng)用比較學(xué)習(xí)后,模型的訓(xùn)練集、測(cè)試集和驗(yàn)證集的準(zhǔn)確率穩(wěn)步提高,最后趨于平緩,訓(xùn)練集的準(zhǔn)確率達(dá)到95%,測(cè)試集的準(zhǔn)確率達(dá)到92.0%,驗(yàn)證集的準(zhǔn)確率達(dá)到91.9%(注:由于測(cè)試集和驗(yàn)證集的準(zhǔn)確率幾乎相同,所以在圖6 和圖7 中顯示得不明顯).訓(xùn)練集和測(cè)試集的損失值在前20 輪訓(xùn)練中迅速下降,急速收斂,在之后的訓(xùn)練中趨于平緩,顯示出模型逐步趨于穩(wěn)定.
在第2 組實(shí)驗(yàn)中,選取文獻(xiàn)[28]的數(shù)據(jù)集驗(yàn)證本文提出的比較學(xué)習(xí)方法的效果.文獻(xiàn)[28]使用的數(shù)據(jù)集被稱之為MVD(multiclass vulnerability dataset).在該漏洞數(shù)據(jù)集中,總共有181 641 個(gè)被稱為代碼片段(code gadgets)的樣本程序.其中,138 522 個(gè)樣本沒(méi)有漏洞,43 119 個(gè)樣本存在漏洞,其漏洞類型覆蓋40 種CWE 類型的漏洞.在實(shí)驗(yàn)中,仍然按照6:2:2 的比例劃分訓(xùn)練集、測(cè)試集和驗(yàn)證集.圖8 和圖9 分別展示了在MVD 數(shù)據(jù)集上使用比較學(xué)習(xí)前后的模型訓(xùn)練集、測(cè)試集和驗(yàn)證集的準(zhǔn)確率變化,以及訓(xùn)練集和測(cè)試集損失值的變化情況.
Fig.8 Changes of accuracy value and loss value for MVD when comparative learning is not used during training圖8 訓(xùn)練中未使用比較學(xué)習(xí)時(shí)MVD 準(zhǔn)確率和損失值的變化
Fig.9 Changes of accuracy value and loss value for MVD after comparative learning is used during training圖9 訓(xùn)練中使用比較學(xué)習(xí)后MVD 準(zhǔn)確率和損失值的變化
從圖8 中可以看出,未應(yīng)用比較學(xué)習(xí)前,文獻(xiàn)[28]的訓(xùn)練集、測(cè)試集和驗(yàn)證集的準(zhǔn)確率不高,訓(xùn)練集準(zhǔn)確率為78.1%,測(cè)試集的準(zhǔn)確率為73.1%,驗(yàn)證集的準(zhǔn)確率為73.09%;而且訓(xùn)練集和測(cè)試集的損失值的下降趨勢(shì)不平穩(wěn),波動(dòng)起伏較大,很不穩(wěn)定.
從圖9 中可以看出,在應(yīng)用比較學(xué)習(xí)后,文獻(xiàn)[28]中的模型訓(xùn)練集、測(cè)試集和驗(yàn)證集的準(zhǔn)確率在比較短的時(shí)間內(nèi)急速提高,在將近20 輪時(shí)達(dá)到95%以上,最后趨于平緩,訓(xùn)練集的準(zhǔn)確率穩(wěn)定在97.9%,測(cè)試集的準(zhǔn)確率穩(wěn)定在95.9%,驗(yàn)證集的準(zhǔn)確率穩(wěn)定在96.2%(注:由于測(cè)試集和驗(yàn)證集的準(zhǔn)確率幾乎相同,圖9 中顯示得不明顯).訓(xùn)練集和測(cè)試集的損失值在前20 輪之內(nèi)迅速下降,急速收斂,在之后的訓(xùn)練過(guò)程中趨于平緩,顯示出模型逐步穩(wěn)定下來(lái).
任務(wù)2.比較學(xué)習(xí)在性能開銷方面的實(shí)驗(yàn)分析.
在比較學(xué)習(xí)中,由于需要為訓(xùn)練集中每個(gè)樣本選取數(shù)量不同的同類型樣本和不同類型的樣本進(jìn)行訓(xùn)練學(xué)習(xí),所以比較學(xué)習(xí)的性能開銷主要花費(fèi)在為每個(gè)樣本選取學(xué)習(xí)的樣本方面.實(shí)驗(yàn)數(shù)據(jù)集中總共包含150 種不同類型的漏洞樣本,所以為每個(gè)樣本選取不同數(shù)量的、不同類型的漏洞樣本時(shí),其數(shù)量上限為150.對(duì)于為每個(gè)樣本選取漏洞類型相同的樣本,其數(shù)量與不同類型漏洞樣本的數(shù)量類似.因此在實(shí)驗(yàn)中,以數(shù)量5 為步長(zhǎng),遞進(jìn)地為每個(gè)樣本選取數(shù)量不同的同類型樣本和不同類型樣本,然后測(cè)量訓(xùn)練時(shí)內(nèi)存的使用量和花費(fèi)的時(shí)間.經(jīng)過(guò)30 次實(shí)驗(yàn)后,繪制出了如圖10 所示的比較學(xué)習(xí)性能開銷圖.當(dāng)選擇不同數(shù)量的比較學(xué)習(xí)樣本時(shí),訓(xùn)練集、測(cè)試集和驗(yàn)證集的準(zhǔn)確率變化情況,如圖11 所示.
Fig.10 Changes of model performance varying with the number of comparative learning samples圖10 模型性能隨比較學(xué)習(xí)樣本數(shù)量的變化
Fig.11 Changes of model accuracy varying with the number of comparative learning samples圖11 模型準(zhǔn)確率隨比較學(xué)習(xí)樣本數(shù)量的變化
從圖10 中可以看出,總體上模型的性能開銷與選取的比較學(xué)習(xí)的樣本數(shù)量成正比關(guān)系,隨著比較學(xué)習(xí)樣本數(shù)量的增加,模型的性能開銷也逐漸增大.當(dāng)為訓(xùn)練集中的每個(gè)樣本選取150 個(gè)比較學(xué)習(xí)的樣本時(shí),性能開銷達(dá)到最大值,此時(shí)內(nèi)存使用量達(dá)到614.9 MB,消耗的時(shí)間達(dá)到1 243 s.但同時(shí)在實(shí)驗(yàn)中也觀察到,盡管模型的性能開銷隨著比較學(xué)習(xí)樣本數(shù)量的增加而增加,但模型的準(zhǔn)確率并沒(méi)有隨著樣本數(shù)量的增加而劇烈地變化,總體上維持在固定的區(qū)間之內(nèi).訓(xùn)練集準(zhǔn)確率的范圍為0.948~0.952,測(cè)試集的準(zhǔn)確率范圍為 0.914~0.921,驗(yàn)證集的準(zhǔn)確率范圍為0.915~0.920,如圖11 所示.因此針對(duì)這種情況,可以為訓(xùn)練集中的樣本選取數(shù)量適當(dāng)?shù)谋容^學(xué)習(xí)樣本來(lái)降低模型的性能開銷,而模型的準(zhǔn)確率卻不會(huì)發(fā)生大的變化.而且,實(shí)驗(yàn)也從模型的PR 曲線和ROC 曲線衡量了當(dāng)比較學(xué)習(xí)樣本的數(shù)量發(fā)生變化時(shí)模型的PR 值和ROC 值的變化情況.經(jīng)過(guò)大量實(shí)驗(yàn)表明,模型的PR 值和ROC 值總體保持穩(wěn)定,如圖12 和圖13 所示.圖12 顯示模型測(cè)試過(guò)程中每種漏洞類型的PR 曲線.從圖12 中可以看出,多數(shù)漏洞類型的PR值較高,在召回率與精確率之間取得了不錯(cuò)的平衡.最終所有漏洞類型的平均PR 值為0.85,如圖12 中橘黃色區(qū)域所示.圖13 顯示了模型測(cè)試過(guò)程中每種漏洞類型的ROC 曲線以及AUC(area under curve).從圖13 可以看出,多數(shù)類型的 ROC曲線趨向于圖的左上方,并且所有類型的 AUC平均值為0.96,如圖13 中橘黃色區(qū)域所示,說(shuō)明模型的總體效果與性能比較好.
Fig.12 PR curve of the model test圖12 模型測(cè)試的PR 曲線
Fig.13 ROC curve the model test圖13 模型測(cè)試的ROC 曲線
任務(wù)3.基于比較學(xué)習(xí)的模型學(xué)習(xí)能力的檢測(cè).
本文在實(shí)驗(yàn)的過(guò)程中,也對(duì)本文提出的基于比較學(xué)習(xí)的模型的學(xué)習(xí)能力進(jìn)行了檢測(cè).其具體的方式是比較模型對(duì)測(cè)試集中各種類型樣本的分類能力.圖14 是原始測(cè)試集特征的t-SNE(t-distributed stochastic neighbor embedding)圖,圖15 是使用訓(xùn)練完的深度學(xué)習(xí)模型提取的測(cè)試集特征的t-SNE 圖.
Fig.15 t-SNE diagram of test set features extracted by deep learning model圖15 深度學(xué)習(xí)模型提取的測(cè)試集特征的t-SNE 圖
從圖15 中不難看出,本文基于比較學(xué)習(xí)訓(xùn)練的深度學(xué)習(xí)模型具有較強(qiáng)的分類能力,如圖14 和圖15中的紫色區(qū)域所示.在圖14 中,紫色區(qū)域代表的漏洞類型比較分散.而在圖15 中,紫色區(qū)域代表的漏洞類型比較好地聚集在一起,說(shuō)明模型學(xué)習(xí)到了測(cè)試集中各漏洞類型的特征,并且測(cè)試集中各漏洞類型的特征經(jīng)過(guò)本文訓(xùn)練的深度學(xué)習(xí)模型的處理,具有了較強(qiáng)的可區(qū)分性,這就使得模型識(shí)別漏洞的能力大幅度地提高.
眾多基于深度學(xué)習(xí)的漏洞識(shí)別模型為了提高模型的泛化能力,都會(huì)對(duì)數(shù)據(jù)集中的樣本進(jìn)行符號(hào)化,去除個(gè)性化的程序特征,輔之統(tǒng)一的符號(hào)來(lái)代替這些特征,降低模型提取程序特征的難度,提高模型的泛化能力.但在實(shí)驗(yàn)過(guò)程中發(fā)現(xiàn),在基于比較學(xué)習(xí)的深度學(xué)習(xí)漏洞檢測(cè)任務(wù)中,數(shù)據(jù)集中的樣本程序是否符號(hào)化對(duì)模型的準(zhǔn)確率并沒(méi)有太大的影響.實(shí)驗(yàn)分別以本文整理的數(shù)據(jù)集和文獻(xiàn)[28]中的數(shù)據(jù)集為對(duì)象進(jìn)行了驗(yàn)證.實(shí)驗(yàn)的過(guò)程為:首先對(duì)經(jīng)過(guò)符號(hào)化處理的數(shù)據(jù)集進(jìn)行學(xué)習(xí)訓(xùn)練,測(cè)量其準(zhǔn)確率;然后再對(duì)未經(jīng)過(guò)符號(hào)化處理的數(shù)據(jù)集進(jìn)行學(xué)習(xí)訓(xùn)練,測(cè)量其準(zhǔn)確率;最后對(duì)比這2 種模式下符號(hào)化與否對(duì)模型準(zhǔn)確率的影響程度.實(shí)驗(yàn)結(jié)果如圖16、圖17 和圖18、圖19 所示.圖16 中是本文中的數(shù)據(jù)集經(jīng)過(guò)符號(hào)化處理后,訓(xùn)練學(xué)習(xí)時(shí)的準(zhǔn)確率.其中,訓(xùn)練集的準(zhǔn)確率為95.1%,測(cè)試集的準(zhǔn)確率為91.6%,驗(yàn)證集的準(zhǔn)確率為91.5%.圖17 顯示的是沒(méi)有經(jīng)過(guò)符號(hào)化處理的本文數(shù)據(jù)集訓(xùn)練時(shí)的準(zhǔn)確率,其中,訓(xùn)練集的準(zhǔn)確率為93.7%,測(cè)試集的準(zhǔn)確率為92.0%,驗(yàn)證集的準(zhǔn)確率為91.8%.
Fig.16 Accuracy of our data set after symbolization圖16 符號(hào)化后的本文數(shù)據(jù)集的準(zhǔn)確率
Fig.17 Accuracy of our data set after non-symbolization圖17 無(wú)符號(hào)化后的本文數(shù)據(jù)集的準(zhǔn)確率
Fig.18 Accuracy of MVD data set after symbolization圖18 符號(hào)化后的MVD 數(shù)據(jù)集的準(zhǔn)確率
Fig.19 Accuracy of MVD data set after non-symbolization圖19 無(wú)符號(hào)化后的MVD 數(shù)據(jù)集的準(zhǔn)確率
從圖16 和圖17 中可以看出,對(duì)數(shù)據(jù)集進(jìn)行符號(hào)化處理和不進(jìn)行符號(hào)化處理,模型的準(zhǔn)確率變化幅度不是很大,其中訓(xùn)練集的變化幅度稍大點(diǎn),差值達(dá)到了1.4,而測(cè)試集和驗(yàn)證集的變化幅度很小,幾乎可以忽略不計(jì).類似地,文獻(xiàn)[28]中的MVD 數(shù)據(jù)集在基于比較學(xué)習(xí)的模式下也有相同的情況.通過(guò)以上的2 個(gè)實(shí)驗(yàn)不難看出,數(shù)據(jù)集中的樣本是否符號(hào)化并不會(huì)影響基于比較學(xué)習(xí)的深度學(xué)習(xí)模型的訓(xùn)練方式,不會(huì)對(duì)訓(xùn)練的準(zhǔn)確率產(chǎn)生較大的影響.其原因在于:基于比較學(xué)習(xí)的深度學(xué)習(xí)方式,通過(guò)大量同類型樣本和不同類型樣本的比較學(xué)習(xí),模型確實(shí)學(xué)到了同類型程序和不同類型程序內(nèi)在的特征,數(shù)據(jù)集中樣本是否符號(hào)化并不會(huì)影響比較學(xué)習(xí)模式下模型的實(shí)際表現(xiàn).
本文提出了一種基于比較學(xué)習(xí)的漏洞檢測(cè)方法.在比較學(xué)習(xí)法中,針對(duì)數(shù)據(jù)集中的每個(gè)樣本為其構(gòu)建同類型的樣本集合和不同類型樣本的集合.通過(guò)這種方式,使得深度學(xué)習(xí)模型在訓(xùn)練的過(guò)程中,可以提取同類型樣本的共有特征,以及不同類型樣本中可區(qū)分性較強(qiáng)的特征,使得深度學(xué)習(xí)模型識(shí)別漏洞的能力大幅度地提高.盡管本文提出的比較學(xué)習(xí)方法可以提高基于深度學(xué)習(xí)的漏洞識(shí)別模型的準(zhǔn)確率,并且在本文整理的數(shù)據(jù)集以及相關(guān)文獻(xiàn)中的數(shù)據(jù)集上有不錯(cuò)的表現(xiàn),漏洞識(shí)別準(zhǔn)確率比較高,但本文方法并沒(méi)有在實(shí)踐中進(jìn)行應(yīng)用,這是未來(lái)將要開展的工作,相信會(huì)在不久的將來(lái),本文所提出的方法會(huì)有不錯(cuò)的實(shí)際應(yīng)用效果.
作者貢獻(xiàn)聲明:陳小全、劉劍提出了算法思路和實(shí)驗(yàn)方案,以及論文撰寫;夏翔宇、周紹翔負(fù)責(zé)數(shù)據(jù)收集整理與深度學(xué)習(xí)模型訓(xùn)練.
附錄A.