黃誠,孫明旭,段仁語,吳蘇晟,陳斌
面向項目版本差異性的漏洞識別技術(shù)研究
黃誠1,2,孫明旭1,段仁語1,吳蘇晟1,陳斌1
(1. 四川大學(xué)網(wǎng)絡(luò)空間安全學(xué)院,四川 成都 610065;2. 廣西密碼學(xué)與信息安全重點實驗室,廣西 桂林 541000)
開源代碼托管平臺為軟件開發(fā)行業(yè)帶來了活力和機遇,但存在諸多安全隱患。開源代碼的不規(guī)范性、項目依賴庫的復(fù)雜性、漏洞披露平臺收集漏洞的被動性等問題都影響著開源項目及引入開源組件的閉源項目的安全,大部分漏洞修復(fù)行為無法及時被察覺和識別,進而將各類項目的安全風(fēng)險直接暴露給攻擊者。為了全面且及時地發(fā)現(xiàn)開源項目中的漏洞修復(fù)行為,設(shè)計并實現(xiàn)了基于項目版本差異性的漏洞識別系統(tǒng)—VpatchFinder。系統(tǒng)自動獲取開源項目中的更新代碼及內(nèi)容數(shù)據(jù),對更新前后代碼和文本描述信息進行提取分析。提出了基于安全行為與代碼特征的差異性特征,提取了包括項目注釋信息特征組、頁面統(tǒng)計特征組、代碼統(tǒng)計特征組以及漏洞類型特征組的共40個特征構(gòu)建特征集,采用隨機森林算法來訓(xùn)練可識別漏洞的分類器。通過真實漏洞數(shù)據(jù)進行測試,VpatchFinder的精確率為84.35%,準(zhǔn)確率為85.46%,召回率為85.09%,優(yōu)于其他常見的機器學(xué)習(xí)算法模型。進一步通過整理的歷年部分開源軟件CVE漏洞數(shù)據(jù)進行實驗,其結(jié)果表明68.07%的軟件漏洞能夠提前被VpatchFinder發(fā)現(xiàn)。該研究結(jié)果可以為軟件安全架構(gòu)設(shè)計、開發(fā)及成分分析等領(lǐng)域提供有效技術(shù)支撐。
漏洞識別;開源平臺;安全修復(fù);機器學(xué)習(xí)
《2021年開源軟件供應(yīng)鏈安全風(fēng)險研究報告》顯示,自2015年起開源組件中漏洞數(shù)逐年遞增,其中2020年報告的開源代碼漏洞數(shù)量環(huán)比2019年增長近40%。漏洞數(shù)量激增的同時,缺乏有效的漏洞識別措施和全面的漏洞信息收集渠道是目前較為嚴(yán)重的問題。對開發(fā)者而言,項目引入的開源組件是否存在漏洞對項目整體的安全性至關(guān)重要,當(dāng)開源組件發(fā)布一個漏洞修復(fù)后,引用者可能仍使用著包含漏洞的舊版本。雖然有如Dependabot[1]這樣對依賴庫版本進行更新的自動化工具,但并非適用于所有項目。一方面,所引組件的更新內(nèi)容未必符合項目需求;另一方面,只有完全信任組件開發(fā)者,并保證其發(fā)布的版本向下兼容,才能確保安全性。大型項目通常有多個依賴庫,繁重的工作量給維護人員帶來了巨大挑戰(zhàn)[2]。為了優(yōu)先考慮漏洞修復(fù),他們傾向參考公共漏洞和暴露(CVE,common vulnerabilities & exposures)、美國國家信息安全漏洞庫(NVD,national vulnerability data base)等漏洞披露平臺。然而實際上被公開的漏洞僅占真實漏洞數(shù)量的少數(shù)[3],即使能夠公開發(fā)布,也存在幾周甚至數(shù)月的延遲,在此周期內(nèi),項目仍可能遭受攻擊。因此,面向開源代碼托管平臺開發(fā)一個有效的漏洞識別系統(tǒng),一方面可以感知安全態(tài)勢,預(yù)警漏洞信息;另一方面,能夠幫助開發(fā)者和軟件維護者檢測引用的開源組件是否存在漏洞,保證項目的安全性。
針對漏洞識別的相關(guān)研究主要圍繞源碼審計[4-5]、漏洞模式匹配[6-7]、語法結(jié)構(gòu)分析[8-9]以及深度學(xué)習(xí)[10]等方面展開。然而,如果將上述研究應(yīng)用于開源社區(qū),會遺漏項目更新時一些重要的描述信息。少部分研究工作考慮了代碼更新過程,文獻(xiàn)[11-15]提出安全更新和普通更新在部分基本特性上的差異,但由于數(shù)據(jù)不足和特征有效性較差等缺點,沒有實現(xiàn)足夠高的檢測精度。
為解決上述問題,本文提出基于項目版本差異性的漏洞識別系統(tǒng)—VpatchFinder。針對C/C++項目,通過CVE和GitHub構(gòu)建數(shù)據(jù)集,結(jié)合多種過濾方法改善數(shù)據(jù)質(zhì)量,接著提出40個特征以區(qū)分漏洞和非漏洞數(shù)據(jù),嘗試和比較多種機器學(xué)習(xí)技術(shù),最終采用隨機森林作為分類算法。本文貢獻(xiàn)總結(jié)如下。
1)通過爬取CVE網(wǎng)站和GitHub社區(qū)構(gòu)建了一份真實的C/C+項目更新內(nèi)容數(shù)據(jù)集,提出多種過濾方法改善其數(shù)據(jù)質(zhì)量,并將數(shù)據(jù)集進行開源。
2)從安全行為和代碼特征等方面對漏洞的表現(xiàn)形式展開研究,提出了4個特征組(注釋信息特征組、頁面統(tǒng)計特征組、代碼統(tǒng)計特征組和漏洞類型特征組),共40個特征,并通過實驗證明了所選特征的有效性。
3)設(shè)計并實現(xiàn)了漏洞識別系統(tǒng)—Vpatch- Finder,該系統(tǒng)在測試集上具有84.35%的精確率和85.09%的召回率。實驗表明,在VpatchFinder的應(yīng)用下,68.07%的社區(qū)漏洞可以比CVE提前發(fā)現(xiàn),同時檢測出192條未公開披露的漏洞實例。
有關(guān)開源代碼托管平臺漏洞檢測的研究方法可分為3類:基于源碼檢測的方法、基于公開線索挖掘的方法和基于更新內(nèi)容差異性分析的方法。
源代碼中含有豐富的語義信息,目前針對源碼漏洞檢測的研究工作較為成熟,少部分研究技術(shù)可以應(yīng)用于開源平臺。
Neuhaus等[16]考慮代碼的相似性,基于導(dǎo)入和調(diào)用函數(shù)的行為識別漏洞。該方法易擴展到其他語言,但檢測的覆蓋面不足,只適合檢測特定類型的漏洞。鄭榮鋒等[17]提取惡意代碼行為指紋,通過指紋匹配度量不同惡意代碼的相似性。Kong等[18]結(jié)合多個靜態(tài)分析工具,提出基于數(shù)據(jù)融合的漏洞檢測方法。Sonnekalb[19]通過匹配不同的機器學(xué)習(xí)架構(gòu)和代碼表示方式得到最合適的漏洞檢測模型。李元誠等[20]從一些常見的漏洞關(guān)鍵點入手,從代碼中提取關(guān)鍵漏洞片段,并提出一種新型神經(jīng)網(wǎng)絡(luò)—DCnnGRU,通過保留代碼上下文調(diào)用關(guān)系解決梯度消失問題。上述研究均有不錯的檢測效果,但對代碼的完整性要求較高,無法檢測單一的代碼片段。樹和圖的技術(shù)常用于分析源代碼,文獻(xiàn)[21-22]通過抽象語法樹提取源代碼結(jié)構(gòu),文獻(xiàn)[9,23-25]采用圖的技術(shù)表征漏洞代碼片段。Yamaguchi等[8]將抽象語法樹和機器學(xué)習(xí)相結(jié)合,模型的1值達(dá)到了82.43%。然而基于樹和圖的技術(shù)存在相同的問題:計算量大,且需要完整的代碼結(jié)構(gòu),因此難以實現(xiàn)大規(guī)模應(yīng)用。
開源代碼托管平臺公開的報告區(qū)或評論區(qū)蘊含著漏洞關(guān)鍵信息,可以通過分析公開線索來識別漏洞。
Shin等[26]對開源項目Linux和Firefox展開研究,采用機器學(xué)習(xí)對代碼更新日志進行漏洞識別,不足之處在于擴展性較差,不能普遍適應(yīng)大部分開源項目。Tian等[11]考慮漏洞被訪問的頻率以及提交人員的經(jīng)驗特征等特性。Neil等[27]跟蹤多個開源庫,監(jiān)控用戶在公共報告區(qū)發(fā)布的問題和回復(fù),尋找與漏洞相關(guān)的術(shù)語。這兩項研究思路較新穎,但缺點是它們忽略了代碼中蘊含的大量信息。
漏洞修復(fù)和普通更新在代碼、文本描述、修改程度和變化數(shù)值的統(tǒng)計等方面存在明顯差異,但由于數(shù)據(jù)稀少和更新內(nèi)容格式不統(tǒng)一等問題,僅少數(shù)工作考慮到代碼更新過程。
曹琰等[28]結(jié)合程序依賴圖,通過漏洞源文件和補丁文件代碼結(jié)構(gòu)的差異掌握修補漏洞的方式。Sabetta等[3]直接將代碼視為文本,通過分析移除和增加的代碼來識別和漏洞相關(guān)的代碼更改,缺點在于分類精度并不高。Ponta等[29]針對Java收集了一份漏洞修復(fù)數(shù)據(jù)集,并將其開源以供學(xué)術(shù)界和工業(yè)界使用。Zaman等[13]研究Firefox 中安全更新和功能性更新的差異。Perl等[12]提出漏洞修復(fù)和普通更新的一些差異性特征。Li等[14]對不同類別的更新進行第一次大規(guī)模實證研究。Wang等[15]在以上研究的基礎(chǔ)上,提出一些句法特征。但上述工作均沒有實現(xiàn)足夠高的檢測精度,僅考慮了漏洞修復(fù)和普通更新在部分基本特性上的差異,而忽略了對更新內(nèi)容的描述以及特定編程語言對應(yīng)的漏洞類型等特征。此外,數(shù)據(jù)收集并不充分,也沒有進行有效的數(shù)據(jù)過濾,存在數(shù)據(jù)混雜的問題。
VpatchFinder系統(tǒng)主要包含數(shù)據(jù)收集、特征提取、模型訓(xùn)練以及分類檢測4個部分,其系統(tǒng)框架如圖1所示。
C/C++是近年來被曝出漏洞數(shù)量最多的編程語言,VpatchFinder支持檢測C/C++項目。GitHub中代碼提交的patch頁面主要包含以下內(nèi)容:提交者個人信息;對本次更新內(nèi)容的簡要描述;本次提交變化的文件數(shù)、移除的行數(shù)以及添加的行數(shù);移除和添加的具體代碼以及它們上下幾行的代碼。patch頁面示例如圖2所示。對漏洞修復(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為官方漏洞披露平臺,收錄著準(zhǔn)確可靠的漏洞數(shù)據(jù)。通過CVE條目的參考鏈接追溯至GitHub中的代碼提交,并根據(jù)固定的網(wǎng)址格式獲取patch頁面信息。
對于非漏洞數(shù)據(jù),即普通的代碼更新,從GitHub隨機收集多個C/C++項目的歷史提交patch信息,并根據(jù)hash值的唯一性篩除非漏洞數(shù)據(jù)集中的漏洞數(shù)據(jù)。
經(jīng)上述方法獲取的兩類數(shù)據(jù)存在明顯的質(zhì)量問題。一些C/C++項目的漏洞修復(fù)也包含少量對除了“.c”和“.cpp”之外文件的修改,不利于統(tǒng)一的特征提取。另外,非漏洞數(shù)據(jù)集中可能會摻雜部分未公開的漏洞,尤其是在一些大的復(fù)合型代碼更新中。本文提出基于正則表達(dá)式和大型更新人工查驗的方法過濾數(shù)據(jù)。
提取有效特征來區(qū)分漏洞修復(fù)和普通更新是關(guān)鍵。分析patch頁面,提出4個特征組(注釋信息特征組、頁面統(tǒng)計特征組、代碼統(tǒng)計特征組和漏洞類型特征組),共40個特征,其中11個為本文首次提出,如表1所示。
2.2.1 注釋信息特征組
每個patch頁面都有一段形如“Subject: ……”的字符串,這是代碼提交者對此次更新內(nèi)容的注釋。基于漏洞修復(fù)和普通更新在注釋信息上的差異,提出兩個特征。
(1)Subject安全關(guān)鍵詞統(tǒng)計
雖然Subject描述較為精簡,但研究發(fā)現(xiàn),一些關(guān)鍵詞語經(jīng)常出現(xiàn)在漏洞修復(fù)中而很少出現(xiàn)在普通更新中,稱這類詞語為安全關(guān)鍵詞。將從CVE和NVD抓取的描述性文檔作為語料庫,結(jié)合TF-IDF算法[30],得到安全關(guān)鍵詞的排序。從0至100進行遞歸,通過多次測試發(fā)現(xiàn)當(dāng)選取30個安全關(guān)鍵詞(overflow、buffer、leak等)作為統(tǒng)計標(biāo)準(zhǔn)時,實驗效果最優(yōu)。采用詞袋(BoW,bag-of-words)模型對Subject段落進行特征統(tǒng)計。
(2)Subject非安全關(guān)鍵詞統(tǒng)計
除了漏洞修復(fù),其他代碼更新主要分為以下幾類:增添或刪除功能;改進代碼質(zhì)量;加強性能或效率;修復(fù)與安全性無關(guān)的錯誤或消除警告。當(dāng)涉及以上類別的更新時,一些詞語更多地出現(xiàn)在Subject描述中,稱這類詞語為非安全關(guān)鍵詞。對于非安全關(guān)鍵詞,統(tǒng)計大量應(yīng)用軟件的功能更新以及其他非安全更新的描述文檔,結(jié)合TF-IDF以及遞歸測試,選取18個非安全關(guān)鍵詞(function、warning、add等)作為判斷標(biāo)準(zhǔn)。同樣采用BoW模型統(tǒng)計Subject段落。
表1 選取的所有特征
2.2.2 頁面統(tǒng)計特征組
關(guān)注patch頁面中代碼外部的一些統(tǒng)計性描述,基于漏洞修復(fù)和普通更新在統(tǒng)計數(shù)值上的差異構(gòu)建特征集。
(1)變化的文件數(shù)量
統(tǒng)計更新過程發(fā)生變化的文件數(shù)量。相比漏洞修復(fù),普通更新影響的文件范圍通常更廣,如添加某功能模塊時往往需要銜接多個文件,漏洞修復(fù)則大多在單個文件內(nèi)完成更新。
(2)變化的修改塊數(shù)量
統(tǒng)計更新過程變化的修改塊數(shù)量。定義修改塊為patch頁面內(nèi)由字符串“@@”起始的一次單位修改,它的數(shù)量反映了代碼結(jié)構(gòu)修改的復(fù)雜程度。非安全更新的邏輯通常較復(fù)雜,包含多個修改塊,而大部分漏洞修復(fù)僅有一個修改塊。
(3)變化的行的數(shù)量
非安全更新多為功能更新,需要引入大量代碼行來實現(xiàn)新功能,或修改較多代碼行以提高軟件效率。而對于漏洞,往往一個不恰當(dāng)?shù)倪吔缰祷蛞环N錯誤的數(shù)據(jù)類型就導(dǎo)致極為嚴(yán)重的后果,因此很多漏洞修復(fù)僅涉及一行或幾行的修改。為了提升特征集的魯棒性,統(tǒng)計更新過程移除與添加的組合特征,即移除行數(shù)、添加行數(shù)、添加行數(shù)減移除行數(shù)的絕對值、添加行數(shù)加移除行數(shù)、添加行數(shù)是否大于移除行數(shù)以及添加行數(shù)與移除行數(shù)的比例共6個特征。
(4)變化的字符數(shù)量
漏洞修復(fù)往往對代碼庫影響較小,僅有可能修改較少的代碼。對于變化的字符數(shù)量,同樣統(tǒng)計移除和添加的組合特征。
(5)添加代碼與移除代碼的相似程度
更新前后代碼的相似性表示修改幅度大小。首先標(biāo)準(zhǔn)化移除和添加的代碼,以防止空格、注釋和用戶自定義變量等因素的影響。在此基礎(chǔ)上,采用Edit Distance算法[31]進行相似性統(tǒng)計,它計算由一個字符串轉(zhuǎn)換成另一個字符串所需要的最少編輯操作次數(shù)。一次更新可能包含多個修改塊,分別統(tǒng)計所有修改塊中最小、平均和最大的相似性數(shù)值。
(6)出現(xiàn)相同的代碼更改的最大次數(shù)
統(tǒng)計更新過程中出現(xiàn)相同代碼更改的最大次數(shù)。研究發(fā)現(xiàn),部分漏洞修復(fù)會對同一修改模式重復(fù)多次,如更正多個變量的數(shù)據(jù)類型,或多次調(diào)整條件語句臨界值等,而普通更新中則較少存在上述情況。
(7)Patch文件大小
文件大小代表修改信息的多少。相比漏洞修復(fù),其他更新的patch文件通常會更大。將patch頁面下載為txt文件,并獲取文件大小,為了防止數(shù)值過于離散,將其統(tǒng)一取整并轉(zhuǎn)化為“kB”級單位。
2.2.3 代碼統(tǒng)計特征組
關(guān)注C/C++代碼內(nèi)部的統(tǒng)計內(nèi)容,依據(jù)編程語言特性從代碼中尋找漏洞修復(fù)的相關(guān)信息。
(1)變化的條件語句的數(shù)量
C/C++的漏洞修復(fù)容易涉及條件控制語句,即通過添加新條件或修正現(xiàn)有條件來修復(fù)由條件不當(dāng)引發(fā)的漏洞。定位patch頁面中的移除行和增加行,分別統(tǒng)計它們包含條件語句的數(shù)量,并計算移除和添加的組合特征。
(2)變化的循環(huán)語句的數(shù)量
循環(huán)語句中的控制條件臨界值也極易導(dǎo)致漏洞。統(tǒng)計移除行和添加行中循環(huán)語句的數(shù)量,并計算移除和添加的組合特征。
(3)變化的算術(shù)、邏輯和關(guān)系運算符的總數(shù)量
C/C++運算符是說明特定操作的符號,用于連接多個操作數(shù)或構(gòu)成表達(dá)式,易被惡意代碼利用。相比普通更新,漏洞修復(fù)有更大的可能涉及運算符的修改。統(tǒng)計算術(shù)、邏輯和關(guān)系運算符的總數(shù)量,同樣計算移除和添加的組合特征。
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è)計時忽略了安全性,存在較大風(fēng)險。針對常出現(xiàn)的漏洞類型,列舉一些容易引發(fā)漏洞的函數(shù):mallo-c()、strcpy()、free()、gets()、strcat()、fgets()、sprintf()、memset()、memcpy()、str-dup()。經(jīng)迭代測試,選取上述10個關(guān)鍵函數(shù)的函數(shù)名作為語料庫,通過抽象語法樹解析更新前的代碼以提取函數(shù)名,采用BoW模型進行特征統(tǒng)計。
在VpatchFinder中采用隨機森林作分類器。隨機森林為一種集成學(xué)習(xí)算法,其輸出結(jié)果由多棵決策樹投票產(chǎn)生,在一定限度上可以避免模型的過擬合問題[33],以應(yīng)對真實環(huán)境中數(shù)據(jù)的復(fù)雜性。
本節(jié)評估所選特征的有效性及VpatchFinder的分類性能,比較VpatchFinder與CVE發(fā)現(xiàn)漏洞的及時性,并展示檢測出的部分未公開漏洞實例。
采用C/C++收集漏洞數(shù)據(jù)集和非漏洞數(shù)據(jù)集兩類數(shù)據(jù),它們提供真實環(huán)境下漏洞修復(fù)和普通更新的實例。
(1)漏洞數(shù)據(jù)集
CVE公開披露了大量漏洞,跟蹤1999年至2020年6月所有CVE條目,通過引用鏈接回溯至GitHub,篩除C/C++以外的項目,并根據(jù)統(tǒng)一的網(wǎng)址格式獲取patch頁面信息,正則過濾非“.c”和“.cpp”文件,構(gòu)建了2 688條漏洞數(shù)據(jù)。
(2)非漏洞數(shù)據(jù)集
非漏洞數(shù)據(jù)集的數(shù)量眾多,為防止數(shù)據(jù)集偏向某種特定類型,必須保證隨機性和全面性。在GitHub中選取62個C/C++項目(micropython、tcpdump等),通過git命令獲取項目歷史提交hash值,利用hash值的唯一性過濾漏洞數(shù)據(jù),并根據(jù)固定網(wǎng)址格式獲取patch頁面??紤]兩類數(shù)據(jù)的平衡性,從獲取的非漏洞數(shù)據(jù)中隨機選出3 100條。在上述數(shù)據(jù)中,手動檢查大型更新中是否包含小型的漏洞修復(fù),如果有,則丟棄該數(shù)據(jù),構(gòu)建了3 082條非漏洞數(shù)據(jù)。
圖3 特征重要性排名
Figure 3 Ranking of the feature importance
調(diào)用隨機森林中的feature_importance函數(shù)對40個特征展開重要性分析,前12位的排名和貢獻(xiàn)能力如圖3所示。從圖3可以看出,特征貢獻(xiàn)度分布較為均勻,充分保證了模型的穩(wěn)定性。此外,本文提出的特征,如“Subject安全關(guān)鍵詞統(tǒng)計”“patch文件大小”等的貢獻(xiàn)能力數(shù)值均排在前列,驗證了所選特征的有效性。
采用十折交叉驗證,通過繪制接收者操作特征曲線(ROC,receiver operating characteristic curve)評估系統(tǒng)的分類能力?;谙嗤瑪?shù)據(jù)集將隨機森林與其他流行的機器學(xué)習(xí)算法做比較。
VpatchFinder在隨機森林下的ROC曲線如圖4所示,曲線下面積(AUC,area under curve)值為0.93,這表明VpatchFinder能夠準(zhǔn)確檢測開源社區(qū)中的漏洞。
圖4 隨機森林下的ROC曲線
Figure 4 ROC of random forest
不同算法的準(zhǔn)確率、召回率、精確率以及1值的評估結(jié)果如圖5和表2所示。其中,1值是精確率和召回率的調(diào)和均值,可作為綜合評價指標(biāo)。結(jié)果表明,隨機森林的分類效果最優(yōu)。
圖5 不同機器學(xué)習(xí)算法的性能對比
Figure 5 Performance comparison of different machine learning algorithms
VpatchFinder的主要優(yōu)勢在于能夠及時發(fā)現(xiàn)漏洞,相比官方網(wǎng)站漏洞披露的被動性,VpatchFinder可以提供更全面、更及時的漏洞情報。為驗證系統(tǒng)發(fā)現(xiàn)漏洞的及時性,對VpatchFinder的檢測時間與CVE的漏洞發(fā)布時間展開比較。2020年6月至2021年3月初,CVE共公開發(fā)布了275條包含commit鏈接且屬于C/C++項目的漏洞,它們來自GitHub的Linux、Tensorflow、LibreDWG和FreeRDP等項目,將上述275條數(shù)據(jù)開源處理,同時將它們作為待檢測任務(wù)輸入VpatchFinder,在分類閾值設(shè)置為0.5的條件下,系統(tǒng)共報告了238條漏洞信息,檢測的召回率為86.55%。統(tǒng)計238條漏洞數(shù)據(jù)的時間信息,將CVE公開發(fā)布漏洞的日期作為CVE時間,將commit的提交時間作為VpatchFinder的檢測時間,繪制日期天數(shù)差的累計分布曲線,結(jié)果如圖6所示。軸上的正值表示VpatchFinder早于CVE發(fā)現(xiàn)漏洞的天數(shù),有將近60%的數(shù)據(jù)處于0至100天這一區(qū)間,說明VpatchFinder通??梢员菴VE提前1至100天發(fā)現(xiàn)漏洞。另外,分別統(tǒng)計238條數(shù)據(jù)中檢測時間早于CVE、等于CVE和晚于CVE的漏洞條數(shù)及所占比例,68.07%的漏洞可以提前被VpatchFinder發(fā)現(xiàn),結(jié)果如表3所示。上述實驗表明,VpatchFinder系統(tǒng)具備提前發(fā)現(xiàn)漏洞的能力,能夠更早地進行預(yù)測,增加安全人員的應(yīng)對時間,從而減少漏洞的威脅性。
表2 隨機森林和其他算法的評估數(shù)值結(jié)果
圖6 VpatchFinder與CVE時間差的累計分布曲線
Figure 6 Cumulative distribution curve of time difference between VpatchFinder and CVE
表3 VpatchFinder與CVE時間對比
本節(jié)驗證VpatchFinder發(fā)現(xiàn)秘密漏洞修補的能力,并展示挖掘出的一些未公開漏洞實例。首先,收集GitHub中7個大型C/C++項目(tcpdump、pytorch、radare2、electron、micropython、ImageMagickphp-src、Php-scr)的歷史提交,并根據(jù)hash值篩除CVE已發(fā)布的漏洞和訓(xùn)練集中已有的數(shù)據(jù)。將VpatchFinder與廣泛應(yīng)用于C/C++代碼缺陷檢測的靜態(tài)分析系統(tǒng)Cppcheck進行檢測結(jié)果的對比,將commit的url輸入VpatchFinder,將修改前的源代碼文件輸入Cppcheck,接著人工檢驗所有分類結(jié)果為漏洞的數(shù)據(jù),即結(jié)合專家分析和官方查詢等方式判斷其是否屬于真正的漏洞??紤]人工檢驗的巨大工作量,僅從收集的103 272條數(shù)據(jù)中隨機選取10 000條輸入兩種檢測系統(tǒng),檢測結(jié)果如表4所示。
表4 VpatchFinder與Cppcheck檢測結(jié)果對比
值得說明的是,Cppcheck報告的錯誤信息數(shù)量不包括警告及代碼風(fēng)格等問題。結(jié)果顯示VpatchFinder的誤報率遠(yuǎn)低于Cppcheck,且兩者檢測到了相同的154條漏洞信息。以上實驗表明VpatchFinder具有較高的實用價值。截至2021年4月,以上漏洞均仍未被CVE公開披露。詳細(xì)分析其中的7個實例,如表5所示。表中第一列為漏洞項目來源及commit的hash值,第二列為漏洞修復(fù)在GitHub中的提交日期。實驗表明,開源社區(qū)存在很多尚未公開披露的漏洞,類似VpatchFinder的漏洞識別系統(tǒng)對開源平臺用戶極為重要。
表5 已識別的秘密漏洞實例
VpatchFinder仍存在值得改進的地方,本節(jié)將討論這些問題。
第一,由于patch頁面格式的特殊性,目前系統(tǒng)僅面向GitHub平臺。GitHub是全球熱門的開源代碼托管平臺,但其他平臺曝出的漏洞數(shù)量也在持續(xù)增長,未來會考慮將VpatchFinder跨平臺拓展。
第二,由于其他編程語言訓(xùn)練數(shù)據(jù)不足,VpatchFinder只適合檢測C/C++項目。隨著數(shù)據(jù)集不斷增加,未來只需根據(jù)不同編程語言的特性調(diào)整代碼統(tǒng)計特征組和漏洞類型特征組,就可以適應(yīng)不同類別的語言,獲得更強大的檢測能力。
第三,數(shù)據(jù)集來源較為單一,從CVE收集的數(shù)據(jù)可能會導(dǎo)致系統(tǒng)偏向于檢測特定類型的漏洞。實際中,CVE并非收錄著所有漏洞,它傾向發(fā)布一些嚴(yán)重或高危的漏洞,這可能會導(dǎo)致漏報,但也是合乎情理的,因為高危漏洞理應(yīng)有一定的優(yōu)先性,未來需要平衡上述情況。
針對開源代碼托管平臺存在的安全問題,本文設(shè)計并實現(xiàn)了基于項目版本差異性的漏洞識別系統(tǒng)—VpatchFinder。首先收集C/C++項目更新時的patch頁面數(shù)據(jù),并通過多種過濾方法有效改善數(shù)據(jù)集質(zhì)量,接著提出4個特征組(注釋信息特征組、頁面統(tǒng)計特征組、代碼統(tǒng)計特征組和漏洞類型特征組),其中包含11個首次提出的特征。實驗表明,VpatchFinder具有準(zhǔn)確、及時和高效的檢測性能,能夠為開發(fā)人員和其他目標(biāo)用戶提供有效的漏洞檢測技術(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ū)溢出檢測算法[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] 王蕾, 李豐, 李煉, 等. 污點分析技術(shù)的原理和實踐應(yīng)用[J]. 軟件學(xué)報, 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] 鄭榮鋒, 方勇, 劉亮. 基于動態(tài)行為指紋的惡意代碼同源性分析[J]. 四川大學(xué)學(xué)報(自然科學(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] 李元誠, 崔亞奇, 呂俊峰, 等. 開源軟件漏洞檢測的混合深度學(xué)習(xí)方法[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é)報(自然科學(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ù)語義分析的軟件補丁比對技術(shù)[J]. 網(wǎng)絡(luò)與信息安全學(xué)報, 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] 呂維梅, 劉堅. C/C++程序安全漏洞的分類與分析[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
黃誠(1987? ),男,重慶人,四川大學(xué)副教授,主要研究方向為網(wǎng)絡(luò)空間安全、攻擊檢測、威脅溯源、數(shù)據(jù)挖掘、社交網(wǎng)絡(luò)、機器學(xué)習(xí)和自然語言處理。
孫明旭(2000? ),男,黑龍江綏化人,主要研究方向為數(shù)據(jù)挖掘、自然語言處理和漏洞情報分析。
段仁語(1998? ),男,重慶人,主要研究方向為漏洞情報挖掘、計算機視覺和人工智能。
吳蘇晟(1999? ),男,浙江杭州人,主要研究方向為漏洞挖掘和開源代碼漏洞庫的分析與構(gòu)建。
陳斌(1999? ),男,江西南昌人,主要研究方向為漏洞挖掘與自然語言處理。
2021?05?24;
2021?10?12
孫明旭,2018141424064@stu.scu.edu.cn
國家自然科學(xué)基金(61902265);四川省科技廳重點研發(fā)項目(2020YFG0047);廣西密碼學(xué)與信息安全重點實驗室研究課題(GCIS201921)
黃誠, 孫明旭, 段仁語, 等. 面向項目版本差異性的漏洞識別技術(shù)研究[J]. 網(wǎng)絡(luò)與信息安全學(xué)報, 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.