黃誠(chéng),孫明旭,段仁語,吳蘇晟,陳斌
面向項(xiàng)目版本差異性的漏洞識(shí)別技術(shù)研究
黃誠(chéng)1,2,孫明旭1,段仁語1,吳蘇晟1,陳斌1
(1. 四川大學(xué)網(wǎng)絡(luò)空間安全學(xué)院,四川 成都 610065;2. 廣西密碼學(xué)與信息安全重點(diǎn)實(shí)驗(yàn)室,廣西 桂林 541000)
開源代碼托管平臺(tái)為軟件開發(fā)行業(yè)帶來了活力和機(jī)遇,但存在諸多安全隱患。開源代碼的不規(guī)范性、項(xiàng)目依賴庫的復(fù)雜性、漏洞披露平臺(tái)收集漏洞的被動(dòng)性等問題都影響著開源項(xiàng)目及引入開源組件的閉源項(xiàng)目的安全,大部分漏洞修復(fù)行為無法及時(shí)被察覺和識(shí)別,進(jìn)而將各類項(xiàng)目的安全風(fēng)險(xiǎn)直接暴露給攻擊者。為了全面且及時(shí)地發(fā)現(xiàn)開源項(xiàng)目中的漏洞修復(fù)行為,設(shè)計(jì)并實(shí)現(xiàn)了基于項(xiàng)目版本差異性的漏洞識(shí)別系統(tǒng)—VpatchFinder。系統(tǒng)自動(dòng)獲取開源項(xiàng)目中的更新代碼及內(nèi)容數(shù)據(jù),對(duì)更新前后代碼和文本描述信息進(jìn)行提取分析。提出了基于安全行為與代碼特征的差異性特征,提取了包括項(xiàng)目注釋信息特征組、頁面統(tǒng)計(jì)特征組、代碼統(tǒng)計(jì)特征組以及漏洞類型特征組的共40個(gè)特征構(gòu)建特征集,采用隨機(jī)森林算法來訓(xùn)練可識(shí)別漏洞的分類器。通過真實(shí)漏洞數(shù)據(jù)進(jìn)行測(cè)試,VpatchFinder的精確率為84.35%,準(zhǔn)確率為85.46%,召回率為85.09%,優(yōu)于其他常見的機(jī)器學(xué)習(xí)算法模型。進(jìn)一步通過整理的歷年部分開源軟件CVE漏洞數(shù)據(jù)進(jìn)行實(shí)驗(yàn),其結(jié)果表明68.07%的軟件漏洞能夠提前被VpatchFinder發(fā)現(xiàn)。該研究結(jié)果可以為軟件安全架構(gòu)設(shè)計(jì)、開發(fā)及成分分析等領(lǐng)域提供有效技術(shù)支撐。
漏洞識(shí)別;開源平臺(tái);安全修復(fù);機(jī)器學(xué)習(xí)
《2021年開源軟件供應(yīng)鏈安全風(fēng)險(xiǎn)研究報(bào)告》顯示,自2015年起開源組件中漏洞數(shù)逐年遞增,其中2020年報(bào)告的開源代碼漏洞數(shù)量環(huán)比2019年增長(zhǎng)近40%。漏洞數(shù)量激增的同時(shí),缺乏有效的漏洞識(shí)別措施和全面的漏洞信息收集渠道是目前較為嚴(yán)重的問題。對(duì)開發(fā)者而言,項(xiàng)目引入的開源組件是否存在漏洞對(duì)項(xiàng)目整體的安全性至關(guān)重要,當(dāng)開源組件發(fā)布一個(gè)漏洞修復(fù)后,引用者可能仍使用著包含漏洞的舊版本。雖然有如Dependabot[1]這樣對(duì)依賴庫版本進(jìn)行更新的自動(dòng)化工具,但并非適用于所有項(xiàng)目。一方面,所引組件的更新內(nèi)容未必符合項(xiàng)目需求;另一方面,只有完全信任組件開發(fā)者,并保證其發(fā)布的版本向下兼容,才能確保安全性。大型項(xiàng)目通常有多個(gè)依賴庫,繁重的工作量給維護(hù)人員帶來了巨大挑戰(zhàn)[2]。為了優(yōu)先考慮漏洞修復(fù),他們傾向參考公共漏洞和暴露(CVE,common vulnerabilities & exposures)、美國(guó)國(guó)家信息安全漏洞庫(NVD,national vulnerability data base)等漏洞披露平臺(tái)。然而實(shí)際上被公開的漏洞僅占真實(shí)漏洞數(shù)量的少數(shù)[3],即使能夠公開發(fā)布,也存在幾周甚至數(shù)月的延遲,在此周期內(nèi),項(xiàng)目仍可能遭受攻擊。因此,面向開源代碼托管平臺(tái)開發(fā)一個(gè)有效的漏洞識(shí)別系統(tǒng),一方面可以感知安全態(tài)勢(shì),預(yù)警漏洞信息;另一方面,能夠幫助開發(fā)者和軟件維護(hù)者檢測(cè)引用的開源組件是否存在漏洞,保證項(xiàng)目的安全性。
針對(duì)漏洞識(shí)別的相關(guān)研究主要圍繞源碼審計(jì)[4-5]、漏洞模式匹配[6-7]、語法結(jié)構(gòu)分析[8-9]以及深度學(xué)習(xí)[10]等方面展開。然而,如果將上述研究應(yīng)用于開源社區(qū),會(huì)遺漏項(xiàng)目更新時(shí)一些重要的描述信息。少部分研究工作考慮了代碼更新過程,文獻(xiàn)[11-15]提出安全更新和普通更新在部分基本特性上的差異,但由于數(shù)據(jù)不足和特征有效性較差等缺點(diǎn),沒有實(shí)現(xiàn)足夠高的檢測(cè)精度。
為解決上述問題,本文提出基于項(xiàng)目版本差異性的漏洞識(shí)別系統(tǒng)—VpatchFinder。針對(duì)C/C++項(xiàng)目,通過CVE和GitHub構(gòu)建數(shù)據(jù)集,結(jié)合多種過濾方法改善數(shù)據(jù)質(zhì)量,接著提出40個(gè)特征以區(qū)分漏洞和非漏洞數(shù)據(jù),嘗試和比較多種機(jī)器學(xué)習(xí)技術(shù),最終采用隨機(jī)森林作為分類算法。本文貢獻(xiàn)總結(jié)如下。
1)通過爬取CVE網(wǎng)站和GitHub社區(qū)構(gòu)建了一份真實(shí)的C/C+項(xiàng)目更新內(nèi)容數(shù)據(jù)集,提出多種過濾方法改善其數(shù)據(jù)質(zhì)量,并將數(shù)據(jù)集進(jìn)行開源。
2)從安全行為和代碼特征等方面對(duì)漏洞的表現(xiàn)形式展開研究,提出了4個(gè)特征組(注釋信息特征組、頁面統(tǒng)計(jì)特征組、代碼統(tǒng)計(jì)特征組和漏洞類型特征組),共40個(gè)特征,并通過實(shí)驗(yàn)證明了所選特征的有效性。
3)設(shè)計(jì)并實(shí)現(xiàn)了漏洞識(shí)別系統(tǒng)—Vpatch- Finder,該系統(tǒng)在測(cè)試集上具有84.35%的精確率和85.09%的召回率。實(shí)驗(yàn)表明,在VpatchFinder的應(yīng)用下,68.07%的社區(qū)漏洞可以比CVE提前發(fā)現(xiàn),同時(shí)檢測(cè)出192條未公開披露的漏洞實(shí)例。
有關(guān)開源代碼托管平臺(tái)漏洞檢測(cè)的研究方法可分為3類:基于源碼檢測(cè)的方法、基于公開線索挖掘的方法和基于更新內(nèi)容差異性分析的方法。
源代碼中含有豐富的語義信息,目前針對(duì)源碼漏洞檢測(cè)的研究工作較為成熟,少部分研究技術(shù)可以應(yīng)用于開源平臺(tái)。
Neuhaus等[16]考慮代碼的相似性,基于導(dǎo)入和調(diào)用函數(shù)的行為識(shí)別漏洞。該方法易擴(kuò)展到其他語言,但檢測(cè)的覆蓋面不足,只適合檢測(cè)特定類型的漏洞。鄭榮鋒等[17]提取惡意代碼行為指紋,通過指紋匹配度量不同惡意代碼的相似性。Kong等[18]結(jié)合多個(gè)靜態(tài)分析工具,提出基于數(shù)據(jù)融合的漏洞檢測(cè)方法。Sonnekalb[19]通過匹配不同的機(jī)器學(xué)習(xí)架構(gòu)和代碼表示方式得到最合適的漏洞檢測(cè)模型。李元誠(chéng)等[20]從一些常見的漏洞關(guān)鍵點(diǎn)入手,從代碼中提取關(guān)鍵漏洞片段,并提出一種新型神經(jīng)網(wǎng)絡(luò)—DCnnGRU,通過保留代碼上下文調(diào)用關(guān)系解決梯度消失問題。上述研究均有不錯(cuò)的檢測(cè)效果,但對(duì)代碼的完整性要求較高,無法檢測(cè)單一的代碼片段。樹和圖的技術(shù)常用于分析源代碼,文獻(xiàn)[21-22]通過抽象語法樹提取源代碼結(jié)構(gòu),文獻(xiàn)[9,23-25]采用圖的技術(shù)表征漏洞代碼片段。Yamaguchi等[8]將抽象語法樹和機(jī)器學(xué)習(xí)相結(jié)合,模型的1值達(dá)到了82.43%。然而基于樹和圖的技術(shù)存在相同的問題:計(jì)算量大,且需要完整的代碼結(jié)構(gòu),因此難以實(shí)現(xiàn)大規(guī)模應(yīng)用。
開源代碼托管平臺(tái)公開的報(bào)告區(qū)或評(píng)論區(qū)蘊(yùn)含著漏洞關(guān)鍵信息,可以通過分析公開線索來識(shí)別漏洞。
Shin等[26]對(duì)開源項(xiàng)目Linux和Firefox展開研究,采用機(jī)器學(xué)習(xí)對(duì)代碼更新日志進(jìn)行漏洞識(shí)別,不足之處在于擴(kuò)展性較差,不能普遍適應(yīng)大部分開源項(xiàng)目。Tian等[11]考慮漏洞被訪問的頻率以及提交人員的經(jīng)驗(yàn)特征等特性。Neil等[27]跟蹤多個(gè)開源庫,監(jiān)控用戶在公共報(bào)告區(qū)發(fā)布的問題和回復(fù),尋找與漏洞相關(guān)的術(shù)語。這兩項(xiàng)研究思路較新穎,但缺點(diǎn)是它們忽略了代碼中蘊(yùn)含的大量信息。
漏洞修復(fù)和普通更新在代碼、文本描述、修改程度和變化數(shù)值的統(tǒng)計(jì)等方面存在明顯差異,但由于數(shù)據(jù)稀少和更新內(nèi)容格式不統(tǒng)一等問題,僅少數(shù)工作考慮到代碼更新過程。
曹琰等[28]結(jié)合程序依賴圖,通過漏洞源文件和補(bǔ)丁文件代碼結(jié)構(gòu)的差異掌握修補(bǔ)漏洞的方式。Sabetta等[3]直接將代碼視為文本,通過分析移除和增加的代碼來識(shí)別和漏洞相關(guān)的代碼更改,缺點(diǎn)在于分類精度并不高。Ponta等[29]針對(duì)Java收集了一份漏洞修復(fù)數(shù)據(jù)集,并將其開源以供學(xué)術(shù)界和工業(yè)界使用。Zaman等[13]研究Firefox 中安全更新和功能性更新的差異。Perl等[12]提出漏洞修復(fù)和普通更新的一些差異性特征。Li等[14]對(duì)不同類別的更新進(jìn)行第一次大規(guī)模實(shí)證研究。Wang等[15]在以上研究的基礎(chǔ)上,提出一些句法特征。但上述工作均沒有實(shí)現(xiàn)足夠高的檢測(cè)精度,僅考慮了漏洞修復(fù)和普通更新在部分基本特性上的差異,而忽略了對(duì)更新內(nèi)容的描述以及特定編程語言對(duì)應(yīng)的漏洞類型等特征。此外,數(shù)據(jù)收集并不充分,也沒有進(jìn)行有效的數(shù)據(jù)過濾,存在數(shù)據(jù)混雜的問題。
VpatchFinder系統(tǒng)主要包含數(shù)據(jù)收集、特征提取、模型訓(xùn)練以及分類檢測(cè)4個(gè)部分,其系統(tǒng)框架如圖1所示。
C/C++是近年來被曝出漏洞數(shù)量最多的編程語言,VpatchFinder支持檢測(cè)C/C++項(xiàng)目。GitHub中代碼提交的patch頁面主要包含以下內(nèi)容:提交者個(gè)人信息;對(duì)本次更新內(nèi)容的簡(jiǎn)要描述;本次提交變化的文件數(shù)、移除的行數(shù)以及添加的行數(shù);移除和添加的具體代碼以及它們上下幾行的代碼。patch頁面示例如圖2所示。對(duì)漏洞修復(fù)而言,patch頁面包含許多漏洞的關(guān)鍵信息。
圖1 VpatchFinder系統(tǒng)框架
Figure 1 Framework of VpatchFinder
圖2 patch頁面示例
Figure 2 Example of the patch page
研究安全更新的挑戰(zhàn)之一是缺乏足夠的數(shù)據(jù)。CVE為官方漏洞披露平臺(tái),收錄著準(zhǔn)確可靠的漏洞數(shù)據(jù)。通過CVE條目的參考鏈接追溯至GitHub中的代碼提交,并根據(jù)固定的網(wǎng)址格式獲取patch頁面信息。
對(duì)于非漏洞數(shù)據(jù),即普通的代碼更新,從GitHub隨機(jī)收集多個(gè)C/C++項(xiàng)目的歷史提交patch信息,并根據(jù)hash值的唯一性篩除非漏洞數(shù)據(jù)集中的漏洞數(shù)據(jù)。
經(jīng)上述方法獲取的兩類數(shù)據(jù)存在明顯的質(zhì)量問題。一些C/C++項(xiàng)目的漏洞修復(fù)也包含少量對(duì)除了“.c”和“.cpp”之外文件的修改,不利于統(tǒng)一的特征提取。另外,非漏洞數(shù)據(jù)集中可能會(huì)摻雜部分未公開的漏洞,尤其是在一些大的復(fù)合型代碼更新中。本文提出基于正則表達(dá)式和大型更新人工查驗(yàn)的方法過濾數(shù)據(jù)。
提取有效特征來區(qū)分漏洞修復(fù)和普通更新是關(guān)鍵。分析patch頁面,提出4個(gè)特征組(注釋信息特征組、頁面統(tǒng)計(jì)特征組、代碼統(tǒng)計(jì)特征組和漏洞類型特征組),共40個(gè)特征,其中11個(gè)為本文首次提出,如表1所示。
2.2.1 注釋信息特征組
每個(gè)patch頁面都有一段形如“Subject: ……”的字符串,這是代碼提交者對(duì)此次更新內(nèi)容的注釋。基于漏洞修復(fù)和普通更新在注釋信息上的差異,提出兩個(gè)特征。
(1)Subject安全關(guān)鍵詞統(tǒng)計(jì)
雖然Subject描述較為精簡(jiǎn),但研究發(fā)現(xiàn),一些關(guān)鍵詞語經(jīng)常出現(xiàn)在漏洞修復(fù)中而很少出現(xiàn)在普通更新中,稱這類詞語為安全關(guān)鍵詞。將從CVE和NVD抓取的描述性文檔作為語料庫,結(jié)合TF-IDF算法[30],得到安全關(guān)鍵詞的排序。從0至100進(jìn)行遞歸,通過多次測(cè)試發(fā)現(xiàn)當(dāng)選取30個(gè)安全關(guān)鍵詞(overflow、buffer、leak等)作為統(tǒng)計(jì)標(biāo)準(zhǔn)時(shí),實(shí)驗(yàn)效果最優(yōu)。采用詞袋(BoW,bag-of-words)模型對(duì)Subject段落進(jìn)行特征統(tǒng)計(jì)。
(2)Subject非安全關(guān)鍵詞統(tǒng)計(jì)
除了漏洞修復(fù),其他代碼更新主要分為以下幾類:增添或刪除功能;改進(jìn)代碼質(zhì)量;加強(qiáng)性能或效率;修復(fù)與安全性無關(guān)的錯(cuò)誤或消除警告。當(dāng)涉及以上類別的更新時(shí),一些詞語更多地出現(xiàn)在Subject描述中,稱這類詞語為非安全關(guān)鍵詞。對(duì)于非安全關(guān)鍵詞,統(tǒng)計(jì)大量應(yīng)用軟件的功能更新以及其他非安全更新的描述文檔,結(jié)合TF-IDF以及遞歸測(cè)試,選取18個(gè)非安全關(guān)鍵詞(function、warning、add等)作為判斷標(biāo)準(zhǔn)。同樣采用BoW模型統(tǒng)計(jì)Subject段落。
表1 選取的所有特征
2.2.2 頁面統(tǒng)計(jì)特征組
關(guān)注patch頁面中代碼外部的一些統(tǒng)計(jì)性描述,基于漏洞修復(fù)和普通更新在統(tǒng)計(jì)數(shù)值上的差異構(gòu)建特征集。
(1)變化的文件數(shù)量
統(tǒng)計(jì)更新過程發(fā)生變化的文件數(shù)量。相比漏洞修復(fù),普通更新影響的文件范圍通常更廣,如添加某功能模塊時(shí)往往需要銜接多個(gè)文件,漏洞修復(fù)則大多在單個(gè)文件內(nèi)完成更新。
(2)變化的修改塊數(shù)量
統(tǒng)計(jì)更新過程變化的修改塊數(shù)量。定義修改塊為patch頁面內(nèi)由字符串“@@”起始的一次單位修改,它的數(shù)量反映了代碼結(jié)構(gòu)修改的復(fù)雜程度。非安全更新的邏輯通常較復(fù)雜,包含多個(gè)修改塊,而大部分漏洞修復(fù)僅有一個(gè)修改塊。
(3)變化的行的數(shù)量
非安全更新多為功能更新,需要引入大量代碼行來實(shí)現(xiàn)新功能,或修改較多代碼行以提高軟件效率。而對(duì)于漏洞,往往一個(gè)不恰當(dāng)?shù)倪吔缰祷蛞环N錯(cuò)誤的數(shù)據(jù)類型就導(dǎo)致極為嚴(yán)重的后果,因此很多漏洞修復(fù)僅涉及一行或幾行的修改。為了提升特征集的魯棒性,統(tǒng)計(jì)更新過程移除與添加的組合特征,即移除行數(shù)、添加行數(shù)、添加行數(shù)減移除行數(shù)的絕對(duì)值、添加行數(shù)加移除行數(shù)、添加行數(shù)是否大于移除行數(shù)以及添加行數(shù)與移除行數(shù)的比例共6個(gè)特征。
(4)變化的字符數(shù)量
漏洞修復(fù)往往對(duì)代碼庫影響較小,僅有可能修改較少的代碼。對(duì)于變化的字符數(shù)量,同樣統(tǒng)計(jì)移除和添加的組合特征。
(5)添加代碼與移除代碼的相似程度
更新前后代碼的相似性表示修改幅度大小。首先標(biāo)準(zhǔn)化移除和添加的代碼,以防止空格、注釋和用戶自定義變量等因素的影響。在此基礎(chǔ)上,采用Edit Distance算法[31]進(jìn)行相似性統(tǒng)計(jì),它計(jì)算由一個(gè)字符串轉(zhuǎn)換成另一個(gè)字符串所需要的最少編輯操作次數(shù)。一次更新可能包含多個(gè)修改塊,分別統(tǒng)計(jì)所有修改塊中最小、平均和最大的相似性數(shù)值。
(6)出現(xiàn)相同的代碼更改的最大次數(shù)
統(tǒng)計(jì)更新過程中出現(xiàn)相同代碼更改的最大次數(shù)。研究發(fā)現(xiàn),部分漏洞修復(fù)會(huì)對(duì)同一修改模式重復(fù)多次,如更正多個(gè)變量的數(shù)據(jù)類型,或多次調(diào)整條件語句臨界值等,而普通更新中則較少存在上述情況。
(7)Patch文件大小
文件大小代表修改信息的多少。相比漏洞修復(fù),其他更新的patch文件通常會(huì)更大。將patch頁面下載為txt文件,并獲取文件大小,為了防止數(shù)值過于離散,將其統(tǒng)一取整并轉(zhuǎn)化為“kB”級(jí)單位。
2.2.3 代碼統(tǒng)計(jì)特征組
關(guān)注C/C++代碼內(nèi)部的統(tǒng)計(jì)內(nèi)容,依據(jù)編程語言特性從代碼中尋找漏洞修復(fù)的相關(guān)信息。
(1)變化的條件語句的數(shù)量
C/C++的漏洞修復(fù)容易涉及條件控制語句,即通過添加新條件或修正現(xiàn)有條件來修復(fù)由條件不當(dāng)引發(fā)的漏洞。定位patch頁面中的移除行和增加行,分別統(tǒng)計(jì)它們包含條件語句的數(shù)量,并計(jì)算移除和添加的組合特征。
(2)變化的循環(huán)語句的數(shù)量
循環(huán)語句中的控制條件臨界值也極易導(dǎo)致漏洞。統(tǒng)計(jì)移除行和添加行中循環(huán)語句的數(shù)量,并計(jì)算移除和添加的組合特征。
(3)變化的算術(shù)、邏輯和關(guān)系運(yùn)算符的總數(shù)量
C/C++運(yùn)算符是說明特定操作的符號(hào),用于連接多個(gè)操作數(shù)或構(gòu)成表達(dá)式,易被惡意代碼利用。相比普通更新,漏洞修復(fù)有更大的可能涉及運(yùn)算符的修改。統(tǒng)計(jì)算術(shù)、邏輯和關(guān)系運(yùn)算符的總數(shù)量,同樣計(jì)算移除和添加的組合特征。
2.2.4 漏洞類型特征組
C/C++頻繁出現(xiàn)的漏洞類型通常比較固定,如常見的溢出問題、指針越界、內(nèi)存泄露等[32],固定的某類漏洞在C/C++代碼中也有特殊的表現(xiàn)。關(guān)注更新前代碼中能夠體現(xiàn)漏洞的關(guān)鍵函數(shù),提出漏洞類型特征組。
C/C++中的一些函數(shù)在設(shè)計(jì)時(shí)忽略了安全性,存在較大風(fēng)險(xiǎn)。針對(duì)常出現(xiàn)的漏洞類型,列舉一些容易引發(fā)漏洞的函數(shù):mallo-c()、strcpy()、free()、gets()、strcat()、fgets()、sprintf()、memset()、memcpy()、str-dup()。經(jīng)迭代測(cè)試,選取上述10個(gè)關(guān)鍵函數(shù)的函數(shù)名作為語料庫,通過抽象語法樹解析更新前的代碼以提取函數(shù)名,采用BoW模型進(jìn)行特征統(tǒng)計(jì)。
在VpatchFinder中采用隨機(jī)森林作分類器。隨機(jī)森林為一種集成學(xué)習(xí)算法,其輸出結(jié)果由多棵決策樹投票產(chǎn)生,在一定限度上可以避免模型的過擬合問題[33],以應(yīng)對(duì)真實(shí)環(huán)境中數(shù)據(jù)的復(fù)雜性。
本節(jié)評(píng)估所選特征的有效性及VpatchFinder的分類性能,比較VpatchFinder與CVE發(fā)現(xiàn)漏洞的及時(shí)性,并展示檢測(cè)出的部分未公開漏洞實(shí)例。
采用C/C++收集漏洞數(shù)據(jù)集和非漏洞數(shù)據(jù)集兩類數(shù)據(jù),它們提供真實(shí)環(huán)境下漏洞修復(fù)和普通更新的實(shí)例。
(1)漏洞數(shù)據(jù)集
CVE公開披露了大量漏洞,跟蹤1999年至2020年6月所有CVE條目,通過引用鏈接回溯至GitHub,篩除C/C++以外的項(xiàng)目,并根據(jù)統(tǒng)一的網(wǎng)址格式獲取patch頁面信息,正則過濾非“.c”和“.cpp”文件,構(gòu)建了2 688條漏洞數(shù)據(jù)。
(2)非漏洞數(shù)據(jù)集
非漏洞數(shù)據(jù)集的數(shù)量眾多,為防止數(shù)據(jù)集偏向某種特定類型,必須保證隨機(jī)性和全面性。在GitHub中選取62個(gè)C/C++項(xiàng)目(micropython、tcpdump等),通過git命令獲取項(xiàng)目歷史提交hash值,利用hash值的唯一性過濾漏洞數(shù)據(jù),并根據(jù)固定網(wǎng)址格式獲取patch頁面??紤]兩類數(shù)據(jù)的平衡性,從獲取的非漏洞數(shù)據(jù)中隨機(jī)選出3 100條。在上述數(shù)據(jù)中,手動(dòng)檢查大型更新中是否包含小型的漏洞修復(fù),如果有,則丟棄該數(shù)據(jù),構(gòu)建了3 082條非漏洞數(shù)據(jù)。
圖3 特征重要性排名
Figure 3 Ranking of the feature importance
調(diào)用隨機(jī)森林中的feature_importance函數(shù)對(duì)40個(gè)特征展開重要性分析,前12位的排名和貢獻(xiàn)能力如圖3所示。從圖3可以看出,特征貢獻(xiàn)度分布較為均勻,充分保證了模型的穩(wěn)定性。此外,本文提出的特征,如“Subject安全關(guān)鍵詞統(tǒng)計(jì)”“patch文件大小”等的貢獻(xiàn)能力數(shù)值均排在前列,驗(yàn)證了所選特征的有效性。
采用十折交叉驗(yàn)證,通過繪制接收者操作特征曲線(ROC,receiver operating characteristic curve)評(píng)估系統(tǒng)的分類能力?;谙嗤瑪?shù)據(jù)集將隨機(jī)森林與其他流行的機(jī)器學(xué)習(xí)算法做比較。
VpatchFinder在隨機(jī)森林下的ROC曲線如圖4所示,曲線下面積(AUC,area under curve)值為0.93,這表明VpatchFinder能夠準(zhǔn)確檢測(cè)開源社區(qū)中的漏洞。
圖4 隨機(jī)森林下的ROC曲線
Figure 4 ROC of random forest
不同算法的準(zhǔn)確率、召回率、精確率以及1值的評(píng)估結(jié)果如圖5和表2所示。其中,1值是精確率和召回率的調(diào)和均值,可作為綜合評(píng)價(jià)指標(biāo)。結(jié)果表明,隨機(jī)森林的分類效果最優(yōu)。
圖5 不同機(jī)器學(xué)習(xí)算法的性能對(duì)比
Figure 5 Performance comparison of different machine learning algorithms
VpatchFinder的主要優(yōu)勢(shì)在于能夠及時(shí)發(fā)現(xiàn)漏洞,相比官方網(wǎng)站漏洞披露的被動(dòng)性,VpatchFinder可以提供更全面、更及時(shí)的漏洞情報(bào)。為驗(yàn)證系統(tǒng)發(fā)現(xiàn)漏洞的及時(shí)性,對(duì)VpatchFinder的檢測(cè)時(shí)間與CVE的漏洞發(fā)布時(shí)間展開比較。2020年6月至2021年3月初,CVE共公開發(fā)布了275條包含commit鏈接且屬于C/C++項(xiàng)目的漏洞,它們來自GitHub的Linux、Tensorflow、LibreDWG和FreeRDP等項(xiàng)目,將上述275條數(shù)據(jù)開源處理,同時(shí)將它們作為待檢測(cè)任務(wù)輸入VpatchFinder,在分類閾值設(shè)置為0.5的條件下,系統(tǒng)共報(bào)告了238條漏洞信息,檢測(cè)的召回率為86.55%。統(tǒng)計(jì)238條漏洞數(shù)據(jù)的時(shí)間信息,將CVE公開發(fā)布漏洞的日期作為CVE時(shí)間,將commit的提交時(shí)間作為VpatchFinder的檢測(cè)時(shí)間,繪制日期天數(shù)差的累計(jì)分布曲線,結(jié)果如圖6所示。軸上的正值表示VpatchFinder早于CVE發(fā)現(xiàn)漏洞的天數(shù),有將近60%的數(shù)據(jù)處于0至100天這一區(qū)間,說明VpatchFinder通??梢员菴VE提前1至100天發(fā)現(xiàn)漏洞。另外,分別統(tǒng)計(jì)238條數(shù)據(jù)中檢測(cè)時(shí)間早于CVE、等于CVE和晚于CVE的漏洞條數(shù)及所占比例,68.07%的漏洞可以提前被VpatchFinder發(fā)現(xiàn),結(jié)果如表3所示。上述實(shí)驗(yàn)表明,VpatchFinder系統(tǒng)具備提前發(fā)現(xiàn)漏洞的能力,能夠更早地進(jìn)行預(yù)測(cè),增加安全人員的應(yīng)對(duì)時(shí)間,從而減少漏洞的威脅性。
表2 隨機(jī)森林和其他算法的評(píng)估數(shù)值結(jié)果
圖6 VpatchFinder與CVE時(shí)間差的累計(jì)分布曲線
Figure 6 Cumulative distribution curve of time difference between VpatchFinder and CVE
表3 VpatchFinder與CVE時(shí)間對(duì)比
本節(jié)驗(yàn)證VpatchFinder發(fā)現(xiàn)秘密漏洞修補(bǔ)的能力,并展示挖掘出的一些未公開漏洞實(shí)例。首先,收集GitHub中7個(gè)大型C/C++項(xiàng)目(tcpdump、pytorch、radare2、electron、micropython、ImageMagickphp-src、Php-scr)的歷史提交,并根據(jù)hash值篩除CVE已發(fā)布的漏洞和訓(xùn)練集中已有的數(shù)據(jù)。將VpatchFinder與廣泛應(yīng)用于C/C++代碼缺陷檢測(cè)的靜態(tài)分析系統(tǒng)Cppcheck進(jìn)行檢測(cè)結(jié)果的對(duì)比,將commit的url輸入VpatchFinder,將修改前的源代碼文件輸入Cppcheck,接著人工檢驗(yàn)所有分類結(jié)果為漏洞的數(shù)據(jù),即結(jié)合專家分析和官方查詢等方式判斷其是否屬于真正的漏洞??紤]人工檢驗(yàn)的巨大工作量,僅從收集的103 272條數(shù)據(jù)中隨機(jī)選取10 000條輸入兩種檢測(cè)系統(tǒng),檢測(cè)結(jié)果如表4所示。
表4 VpatchFinder與Cppcheck檢測(cè)結(jié)果對(duì)比
值得說明的是,Cppcheck報(bào)告的錯(cuò)誤信息數(shù)量不包括警告及代碼風(fēng)格等問題。結(jié)果顯示VpatchFinder的誤報(bào)率遠(yuǎn)低于Cppcheck,且兩者檢測(cè)到了相同的154條漏洞信息。以上實(shí)驗(yàn)表明VpatchFinder具有較高的實(shí)用價(jià)值。截至2021年4月,以上漏洞均仍未被CVE公開披露。詳細(xì)分析其中的7個(gè)實(shí)例,如表5所示。表中第一列為漏洞項(xiàng)目來源及commit的hash值,第二列為漏洞修復(fù)在GitHub中的提交日期。實(shí)驗(yàn)表明,開源社區(qū)存在很多尚未公開披露的漏洞,類似VpatchFinder的漏洞識(shí)別系統(tǒng)對(duì)開源平臺(tái)用戶極為重要。
表5 已識(shí)別的秘密漏洞實(shí)例
VpatchFinder仍存在值得改進(jìn)的地方,本節(jié)將討論這些問題。
第一,由于patch頁面格式的特殊性,目前系統(tǒng)僅面向GitHub平臺(tái)。GitHub是全球熱門的開源代碼托管平臺(tái),但其他平臺(tái)曝出的漏洞數(shù)量也在持續(xù)增長(zhǎng),未來會(huì)考慮將VpatchFinder跨平臺(tái)拓展。
第二,由于其他編程語言訓(xùn)練數(shù)據(jù)不足,VpatchFinder只適合檢測(cè)C/C++項(xiàng)目。隨著數(shù)據(jù)集不斷增加,未來只需根據(jù)不同編程語言的特性調(diào)整代碼統(tǒng)計(jì)特征組和漏洞類型特征組,就可以適應(yīng)不同類別的語言,獲得更強(qiáng)大的檢測(cè)能力。
第三,數(shù)據(jù)集來源較為單一,從CVE收集的數(shù)據(jù)可能會(huì)導(dǎo)致系統(tǒng)偏向于檢測(cè)特定類型的漏洞。實(shí)際中,CVE并非收錄著所有漏洞,它傾向發(fā)布一些嚴(yán)重或高危的漏洞,這可能會(huì)導(dǎo)致漏報(bào),但也是合乎情理的,因?yàn)楦呶B┒蠢響?yīng)有一定的優(yōu)先性,未來需要平衡上述情況。
針對(duì)開源代碼托管平臺(tái)存在的安全問題,本文設(shè)計(jì)并實(shí)現(xiàn)了基于項(xiàng)目版本差異性的漏洞識(shí)別系統(tǒng)—VpatchFinder。首先收集C/C++項(xiàng)目更新時(shí)的patch頁面數(shù)據(jù),并通過多種過濾方法有效改善數(shù)據(jù)集質(zhì)量,接著提出4個(gè)特征組(注釋信息特征組、頁面統(tǒng)計(jì)特征組、代碼統(tǒng)計(jì)特征組和漏洞類型特征組),其中包含11個(gè)首次提出的特征。實(shí)驗(yàn)表明,VpatchFinder具有準(zhǔn)確、及時(shí)和高效的檢測(cè)性能,能夠?yàn)殚_發(fā)人員和其他目標(biāo)用戶提供有效的漏洞檢測(cè)技術(shù)支持。
[1] ALFADEL M, COSTA D E, SHIHAB E, et al. On the use of dependabot security pull requests[C]//Proceedings of 2021 IEEE/ACM 18th International Conference on Mining Software Repositories (MSR). 2021: 254-265.
[2] PASHCHENKO I, PLATE H, PONTA S E, et al. Vulnerable open source dependencies: counting those that matter[C]//Proceedings of the 12th ACM/IEEE International Symposium on Empirical Software Engineering and Measurement. 2018: 1-10.
[3] SABETTA A, BEZZI M. A practical approach to the automatic classification of security-relevant commits[C]//Proceedings of 2018 IEEE International Conference on Software Maintenance and Evolution. 2018: 579-582.
[4] KAMIYA T, KUSUMOTO S, INOUE K. CCFinder: a multilinguistic token-based code clone detection system for large scale source code[J]. IEEE Transactions on Software Engineering, 2002, 28(7): 654-670.
[5] LI Z, LU S, MYAGMAR S, et al. CP-Miner: finding copy-paste and related bugs in large-scale software code[J]. IEEE Transactions on Software Engineering, 2006, 32(3): 176-192.
[6] 王雅文, 姚欣洪, 宮云戰(zhàn), 等. 一種基于代碼靜態(tài)分析的緩沖區(qū)溢出檢測(cè)算法[J]. 計(jì)算機(jī)研究與發(fā)展, 2012, 49(4): 839-845.
WANG Y W, YAO X H, GONG Y Z, et al. A method of buffer overflow detection based on static code analysis[J]. Journal of Computer Research and Development, 2012, 49(4): 839-845.
[7] 王蕾, 李豐, 李煉, 等. 污點(diǎn)分析技術(shù)的原理和實(shí)踐應(yīng)用[J]. 軟件學(xué)報(bào), 2017, 28(4): 860-882.
WANG L, LI F, LI L, et al. Principle and practice of taint analysis[J]. Journal of Software, 2017, 28(4): 860-882.
[8] YAMAGUCHI F, LOTTMANN M, RIECK K. Generalized vulnerability extrapolation using abstract syntax trees[C]//Proceedings of the 28th Annual Computer Security Applications Conference. 2012: 359-368.
[9] LI J Y, ERNST M D. CBCD: cloned buggy code detector[C]// Proceedings of 2012 34th International Conference on Software Engineering (ICSE). 2012: 310-320.
[10] LI Z, ZOU D Q, XU S H, et al. VulDeePecker: a deep learning-based system for vulnerability detection[C]//Proceedings 2018 Network and Distributed System Security Symposium. 2018.
[11] TIAN Y, LAWALL J, LO D. Identifying Linux bug fixing patches[C]//Proceedings of 2012 34th International Conference on Software Engineering (ICSE). 2012: 386-396.
[12] PERL H, DECHAND S, SMITH M, et al. VCCFinder: finding potential vulnerabilities in open-source projects to assist code audits[C]//Proceedings of the 22nd ACM SIGSAC Conference on Computer and Communications Security. 2015: 426-437.
[13] ZAMAN S, ADAMS B, HASSAN A E. Security versus performance bugs: a case study on Firefox[C]//Proceedings of the 8th Working Conference on Mining Software Repositories. 2011: 93-102.
[14] LI F, PAXSON V. A large-scale empirical study of security patches[C]//Proceedings of the 2017 ACM SIGSAC Conference on Computer and Communications Security. 2017: 2201-2215.
[15] WANG X D, SUN K, BATCHELLER A, et al. An empirical study of secret security patch in open source software[M]//Adaptive Autonomous Secure Cyber Systems. 2020: 269-289.
[16] NEUHAUS S, ZIMMERMANN T, HOLLER C, et al. Predicting vulnerable software components[C]//Proceedings of the 14th ACM Conference on Computer and Communications Security. 2007: 529-540.
[17] 鄭榮鋒, 方勇, 劉亮. 基于動(dòng)態(tài)行為指紋的惡意代碼同源性分析[J]. 四川大學(xué)學(xué)報(bào)(自然科學(xué)版), 2016, 53(4): 793-798.
ZHENG R F, FANG Y, LIU L. Homology analysis of malicious code based on dynamic-behavior fingerprint[J]. Journal of Sichuan University (Natural Science Edition), 2016, 53(4): 793-798.
[18] KONG D G, ZHENG Q, CHEN C, et al. ISA: a source code static vulnerability detection system based on data fusion[C]//Proceed- ings of the 2nd International ICST Conference on Scalable Information Systems. 2007: 55.
[19] SONNEKALB T. Machine-learning supported vulnerability detection in source code[C]//Proceedings of the 2019 27th ACM Joint Meeting on European Software Engineering Conference and Symposium on the Foundations of Software Engineering. 2019: 1180-1183.
[20] 李元誠(chéng), 崔亞奇, 呂俊峰, 等. 開源軟件漏洞檢測(cè)的混合深度學(xué)習(xí)方法[J]. 計(jì)算機(jī)工程與應(yīng)用, 2019, 55(11): 52-59.
LI Y C, CUI Y Q, LYU J F, et al. Combined deep learning method for open source software vulnerability detection[J]. Computer Engineering and Applications, 2019, 55(11): 52-59.
[21] JIANG L X, MISHERGHI G, SU Z D, et al. DECKARD: scalable and accurate tree-based detection of code clones[C]//Proceedings of 29th International Conference on Software Engineering (ICSE'07). 2007: 96-105.
[22] ALON U, ZILBERSTEIN M, LEVY O, et al. code2vec: learning distributed representations of code[J]. Proceedings of the ACM on Programming Languages, 2019, 3: 40.
[23] LIU C, CHEN C, HAN J W, et al. GPLAG: detection of software plagiarism by program dependence graph analysis[C]//Proceedings of the 12th ACM SIGKDD International Conference on Knowledge Discovery and Data Mining. 2006: 872-881.
[24] PHAM N H, NGUYEN T T, NGUYEN H A, et al. Detection of recurring software vulnerabilities[C]//ASE '10: Proceedings of the IEEE/ACM International Conference on Automated Software Engineering. 2010: 447-456.
[25] 劉凱, 方勇, 張磊, 等. 基于圖卷積網(wǎng)絡(luò)的惡意代碼聚類[J]. 四川大學(xué)學(xué)報(bào)(自然科學(xué)版), 2019, 56(4): 654-660. LIU K, FANG Y, ZHANG L, et al. Malware clustering based on graph convolutional networks[J]. Journal of Sichuan University (Natural Science Edition), 2019, 56(4): 654-660.
[26] SHIN Y, MENEELY A, WILLIAMS L, et al. Evaluating complexity, code churn, and developer activity metrics as indicators of software vulnerabilities[J]. IEEE Transactions on Software Engineering, 2011, 37(6): 772-787.
[27] NEIL L, MITTAL S, JOSHI A. Mining threat intelligence about open-source projects and libraries from code repository issues and bug reports[C]//Proceedings of 2018 IEEE International Conference on Intelligence and Security Informatics. 2018: 7-12.
[28] 曹琰, 劉龍, 王禹, 等. 基于函數(shù)語義分析的軟件補(bǔ)丁比對(duì)技術(shù)[J]. 網(wǎng)絡(luò)與信息安全學(xué)報(bào), 2019, 5(5): 56-63. CAO Y, LIU L, WANG Y, et al. Software patch comparison technology through semantic analysis on function[J]. Chinese Journal of Network and Information Security, 2019, 5(5): 56-63.
[29] PONTA S E, PLATE H, SABETTA A, et al. A manually-curated dataset of fixes to vulnerabilities of open-source software[C]//Pro- ceedings of 2019 IEEE/ACM 16th International Conference on Mining Software Repositories (MSR). 2019: 383-387.
[30] RAMOS J. Using TF-IDF to determine word relevance in document queries[J]. Proceedings of the First Instructional Conference on Machine Learning, 2003: 29-48.
[31] RISTAD E S, YIANILOS P N. Learning string-edit distance[J]. IEEE Transactions on Pattern Analysis and Machine Intelligence, 1998, 20(5): 522-532.
[32] 呂維梅, 劉堅(jiān). C/C++程序安全漏洞的分類與分析[J]. 計(jì)算機(jī)工程與應(yīng)用, 2005, 41(5): 123-125, 228.
LYU W M, LIU J. The classification and analysis on safety holes of C/C++ programs[J]. Computer Engineering and Applications, 2005, 41(5): 123-125, 228.
[33] BREIMAN L. Random forests[J]. Machine Learning, 2001, 45(1): 5-32.
Vulnerability identification technology research based on project version difference
HUANG Cheng1,2, SUN Mingxu1, DUAN Renyu1, WU Susheng1, CHEN Bin1
1. School of Cyber Science and Engineering, Sichuan University, Chengdu 610065, China 2. Guangxi Key Laboratory of Cryptography and Information Security, Guilin 541000, China
The open source code hosting platform has brought power and opportunities to software de-velopment, but there are also many security risks. The open source code has poor quality, the dependency libraries of projects are complex and vulnerability collection platformsare inadequate in collecting vulnerabilities. All these problems affect the security of open source projects and complex software with open source complements and most security patches can't be discovered and applied in time. Thus, the hackers could be easily found such vulnerable software. To discover the vulnerability in the open source community fully and timely, a vulnerability identification system based on project version difference was proposed. The update contents of projects in the open source community were collected automatically, thenfeatures were defined as security behaviors and code differences from the code and log in patches, 40 features including comment information feature group, page statistics feature group, code statistics feature group and vulnerability type feature group wereproposed to build feature set. And random forest model was built to learn classifiers for vulnerability identification. The resultsshow that VpatchFinder achieves a precision rate of 0.844, an accuracy rate of 0.855 and a recall rate of 0.851. Besides, 68.07% of community vulnerabilities can be early discovered by VpatchFinder in real open source CVE vulnerabilities. This research result can improve the current issue in software security architecture design and development.
vulnerability detection, open source platform, security patch, machine learning
s: TheNational Natural Science Foundation of China (61902265), Sichuan Science and Technology Program (2020YFG0047), Guangxi Key Laboratory of Cryptography and Information Security (GCIS201921)
TP393
A
10.11959/j.issn.2096?109x.2021094
黃誠(chéng)(1987? ),男,重慶人,四川大學(xué)副教授,主要研究方向?yàn)榫W(wǎng)絡(luò)空間安全、攻擊檢測(cè)、威脅溯源、數(shù)據(jù)挖掘、社交網(wǎng)絡(luò)、機(jī)器學(xué)習(xí)和自然語言處理。
孫明旭(2000? ),男,黑龍江綏化人,主要研究方向?yàn)閿?shù)據(jù)挖掘、自然語言處理和漏洞情報(bào)分析。
段仁語(1998? ),男,重慶人,主要研究方向?yàn)槁┒辞閳?bào)挖掘、計(jì)算機(jī)視覺和人工智能。
吳蘇晟(1999? ),男,浙江杭州人,主要研究方向?yàn)槁┒赐诰蚝烷_源代碼漏洞庫的分析與構(gòu)建。
陳斌(1999? ),男,江西南昌人,主要研究方向?yàn)槁┒赐诰蚺c自然語言處理。
2021?05?24;
2021?10?12
孫明旭,2018141424064@stu.scu.edu.cn
國(guó)家自然科學(xué)基金(61902265);四川省科技廳重點(diǎn)研發(fā)項(xiàng)目(2020YFG0047);廣西密碼學(xué)與信息安全重點(diǎn)實(shí)驗(yàn)室研究課題(GCIS201921)
黃誠(chéng), 孫明旭, 段仁語, 等. 面向項(xiàng)目版本差異性的漏洞識(shí)別技術(shù)研究[J]. 網(wǎng)絡(luò)與信息安全學(xué)報(bào), 2022, 8(1): 52-62.Citation Format: HUANG C, SUN M X, DUAN R Y, et al. Vulnerability identification technology research based on project version difference[J]. Chinese Journal of Network and Information Security, 2022, 8(1): 52-62.