鄒德清,李響,黃敏桓,宋翔,李浩,李偉明
基于圖結(jié)構(gòu)源代碼切片的智能化漏洞檢測(cè)系統(tǒng)
鄒德清1,李響2,黃敏桓2,宋翔3,李浩3,李偉明4
(1.華中科技大學(xué)網(wǎng)絡(luò)空間安全學(xué)院,湖北 武漢 430074;2.信息系統(tǒng)安全技術(shù)重點(diǎn)實(shí)驗(yàn)室,北京 100101;3.華中科技大學(xué)軟件學(xué)院,湖北 武漢 430074;4.華中科技大學(xué)網(wǎng)絡(luò)與計(jì)算中心,湖北 武漢 430074)
針對(duì)智能化漏洞檢測(cè),從源代碼程序依賴圖中根據(jù)漏洞特征提取圖結(jié)構(gòu)源代碼切片,將圖結(jié)構(gòu)切片信息表征后利用圖神經(jīng)網(wǎng)絡(luò)模型進(jìn)行漏洞檢測(cè)工作。實(shí)現(xiàn)了切片級(jí)的漏洞檢測(cè),并在代碼行級(jí)預(yù)測(cè)漏洞行位置。為了驗(yàn)證系統(tǒng)的有效性,分別與靜態(tài)漏洞檢測(cè)系統(tǒng)、基于序列化文本信息和基于圖結(jié)構(gòu)化信息的漏洞檢測(cè)系統(tǒng)做比較,實(shí)驗(yàn)結(jié)果表明,所提系統(tǒng)在漏洞檢測(cè)能力上有較高準(zhǔn)確性,并且在漏洞代碼行預(yù)測(cè)工作上有較好表現(xiàn)。
漏洞檢測(cè);圖結(jié)構(gòu);代碼切片;深度學(xué)習(xí)
隨著信息化進(jìn)程不斷加快,社會(huì)各個(gè)方面智能化程度越來越高,軟件在生活、生產(chǎn)、學(xué)習(xí)等方面的應(yīng)用越來越多,軟件安全保障的需求量也隨之增大,軟件安全問題日益突顯。其中,軟件源代碼漏洞檢測(cè)的高效性和準(zhǔn)確性急需提高以滿足社會(huì)需求。例如,公民個(gè)人信息與財(cái)產(chǎn)大量通過網(wǎng)絡(luò)傳輸與處理,為了保證公民信息與財(cái)產(chǎn)安全而帶來的源代碼漏洞檢測(cè)的工作量十分巨大,而依賴于軟件開發(fā)相關(guān)人員人工完成無法滿足需求,此外,人工檢測(cè)軟件源代碼漏洞受到多種因素影響,無法保證漏洞檢測(cè)工作的準(zhǔn)確性。所以,需要提高軟件漏洞檢測(cè)工作的智能化程度以保證其高效性和準(zhǔn)確性。
目前,代碼漏洞檢測(cè)系統(tǒng)的研究主要包括傳統(tǒng)漏洞檢測(cè)方法和基于機(jī)器學(xué)習(xí)的漏洞檢測(cè)方法。傳統(tǒng)的漏洞檢測(cè)方法主要有基于規(guī)則的漏洞檢測(cè)方法和基于相似性的漏洞檢測(cè)方法,基于規(guī)則的漏洞檢測(cè)方法對(duì)于規(guī)則外漏洞存在較高漏報(bào)率,基于相似性的漏洞檢測(cè)方法局限性較大。傳統(tǒng)的將機(jī)器學(xué)習(xí)應(yīng)用于代碼漏洞檢測(cè)的方法,漏洞數(shù)據(jù)的特征依賴于領(lǐng)域?qū)<叶x,需要花費(fèi)大量人工投入,也正由于漏洞數(shù)據(jù)特征需要人工定義,對(duì)于特征的定義存在不可避免的缺失和誤差,進(jìn)而影響漏洞檢測(cè)系統(tǒng)的準(zhǔn)確率?;谏疃葘W(xué)習(xí)的漏洞檢測(cè)方法,由神經(jīng)網(wǎng)絡(luò)模型自動(dòng)學(xué)習(xí)漏洞數(shù)據(jù)特征,可以避免大量人工投入,同時(shí)神經(jīng)網(wǎng)絡(luò)可以從更深層次分析漏洞數(shù)據(jù)特征,發(fā)現(xiàn)人類未定義的代碼結(jié)構(gòu)特征,從而有效降低漏洞檢測(cè)系統(tǒng)的漏報(bào)率和誤報(bào)率。
目前基于神經(jīng)網(wǎng)絡(luò)的漏洞檢測(cè)方法的研究工作有以下兩個(gè)方面。一方面,所使用的漏洞數(shù)據(jù)集主要是漏洞相關(guān)序列化代碼或者經(jīng)過一定處理的漏洞代碼片段,提供給神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)模型的漏洞數(shù)據(jù)集只有相關(guān)代碼的文本信息,對(duì)于漏洞代碼的依賴和調(diào)用信息沒有很好地應(yīng)用于預(yù)測(cè)源代碼漏洞。模型得到的信息十分有限,并不能全面地獲取漏洞特征,準(zhǔn)確判斷漏洞位置。另一方面,采用圖結(jié)構(gòu)表示源代碼漏洞數(shù)據(jù)可以較好地表達(dá)漏洞特征信息[1],已有相關(guān)研究將圖結(jié)構(gòu)化源代碼漏洞數(shù)據(jù)應(yīng)用到漏洞檢測(cè)工作,但主要存在如下問題。
問題1:采用的圖結(jié)構(gòu)化數(shù)據(jù)中包含較多與漏洞無關(guān)的源代碼信息,這些信息作為神經(jīng)網(wǎng)絡(luò)模型的輸入,最終影響漏洞檢測(cè)系統(tǒng)的高效性和準(zhǔn)確性。
問題2:有關(guān)圖神經(jīng)網(wǎng)絡(luò)模型應(yīng)用于源代碼漏洞檢測(cè)領(lǐng)域的相關(guān)研究工作在漏洞檢測(cè)粒度方面仍存在較大提升空間,不能精確定位漏洞位置,只能在較粗粒度上判斷漏洞位置,對(duì)于漏洞的定位停留在文件級(jí)或者函數(shù)級(jí)。
本文主要構(gòu)建了一個(gè)基于圖結(jié)構(gòu)化源代碼切片的智能化漏洞檢測(cè)系統(tǒng)。首先,系統(tǒng)在源代碼漏洞數(shù)據(jù)集的預(yù)處理中采用代碼切片技術(shù),保證不會(huì)向神經(jīng)網(wǎng)絡(luò)模型輸入過多與源代碼漏洞無關(guān)的信息以提高系統(tǒng)的高效性和準(zhǔn)確性;其次,系統(tǒng)可以在切片級(jí)別預(yù)測(cè)源代碼漏洞并在代碼行級(jí)定位漏洞位置,實(shí)現(xiàn)細(xì)粒度的源代碼漏洞預(yù)測(cè)。
傳統(tǒng)的漏洞檢測(cè)方法主要有基于規(guī)則的漏洞檢測(cè)方法和基于相似性的漏洞檢測(cè)方法。基于規(guī)則的漏洞檢測(cè)方法主要依賴定義的漏洞規(guī)則,漏洞規(guī)則的構(gòu)建主要采用領(lǐng)域?qū)<胰斯ざx和編寫程序從大量已知漏洞數(shù)據(jù)中總結(jié)兩種方法[2]。首先,這種檢測(cè)方法獲取漏洞規(guī)則的過程需要投入大量人力,資源浪費(fèi)嚴(yán)重;其次,這種檢測(cè)方法的準(zhǔn)確率基本取決于規(guī)則的完整性和正確性,而這種方法定義的漏洞規(guī)則的完整性和正確性很難得到保證。基于相似性的漏洞檢測(cè)方法主要從代碼復(fù)用的風(fēng)險(xiǎn)出發(fā)考慮可能觸發(fā)的漏洞,局限性十分明顯,對(duì)于不是代碼復(fù)用引起的漏洞的漏報(bào)率很高[3]。例如,Xiao[4]等設(shè)計(jì)的MVP漏洞檢測(cè)系統(tǒng)通過從漏洞樣本數(shù)據(jù)中提取源代碼漏洞的函數(shù)特征及其修補(bǔ)函數(shù)的特征,將提取的特征與檢測(cè)的目標(biāo)函數(shù)匹配,進(jìn)而在函數(shù)級(jí)別預(yù)測(cè)源代碼漏洞,對(duì)于其已獲取函數(shù)特征的漏洞有較好的檢測(cè)效果,但是對(duì)于未從漏洞數(shù)據(jù)中提取到漏洞特征的相關(guān)漏洞沒有實(shí)現(xiàn)有效檢測(cè)。
根據(jù)是否需要專家定義漏洞特征,基于機(jī)器學(xué)習(xí)的漏洞檢測(cè)研究工作主要分為兩種:一種是采用由專家定義漏洞特征的模型[5-8];另一種是采用不依賴專家定義漏洞特征的深度學(xué)習(xí)模型[2,3,9-21]。一方面,采用由專家定義漏洞特征的模型的工作,先由專家定義漏洞特征,然后采用機(jī)器學(xué)習(xí)模型從輸入數(shù)據(jù)中提取特征相關(guān)信息分析學(xué)習(xí),最后達(dá)到檢測(cè)源代碼漏洞的目的。這種方法對(duì)于漏洞檢測(cè)的效果主要依賴于專家定義的漏洞特征,具有較高的人工成本。此外,模型對(duì)于輸入的漏洞相關(guān)數(shù)據(jù),除了定義的漏洞特征相關(guān)信息外的其他漏洞信息沒有得到充分利用,從而影響漏洞檢測(cè)的準(zhǔn)確性。另一方面,采用深度學(xué)習(xí)模型的漏洞檢測(cè)工作,不需要由專家定義漏洞特征,既減少了人工參與,又可以使模型學(xué)習(xí)更深層次的漏洞特征,避免了人工定義特征帶來的信息損失。根據(jù)采用的漏洞數(shù)據(jù)的結(jié)構(gòu)不同,利用深度學(xué)習(xí)模型進(jìn)行漏洞檢測(cè)的工作主要有兩類:一類是漏洞源代碼數(shù)據(jù)采用序列化文本形式表示[2-3,9-18];另一類是采用圖結(jié)構(gòu)化的漏洞源代碼數(shù)據(jù)[19-21]。采用序列化文本形式表示漏洞源代碼數(shù)據(jù)的相關(guān)研究工作主要是將漏洞源代碼經(jīng)過預(yù)處理,得到與漏洞相關(guān)的源代碼切片、特征等信息,再將得到源代碼文本信息經(jīng)過表征后作為深度學(xué)習(xí)模型的輸入。例如,陳肇炫[2]等設(shè)計(jì)的Astor系統(tǒng)基于源代碼結(jié)構(gòu)表征實(shí)現(xiàn)了切片粒度的漏洞檢測(cè)工作;Li[3,10~11]等設(shè)計(jì)的VulDeePecker系統(tǒng)和VulDeePecker系統(tǒng)采用深度學(xué)習(xí)模型分別實(shí)現(xiàn)了函數(shù)調(diào)用類漏洞的檢測(cè)工作和多種類型漏洞的檢測(cè)工作,其設(shè)計(jì)的SySeVR系統(tǒng)和VulDeeLocator系統(tǒng)分別實(shí)現(xiàn)了切片級(jí)和代碼行級(jí)的漏洞檢測(cè)工作。這類研究在表征漏洞相關(guān)源代碼信息時(shí),對(duì)源代碼結(jié)構(gòu)信息有所缺失。為了克服模型對(duì)源代碼結(jié)構(gòu)信息學(xué)習(xí)不完整的問題,將漏洞源代碼數(shù)據(jù)采用圖結(jié)構(gòu)表示應(yīng)用于機(jī)器學(xué)習(xí)模型的訓(xùn)練可以更完整地表征源代碼的結(jié)構(gòu)信息。例如,Wang[19]等提出一個(gè)以門控圖神經(jīng)網(wǎng)絡(luò)(GGNN,gated graph sequence neural networks)為基礎(chǔ)的漏洞數(shù)據(jù)收集和漏洞檢測(cè)系統(tǒng),捕捉多種源代碼漏洞關(guān)系,提高漏洞檢測(cè)系統(tǒng)的準(zhǔn)確性;Duan[20]等設(shè)計(jì)的VulSniper系統(tǒng)將源代碼表示為代碼屬性圖,將代碼屬性圖表征為向量后輸入注意力神經(jīng)網(wǎng)絡(luò)模型以實(shí)現(xiàn)判斷源代碼是否存在漏洞;Zhou[21]等設(shè)計(jì)的Devign系統(tǒng)提取多種圖表示的源代碼特征用于構(gòu)造圖結(jié)構(gòu)化數(shù)據(jù)集并應(yīng)用于門控圖神經(jīng)網(wǎng)絡(luò),創(chuàng)新性地增加了Conv層根據(jù)節(jié)點(diǎn)特征篩選節(jié)點(diǎn),Devign系統(tǒng)實(shí)現(xiàn)了在函數(shù)級(jí)別預(yù)測(cè)源代碼漏洞。但以上研究工作在源代碼漏洞預(yù)測(cè)的粒度局限于函數(shù)級(jí),無法準(zhǔn)確定位漏洞存在的代碼行。本文設(shè)計(jì)的采用圖結(jié)構(gòu)化的代碼切片數(shù)據(jù)訓(xùn)練神經(jīng)網(wǎng)絡(luò)模型,使模型可以學(xué)習(xí)到更完整的源代碼結(jié)構(gòu)信息,并且利用模型中的注意力機(jī)制定位漏洞代碼行,提供更細(xì)粒度的漏洞檢測(cè)信息。
本文的目標(biāo)是設(shè)計(jì)一個(gè)漏洞檢測(cè)系統(tǒng),致力于源代碼運(yùn)行時(shí)的數(shù)據(jù)和控制依賴關(guān)系的表征和學(xué)習(xí),并在低誤報(bào)率和低漏報(bào)率的基礎(chǔ)上實(shí)現(xiàn)漏洞智能檢測(cè)并預(yù)測(cè)漏洞觸發(fā)行。
本節(jié)介紹系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)。圖1是所提漏洞檢測(cè)系統(tǒng)整體流程,首先獲取漏洞候選圖結(jié)構(gòu)化源代碼切片的過程,之后訓(xùn)練神經(jīng)網(wǎng)絡(luò)模型的工作流程。
圖1 漏洞檢測(cè)系統(tǒng)整體流程
Figure 1 Vulnerability detection Process of the system
首先獲取源代碼對(duì)應(yīng)的程序依賴圖(PDG,program dependence graph),之后從源代碼PDG中獲取漏洞候選源代碼圖結(jié)構(gòu)化切片,最后,在圖結(jié)構(gòu)切片中標(biāo)記漏洞信息。
(1)獲取源代碼PDG
檢測(cè)系統(tǒng)的輸入為漏洞檢測(cè)目標(biāo)源代碼,分析程序源代碼的控制流、數(shù)據(jù)流等信息,得到以源代碼中函數(shù)為單位的PDG。對(duì)函數(shù)級(jí)PDG進(jìn)行信息的完善,補(bǔ)充函數(shù)中調(diào)用其他函數(shù)的相關(guān)信息,使函數(shù)運(yùn)行時(shí)發(fā)生調(diào)用函數(shù)動(dòng)作的相關(guān)信息可以追蹤,實(shí)現(xiàn)跨函數(shù)的PDG。獲得PDG中一個(gè)節(jié)點(diǎn)對(duì)應(yīng)的是源程序中一行代碼(節(jié)點(diǎn)中包含關(guān)于本節(jié)點(diǎn)源代碼語句的相關(guān)信息:語句類型,節(jié)點(diǎn)ID,在源程序中的位置,所屬函數(shù));PDG中還包含函數(shù)運(yùn)行時(shí)的控制流和數(shù)據(jù)流關(guān)系以及節(jié)點(diǎn)之間邊的關(guān)系表示。
(2)獲取漏洞候選圖結(jié)構(gòu)切片
根據(jù)4種漏洞語法特征:(庫/API函數(shù)調(diào)用、數(shù)組使用、指針使用和表達(dá)式定義),從上一步獲得的PDG中確定候選漏洞節(jié)點(diǎn),即節(jié)點(diǎn)對(duì)應(yīng)的代碼語句中如果符合漏洞語法特征,則確定為候選漏洞節(jié)點(diǎn)。根據(jù)候選漏洞節(jié)點(diǎn)從PDG中截取與候選漏洞節(jié)點(diǎn)存在數(shù)據(jù)依賴或者控制依賴關(guān)系的節(jié)點(diǎn)和相應(yīng)的邊構(gòu)成漏洞候選圖結(jié)構(gòu)化切片。例如,某個(gè)節(jié)點(diǎn)對(duì)應(yīng)的源代碼語句中存在指針使用,這個(gè)節(jié)點(diǎn)就會(huì)被確定為漏洞候選節(jié)點(diǎn),從這個(gè)節(jié)點(diǎn)出發(fā),尋找與其存在控制或者數(shù)據(jù)依賴關(guān)系的節(jié)點(diǎn),從上一步得到的PDG中提取出與本節(jié)點(diǎn)相關(guān)的節(jié)點(diǎn)集,同時(shí)提取出節(jié)點(diǎn)集所包含的邊組成一個(gè)PDG子圖,這個(gè)子圖本質(zhì)上就是源程序的一個(gè)切片,子圖中所包含的代碼行集合就是源程序中代碼行的一個(gè)子集,這個(gè)PDG子圖就是漏洞候選源代碼切片之一。
(3)在圖結(jié)構(gòu)切片中標(biāo)記漏洞信息
為了訓(xùn)練模型,系統(tǒng)的輸入源程序包含有漏洞的源程序及其修補(bǔ)程序和無漏洞的源程序,源程序已經(jīng)標(biāo)注是否有漏洞,有漏洞源程序已經(jīng)標(biāo)注漏洞觸發(fā)代碼行。上一步得到的漏洞候選源代碼切片包含的節(jié)點(diǎn)中,如果存在節(jié)點(diǎn)對(duì)應(yīng)的代碼行有標(biāo)注的漏洞觸發(fā)代碼行,則這個(gè)節(jié)點(diǎn)標(biāo)注為漏洞觸發(fā)節(jié)點(diǎn),節(jié)點(diǎn)所屬的切片標(biāo)注為存在漏洞的代碼切片。
圖2為模型訓(xùn)練和測(cè)試階段,輸入分別為訓(xùn)練集數(shù)據(jù)或者測(cè)試集數(shù)據(jù),首先表征漏洞候選圖結(jié)構(gòu)切片,將圖信息表征為可以作為神經(jīng)網(wǎng)絡(luò)模型學(xué)習(xí)的數(shù)據(jù),之后將表征后的信息輸入神經(jīng)網(wǎng)絡(luò)模型,輸出完成訓(xùn)練的神經(jīng)網(wǎng)絡(luò)模型;測(cè)試部分則輸出測(cè)試集數(shù)據(jù)的漏洞檢測(cè)及漏洞行預(yù)測(cè)結(jié)果。
3.2.1 漏洞候選圖結(jié)構(gòu)切片表征信息
(1)映射代碼中的自定義符號(hào)
訓(xùn)練集和測(cè)試集中輸入的圖結(jié)構(gòu)切片中,包含的代碼文本信息經(jīng)過表征后才能輸入神經(jīng)網(wǎng)絡(luò)模型進(jìn)行測(cè)試和訓(xùn)練。這些代碼文本信息需要表征為向量,這個(gè)過程采用相關(guān)的神經(jīng)網(wǎng)絡(luò)模型完成。而輸入數(shù)據(jù)集的代碼中包含大量軟件工程師自定義的符號(hào),如自定義的變量名、函數(shù)名等。這些人工自定義的符號(hào)與漏洞無關(guān),在表征時(shí)會(huì)被視為唯一的值,對(duì)于將代碼文本表征為向量的神經(jīng)網(wǎng)絡(luò)模型會(huì)影響其準(zhǔn)確性。所以,自定義的符號(hào)將會(huì)被映射為統(tǒng)一的符號(hào)代替。例如,變量將被映射為VAR1,VAR2……函數(shù)名將被映射為FUN1,F(xiàn)UN2……。在不同的切片中出現(xiàn)的變量、函數(shù)等可能會(huì)被映射為相同的符號(hào)代替,以此避免無限制的自定義變量對(duì)將代碼文本映射為向量準(zhǔn)確性的影響。
圖2 模型訓(xùn)練和測(cè)試階段
Figure 2 Model training and testphase
(2)將映射后的代碼表征為向量
首先,將代碼文本中的具體代碼行分為一個(gè)符號(hào)集。例如,“int VAR1,VAR2;”會(huì)被分為“int”“VAR1”“,”“VAR2”“;”。之后,為了保證每行代碼轉(zhuǎn)換后的向量長(zhǎng)度一致,將對(duì)一行代碼所對(duì)應(yīng)的符號(hào)集進(jìn)行補(bǔ)全或者截?cái)嗖僮?,使一行代碼對(duì)應(yīng)的符號(hào)集所包含的符號(hào)數(shù)量保持一致,從而保證每一行代碼轉(zhuǎn)換為向量后的長(zhǎng)度一致。本文采用Word2Vec工具將符號(hào)集轉(zhuǎn)換為向量,Word2Vec在經(jīng)過訓(xùn)練后,可以將符號(hào)一一對(duì)應(yīng)為相應(yīng)的向量,滿足本文系統(tǒng)的需要。
(3)表征圖結(jié)構(gòu)切片
輸入神經(jīng)網(wǎng)絡(luò)模型的圖信息主要包括切片的圖結(jié)構(gòu)信息和節(jié)點(diǎn)中的信息。節(jié)點(diǎn)對(duì)應(yīng)的代碼行內(nèi)容已經(jīng)表征為向量。切片的圖結(jié)構(gòu)信息包括:節(jié)點(diǎn)的唯一標(biāo)識(shí)信息、節(jié)點(diǎn)所屬的圖標(biāo)識(shí)信息、節(jié)點(diǎn)間關(guān)系的標(biāo)識(shí)信息、圖的分類標(biāo)識(shí)信息。節(jié)點(diǎn)中的信息包括:節(jié)點(diǎn)對(duì)應(yīng)的代碼行內(nèi)容和節(jié)點(diǎn)對(duì)應(yīng)的代碼行在源程序中的位置,
輸入模型的數(shù)據(jù)包含多個(gè)圖(即圖結(jié)構(gòu)化切片)和多個(gè)圖對(duì)應(yīng)的許多節(jié)點(diǎn),這些節(jié)點(diǎn)的信息將一同輸入模型,因此需要對(duì)節(jié)點(diǎn)唯一標(biāo)識(shí),并標(biāo)識(shí)節(jié)點(diǎn)所屬的圖,即當(dāng)前節(jié)點(diǎn)屬于哪一個(gè)圖。節(jié)點(diǎn)的唯一標(biāo)識(shí)信息將映射為節(jié)點(diǎn)輸入模型的排序,如節(jié)點(diǎn)a的相關(guān)描述信息在輸入時(shí)排序?yàn)?,則表示節(jié)點(diǎn)a的唯一標(biāo)識(shí)為1。
節(jié)點(diǎn)所屬的圖標(biāo)識(shí)信息將采用圖的唯一標(biāo)識(shí)對(duì)節(jié)點(diǎn)一一標(biāo)識(shí),如節(jié)點(diǎn)的圖標(biāo)識(shí)信息文件中第1行的信息為“3”,則節(jié)點(diǎn)標(biāo)識(shí)為1的節(jié)點(diǎn)屬于圖標(biāo)識(shí)為3的圖。
輸入模型的所有圖中節(jié)點(diǎn)之間的關(guān)系也是統(tǒng)一標(biāo)識(shí)。節(jié)點(diǎn)之間關(guān)系的標(biāo)識(shí)采用鄰接矩陣的稀疏矩陣的簡(jiǎn)單表示形式,即采用邊對(duì)應(yīng)的兩個(gè)節(jié)點(diǎn)的唯一標(biāo)識(shí)來表示兩個(gè)節(jié)點(diǎn)之間的關(guān)系。例如,節(jié)點(diǎn)標(biāo)識(shí)對(duì)[1,2]表示:節(jié)點(diǎn)標(biāo)識(shí)1和節(jié)點(diǎn)標(biāo)識(shí)2所屬的圖中存在一條由節(jié)點(diǎn)1指向節(jié)點(diǎn)2的邊,節(jié)點(diǎn)所屬的圖即表明邊所屬 的圖。
輸入模型的所有圖中節(jié)點(diǎn)對(duì)應(yīng)的代碼行將一起輸入模型。節(jié)點(diǎn)對(duì)應(yīng)的代碼行內(nèi)容被表征為向量,代碼行向量輸入的順序和節(jié)點(diǎn)的圖標(biāo)識(shí)順序一致,節(jié)點(diǎn)1對(duì)應(yīng)的代碼行向量輸入時(shí)排序?yàn)?。
神經(jīng)網(wǎng)絡(luò)模型每次輸入包含多個(gè)圖的樣本,每次輸入的圖結(jié)構(gòu)切片統(tǒng)一編碼,每一個(gè)圖結(jié)構(gòu)切片有唯一的鍵值,圖的分類標(biāo)識(shí)輸入的順序即代表圖的唯一標(biāo)識(shí)鍵值。其中,標(biāo)識(shí)為“2”代表對(duì)應(yīng)的圖結(jié)構(gòu)切片中存在漏洞節(jié)點(diǎn),標(biāo)識(shí)為“1”代表對(duì)應(yīng)的圖結(jié)構(gòu)切片中沒有漏洞節(jié)點(diǎn)。例如,輸入順序?yàn)?的圖結(jié)構(gòu)切片分類標(biāo)識(shí)為“2”,表示圖唯一標(biāo)識(shí)為1的圖結(jié)構(gòu)切片存在漏洞節(jié)點(diǎn)。
節(jié)點(diǎn)對(duì)應(yīng)的代碼行在源程序的位置信息的排序順序和節(jié)點(diǎn)的唯一標(biāo)識(shí)一致,可以根據(jù)節(jié)點(diǎn)的標(biāo)識(shí)信息映射到節(jié)點(diǎn)對(duì)應(yīng)的代碼行在源程序中的位置。
總體來說,節(jié)點(diǎn)和圖的相關(guān)信息輸入順序即表示其唯一標(biāo)識(shí),如節(jié)點(diǎn)a的某個(gè)信息輸入時(shí)的排序?yàn)?,則節(jié)點(diǎn)a所有相關(guān)信息在輸入的排序均為1,圖亦是如此。
3.2.2 神經(jīng)網(wǎng)絡(luò)模型訓(xùn)練
圖3為本文系統(tǒng)采用的神經(jīng)網(wǎng)絡(luò)模型架構(gòu),將圖結(jié)構(gòu)切片表征后作為神經(jīng)網(wǎng)絡(luò)模型的輸入,圖結(jié)構(gòu)切片中的每一個(gè)節(jié)點(diǎn)可以映射到源代碼中的一行代碼。
模型采用全局池化和分層池化結(jié)合的思想,模型全局由3個(gè)“圖卷積?池化”模塊組成,每個(gè)模塊中包含圖卷積層和池化層。每個(gè)模塊池化之后的節(jié)點(diǎn)特征經(jīng)過ReadOut層聚合最終在線性層(MLP)連接進(jìn)行圖分類操作。本文系統(tǒng)采用3個(gè)“圖卷積?池化”模塊組成的主要原因是,3個(gè)模塊的漏洞檢測(cè)效果好于一個(gè)模塊或者兩個(gè)模塊組成的神經(jīng)網(wǎng)絡(luò)模型,在3個(gè)模塊的基礎(chǔ)上繼續(xù)增加組成模塊數(shù)量在漏洞檢測(cè)效果上的提升并不明顯,但是效率會(huì)隨著模塊數(shù)量的增加而逐漸降低。
圖3 神經(jīng)網(wǎng)絡(luò)模型架構(gòu)
Figure 3 Neural network model architecture
圖卷積層:采用自注意力機(jī)制(self- attention),本模型中的自注意力機(jī)制是一種全局圖注意力機(jī)制(global graph attention),全局圖注意力機(jī)制即考慮全圖所有節(jié)點(diǎn)的影響,計(jì)算相鄰節(jié)點(diǎn)之間的影響,經(jīng)過多次計(jì)算后,使每個(gè)節(jié)點(diǎn)獲取圖的全局幾何結(jié)構(gòu)。圖卷積層由多次卷積操作組成,每一次卷積操作每一個(gè)節(jié)點(diǎn)都從圖中與自己相鄰的節(jié)點(diǎn)獲取其信息并據(jù)此更新自身信息,經(jīng)過多次卷積操作后,每一個(gè)節(jié)點(diǎn)可以有效感知整個(gè)圖中的所有關(guān)系和節(jié)點(diǎn)信息并完成自身節(jié)點(diǎn)信息的更新。
池化層:根據(jù)上一次卷積層計(jì)算后更新的各個(gè)節(jié)點(diǎn)的信息篩選出對(duì)于最終漏洞預(yù)測(cè)影響較大的節(jié)點(diǎn),篩選出的節(jié)點(diǎn)組成的子圖將作為下一次循環(huán)的輸入,本次池化層計(jì)算篩選的結(jié)果會(huì)經(jīng)過ReadOut層讀出,并作為最終圖分類計(jì)算的考慮因素之一。
經(jīng)過多次卷積、池化和ReadOut循環(huán)后,篩選后的節(jié)點(diǎn)越來越少,對(duì)于最終漏洞預(yù)測(cè)的影響越來越大,但是之前被篩選的節(jié)點(diǎn)信息并不會(huì)丟棄,而是通過每次ReadOut保存下來,經(jīng)過一定權(quán)重計(jì)算作為圖分類的依據(jù)之一。同樣,經(jīng)過多次篩選后的節(jié)點(diǎn)會(huì)更大可能預(yù)測(cè)為漏洞節(jié)點(diǎn)。以上每次ReadOut之后的結(jié)果輸入最終的多層感知機(jī)計(jì)算后做出圖分類結(jié)果。
ReadOut之后篩選出的節(jié)點(diǎn)將結(jié)合圖分類結(jié)果,則篩選出的節(jié)點(diǎn)對(duì)應(yīng)到屬于該圖的節(jié)點(diǎn),并對(duì)應(yīng)到節(jié)點(diǎn)對(duì)應(yīng)的代碼行,即漏洞代碼行。
模型的測(cè)試階段將一組源代碼數(shù)據(jù)經(jīng)過分析后,生成相應(yīng)的PDG,根據(jù)4類關(guān)注點(diǎn)提取出圖結(jié)構(gòu)切片,然后映射切片中的代碼,之后表征圖結(jié)構(gòu)切片,得到的數(shù)據(jù)作為完成訓(xùn)練模型的輸入,分析模型對(duì)于輸入數(shù)據(jù)的判斷結(jié)果。模型輸出的結(jié)果分為兩類:一類為模型判斷為沒有源代碼漏洞的圖結(jié)構(gòu)切片;另一類為模型判斷為存在源代碼漏洞的圖結(jié)構(gòu)切片,這部分?jǐn)?shù)據(jù)的輸出還會(huì)包含模型預(yù)測(cè)存在較大可能導(dǎo)致源代碼漏洞的節(jié)點(diǎn),根據(jù)節(jié)點(diǎn)信息可以映射為源代碼中具體的代碼行,分析測(cè)試結(jié)果判斷系統(tǒng)對(duì)于源代碼漏洞和具體漏洞易發(fā)代碼行預(yù)測(cè)的準(zhǔn)確性。
模型分析節(jié)點(diǎn)對(duì)于漏洞預(yù)測(cè)結(jié)果的重要性,并充分考慮圖中全局節(jié)點(diǎn)對(duì)于預(yù)測(cè)代碼漏洞的影響。模型根據(jù)包含豐富代碼結(jié)構(gòu)信息的數(shù)據(jù)學(xué)習(xí)形成較高準(zhǔn)確率的漏洞判斷能力。
本文所設(shè)計(jì)的實(shí)驗(yàn)用于回答以下3個(gè)研究問題。
RQ1:本文系統(tǒng)相較于采用序列化結(jié)構(gòu)源代碼切片信息的深度學(xué)習(xí)漏洞檢測(cè)系統(tǒng),本文系統(tǒng)采用圖結(jié)構(gòu)化源代碼切片信息是否有更好的漏洞檢測(cè)性能?
RQ2:相較于其他基于圖神經(jīng)網(wǎng)絡(luò)模型的漏洞檢測(cè)系統(tǒng)是否有更好的漏洞檢測(cè)性能?
RQ3:本文系統(tǒng)相較于靜態(tài)漏洞檢測(cè)系統(tǒng),是否有更好的漏洞檢測(cè)性能?
本文主要采用以下指標(biāo)來評(píng)價(jià)漏洞檢測(cè)系統(tǒng)。
精度:反映系統(tǒng)判斷為漏洞的樣本中正確預(yù)測(cè)漏洞的比例。
召回率:反映出檢測(cè)系統(tǒng)判定存在漏洞樣本占實(shí)際存在漏洞樣本的比例。
1值:綜合考量了準(zhǔn)確率和召回率,更加均衡地反映出系統(tǒng)的漏洞檢測(cè)性能。
IoU值:反映系統(tǒng)檢測(cè)存在漏洞樣本中漏洞行位置的準(zhǔn)確性。本文中的IoU值為計(jì)算每個(gè)樣本的IoU值,求和取平均之后的值。
||值:系統(tǒng)預(yù)測(cè)樣本中漏洞行數(shù)量的平均值。
其中,TP為系統(tǒng)判斷為存在漏洞且確實(shí)存在漏洞的樣本數(shù)量;FP為系統(tǒng)判斷為存在漏洞而沒有漏洞的樣本數(shù)量;FN為系統(tǒng)判斷沒有漏洞而真實(shí)存在漏洞的樣本數(shù)量;為存在漏洞樣本中真實(shí)的漏洞行;為系統(tǒng)定位出漏洞樣本中的漏洞行;為系統(tǒng)判斷樣本中漏洞行的總數(shù);為樣本總數(shù)。
本文實(shí)驗(yàn)采用的源代碼數(shù)據(jù)集來源于SySeVR[11]中所使用的SARD(software assurance reference dataset)。SARD是由人工編寫的漏洞代碼得到的測(cè)試用例,數(shù)據(jù)集包含有漏洞的源程序、無漏洞的源程序、修補(bǔ)過漏洞的源程序,并且數(shù)據(jù)集中的漏洞源程序已經(jīng)標(biāo)識(shí)漏洞代碼行。將數(shù)據(jù)集處理為可以輸入本文系統(tǒng)神經(jīng)網(wǎng)絡(luò)模型的數(shù)據(jù)格式的過程如下。
(1)從源程序數(shù)據(jù)獲取漏洞候選圖結(jié)構(gòu)切片
首先基于Joern工具將源程序解析為以函數(shù)為單位的PDG圖,然后根據(jù)4種漏洞語法特征:(庫/API函數(shù)調(diào)用、數(shù)組使用、指針使用和表達(dá)式定義)確定PDG圖中的候選漏洞節(jié)點(diǎn),再根據(jù)候選漏洞節(jié)點(diǎn)選出與漏洞節(jié)點(diǎn)存在控制依賴和數(shù)據(jù)依賴的節(jié)點(diǎn),最后從PDG圖中獲取由這些節(jié)點(diǎn)組成的圖結(jié)構(gòu)切片,圖結(jié)構(gòu)切片中包含圖的結(jié)構(gòu)信息、節(jié)點(diǎn)對(duì)應(yīng)的代碼行內(nèi)容、節(jié)點(diǎn)對(duì)應(yīng)代碼行在源程序中的位置、節(jié)點(diǎn)對(duì)應(yīng)代碼行的語句類型、圖結(jié)構(gòu)切片是否包含漏洞的標(biāo)記、圖中包含的漏洞節(jié)點(diǎn)。獲取源程序PDG圖的過程是將Joern解析后的數(shù)據(jù)由Neo4j圖形數(shù)據(jù)庫讀出,然后采用Python編寫的程序通過Neo4j數(shù)據(jù)庫讀取數(shù)據(jù),完成提取漏洞候選圖結(jié)構(gòu)切片。
(2)表征圖結(jié)構(gòu)切片信息
本文系統(tǒng)采用Python編寫的程序?qū)崿F(xiàn)設(shè)計(jì)部分提出的映射代碼語句的機(jī)制,之后構(gòu)建Word2Vec模型將映射后的代碼符號(hào)集映射為可以輸入神經(jīng)網(wǎng)絡(luò)模型的向量格式,將代碼符號(hào)映射為向量包括如下內(nèi)容。①構(gòu)建語料庫:對(duì)實(shí)驗(yàn)數(shù)據(jù)中的漏洞候選圖結(jié)構(gòu)切片中的代碼行做分詞處理,將代碼行分成符號(hào)集,將所有的符號(hào)構(gòu)建成預(yù)料庫存。②訓(xùn)練Word2Vec模型:將語料庫輸入Word2Vec模型訓(xùn)練,本文設(shè)置了5輪迭代訓(xùn)練得到最終的模型。③將所有漏洞候選圖結(jié)構(gòu)切片中節(jié)點(diǎn)所包含代碼行通過完成訓(xùn)練的Word2Vec模型表征為向量。
輸入神經(jīng)網(wǎng)絡(luò)模型的數(shù)據(jù)包含多個(gè)漏洞候選圖結(jié)構(gòu)切片,將其節(jié)點(diǎn)信息、節(jié)點(diǎn)關(guān)系信息、圖分類信息、節(jié)點(diǎn)?圖對(duì)應(yīng)關(guān)系信息經(jīng)過表征后分別存儲(chǔ)為一個(gè)文件,作為神經(jīng)網(wǎng)絡(luò)模型的輸入。采用設(shè)計(jì)部分描述的方法表征圖結(jié)構(gòu)信息,以上過程采用Python編寫的程序?qū)崿F(xiàn)。
實(shí)驗(yàn)采用的數(shù)據(jù)中,SARD共生成122 103個(gè)圖結(jié)構(gòu)化切片。實(shí)驗(yàn)數(shù)據(jù)中的80%用于訓(xùn)練神經(jīng)網(wǎng)絡(luò)模型,10%用于驗(yàn)證模型使用,其余的10%用于測(cè)試模型的各項(xiàng)性能數(shù)據(jù)。實(shí)驗(yàn)環(huán)境的主要配置參數(shù)如下。硬件配置:CPU為Intel Xeon E5-2620 2.40 GHz,GPU為NVIDIA GeForce GTX 1080,內(nèi)存32 GB,磁盤大小2 TB;操作系統(tǒng)為L(zhǎng)inux 4.18.0-269.el8.x86_64。實(shí)驗(yàn)主要對(duì)提出的3個(gè)研究問題進(jìn)行針對(duì)性實(shí)驗(yàn)。
(1)針對(duì)RQ1的實(shí)驗(yàn)
為了確定采用圖結(jié)構(gòu)表示源代碼切片信息,并基于圖神經(jīng)網(wǎng)絡(luò)模型構(gòu)建漏洞檢測(cè)系統(tǒng)能否更好地檢測(cè)源代碼漏洞,設(shè)計(jì)了本文系統(tǒng)和同樣采用源代碼切片作為神經(jīng)網(wǎng)絡(luò)模型輸入樣本的漏洞檢測(cè)系統(tǒng)SySeVR[11]作比較。SySeVR的不同點(diǎn)在于其采用序列化結(jié)構(gòu)表示源代碼切片,將源代碼切片的代碼內(nèi)容作為文本信息表征后輸入神經(jīng)網(wǎng)絡(luò)模型。
本文系統(tǒng)采用圖神經(jīng)網(wǎng)絡(luò)模型中的3個(gè)“圖卷積?池化”模塊,每個(gè)模塊都會(huì)對(duì)圖中的節(jié)點(diǎn)按照固定比例進(jìn)行篩選,這個(gè)比例就是池化比率(pooling ratio)。為了確定最優(yōu)結(jié)果的池化篩選比例,設(shè)計(jì)了針對(duì)性實(shí)驗(yàn),比較在不同池化篩選比例下模型各項(xiàng)參數(shù)的結(jié)果,最終選擇最佳比例。
根據(jù)表1給出的實(shí)驗(yàn)結(jié)果,綜合考慮所有評(píng)價(jià)標(biāo)準(zhǔn),選擇在池化比率為0.65條件下為本文系統(tǒng)最優(yōu)結(jié)果,后面的實(shí)驗(yàn)將采用在這一條件下的實(shí)驗(yàn)結(jié)果與其他漏洞檢測(cè)系統(tǒng)進(jìn)行對(duì)比。
表1 本文系統(tǒng)在不同池化比率下各指標(biāo)對(duì)比結(jié)果
表2給出了針對(duì)RQ1的實(shí)驗(yàn)結(jié)果。①本文系統(tǒng)的1值相較于SySeVR系統(tǒng)高0.4%,說明本文系統(tǒng)的判斷樣本漏洞的綜合能力相較于SySeVR有略微提升。本文系統(tǒng)的精度相比SySeVR提高8.2%,說明本文系統(tǒng)判斷樣本是否存在漏洞的精確度有明顯提升,主要原因在于本文系統(tǒng)采用圖結(jié)構(gòu)表示代碼切片,可以為神經(jīng)網(wǎng)絡(luò)模型提高更豐富的數(shù)據(jù)依賴和控制依賴關(guān)系,模型可以據(jù)此學(xué)習(xí)到多方面的漏洞特征。SySeVR采用文本形式表征代碼切片,提供給模型學(xué)習(xí)的信息十分有限,模型只能通過代碼文本信息總結(jié)漏洞特征,相對(duì)于圖神經(jīng)網(wǎng)絡(luò)模型總結(jié)的漏洞特征有所缺失,所以本文系統(tǒng)在判斷樣本是否存在漏洞時(shí)會(huì)考慮更多因素,做出更加準(zhǔn)確的判斷,有更高的精度,但同時(shí)存在一些漏洞的樣本無法被準(zhǔn)確判斷出漏洞,導(dǎo)致召回率有所降低。②本文系統(tǒng)的IoU值相較于SySeVR系統(tǒng)提高5.5%,||則由13.3降至4.7,可以在更精確位置定位漏洞,提供更加有效的漏洞預(yù)測(cè)信息。本文系統(tǒng)可以在代碼行粒度預(yù)測(cè)漏洞位置,而SySeVR只能在切片級(jí)粒度預(yù)測(cè)漏洞,且本文漏洞檢測(cè)精度較高,所以本文系統(tǒng)在定位漏洞位置方面相對(duì)于SySeVR有較大提升。
表2 本文系統(tǒng)和SySeVR系統(tǒng)的各指標(biāo)對(duì)比結(jié)果
(2)針對(duì)RQ2的實(shí)驗(yàn)
為了確定本文系統(tǒng)相較于其他基于圖神經(jīng)網(wǎng)絡(luò)模型的漏洞檢測(cè)系統(tǒng)是否有更好的漏洞檢測(cè)性能,設(shè)計(jì)了本文系統(tǒng)和Devign系統(tǒng)比較。
表3給出了針對(duì)RQ2的實(shí)驗(yàn)結(jié)果。本文系統(tǒng)相較于Devign系統(tǒng),精度和1值分別提高56.7%和36.6%,主要原因是本文在數(shù)據(jù)預(yù)處理階段,會(huì)根據(jù)4類漏洞特征提取源代碼切片,而Devign系統(tǒng)中輸入圖神經(jīng)網(wǎng)絡(luò)模型的數(shù)據(jù)是以函數(shù)單位的,對(duì)比之下,本文系統(tǒng)在輸入模型的數(shù)據(jù)中一定程度上減少了與漏洞無關(guān)的源代碼信息的輸入,提高了系統(tǒng)漏洞檢測(cè)的準(zhǔn)確性。本文系統(tǒng)利用神經(jīng)模型自注意力機(jī)制在池化階段對(duì)圖中節(jié)點(diǎn)進(jìn)行篩選,間接對(duì)一個(gè)樣本中的代碼行進(jìn)行篩選,使模型可以更加專注于學(xué)習(xí)與漏洞有關(guān)的代碼行特征,從而更加精確地判斷樣本是否包含漏洞。Devign系統(tǒng)是對(duì)函數(shù)整體進(jìn)行學(xué)習(xí),一個(gè)函數(shù)中不一定所有的代碼行都與漏洞相關(guān),相對(duì)容易學(xué)習(xí)到與漏洞無關(guān)代碼特征,這會(huì)導(dǎo)致將無漏洞樣本判斷為存在漏洞樣本。
表3 本文系統(tǒng)和Devign各指標(biāo)對(duì)比結(jié)果
(3)針對(duì)RQ3的實(shí)驗(yàn)
將本文系統(tǒng)分別和以下幾種漏洞檢測(cè)系統(tǒng)做比較。①Checkmarx,一款商業(yè)的代碼靜態(tài)分析工具。②Flawfinder,一款開源的關(guān)于C/C++靜態(tài)掃描分析工具。③RATS,一款開源的代碼靜態(tài)分析工具。以上工具均可應(yīng)用于本文系統(tǒng)訓(xùn)練和測(cè)試所使用的數(shù)據(jù)集,且在源代碼靜態(tài)掃描領(lǐng)域具有較好表現(xiàn)。
表4給出了針對(duì)RQ3的實(shí)驗(yàn)結(jié)果。根據(jù)實(shí)驗(yàn)結(jié)果可知,本文系統(tǒng)相較于對(duì)比實(shí)驗(yàn)中結(jié)果較好的靜態(tài)代碼分析工具Checkmarx,精度和召回率分別提高61.9%和43.6%,這是因?yàn)殪o態(tài)漏洞檢測(cè)系統(tǒng)主要是基于規(guī)則和重復(fù)性的漏洞檢測(cè)器,由于定義規(guī)則的不完整性,系統(tǒng)會(huì)產(chǎn)生較高的假陽率和假陰率。而采用圖神經(jīng)網(wǎng)絡(luò)模型自動(dòng)學(xué)習(xí)漏洞特征可以避免由人類專家定義漏洞特征帶來的不完整性,從而總結(jié)出更深層次的漏洞特征,提高漏洞檢測(cè)系統(tǒng)的準(zhǔn)確性。本文系統(tǒng)的1值提升至89.7%,相對(duì)于靜態(tài)檢測(cè)工具漏洞檢測(cè)綜合能力提高兩倍以上,證明將圖神經(jīng)網(wǎng)絡(luò)模型應(yīng)用于漏洞檢測(cè)檢測(cè)領(lǐng)域是可行的,并且具有較高潛力。
表4 4種漏洞檢測(cè)系統(tǒng)的各指標(biāo)對(duì)比結(jié)果
本文提出了基于圖結(jié)構(gòu)源代碼切片的智能化漏洞檢測(cè)系統(tǒng),主要將從源代碼中獲取的圖結(jié)構(gòu)切片的信息經(jīng)過表征后,由圖神經(jīng)網(wǎng)絡(luò)模型學(xué)習(xí)漏洞相關(guān)特征,最終模型可以實(shí)現(xiàn)預(yù)測(cè)源代碼切片是否存在漏洞和預(yù)測(cè)含有漏洞的源代碼切片中的漏洞行。經(jīng)過和其他漏洞檢測(cè)工具的性能對(duì)比實(shí)驗(yàn),證實(shí)將圖神經(jīng)網(wǎng)絡(luò)模型應(yīng)用于源代碼漏洞檢測(cè)工作是一種有效的方法,且是一個(gè)十分有潛力的研究方向。
本文提出的漏洞檢測(cè)系統(tǒng)在定位漏洞觸發(fā)行時(shí)采用模型多次按比例進(jìn)行節(jié)點(diǎn)篩選,最終篩選得到的節(jié)點(diǎn)對(duì)應(yīng)到代碼行即為預(yù)測(cè)的漏洞行。這種方法對(duì)于代碼行數(shù)量較大的檢測(cè)樣本,預(yù)測(cè)出的漏洞行也會(huì)隨之變多,未來可以針對(duì)這一問題開展研究,使漏洞行定位預(yù)測(cè)變得更加準(zhǔn)確。
[1] 李韻, 黃辰林, 王中鋒, 等. 基于機(jī)器學(xué)習(xí)的軟件漏洞挖掘方法綜述[J]. 軟件學(xué)報(bào), 2020, 31(7): 2040-2061.
LIY, HUANG C L, WANG Z F, et al. Survey of software vulnerability mining methods based on machine learning[J]. Journal of Software. 2020, 31(7): 2040-2061.
[2] 陳肇炫, 鄒德清, 李珍, 等. 基于抽象語法樹的智能化漏洞檢測(cè)系統(tǒng)[J]. 信息安全學(xué)報(bào), 2020, 5(4): 1-13.
CHEN Z X, ZOU D Q, LI Z, et al. Intelligent vulnerability detection system based on abstract syntax tree[J]. Journal of Cyber Security. 2020, 5(4): 1-13.
[3] LI Z, ZOU D Q, XU S H, et al. VulDeePecker: a deep learning-based system for vulnerability detection[C]//The Network and Distributed System Security Symposium. 2018.
[4] XIAO Y, CHEN B H, YU C D, et al. MVP: Detecting vulnerabilities using patch-enhanced vulnerability signatures[C]//USENIX Security Symposium. 2018.
[5] GUSTAVO G, GUILLERMO L G, UZAL L, et al. Toward large-scale vulnerability discovery using machine learning[C]//The 6th ACM on Conference on Data and Application Security and Privacy (CODASPY'16). 2016: 85-96.
[6] STEPHAN N, THOMAS Z, CHRISTIAN H, et al. Predicting vulnerable software components[C]//2007 ACM Conference on Computer and Communications Security (CCS'07). 2007: 529-540.
[7] FABIAN Y, MARKUS L, KONRAD R. Generalized vulnerability extrapolation using abstract syntax trees[C]//The 28th Annual Computer Security Applications Conference. 2012: 359-368.
[8] FABIAN Y, ALWIN M, HUGO G, et al. Automatic inference of search patterns for taint-style vulnerabilities[C]//IEEE Symposium on Security and Privacy (S&P'15). 2015: 797-812.
[9] ZOU D Q, WANG S J, XU S H, et al.VulDeePecker: a deep learning-based system for multiclass vulnerability detection[J]. IEEE Transactions on Dependable and Secure Computing, 2021, 15(5): 2224-2236.
[10] LI Z, ZOU D Q, XU S H, et al. VulDeeLocator: a deep learning-based fine-grained vulnerability detector[J]. IEEE Transactions on Dependable and Secure Computing, 2021.
[11] LI Z, ZOU D Q, XU S H, et al. SySeVR: a Framework for using deep learning to detect software vulnerabilities[J]. IEEE Transactions on Dependable and Secure Computing, 2021.
[12] LIN G J, XIAO W, ZHANG J, et al. Deep Learning-based vulnerable function detection: a benchmark[C]//The 21st International Conference on Information and Communications Security. 2019: 219-232.
[13] LIN G J, ZHANG J, LUO W, et al. POSTER: vulnerability discovery with function representation learning from unlabeled projects[C]// ACM SIGSAC Conference on Computer and Communications Security. 2017: 2539-2541.
[14] LIN G J, ZHANG J, LUO W, et al. Cross-project transfer representation learning for vulnerable function discovery[J]. IEEE Trans Industrial Informatics, 2018, 14(7): 329-3297.
[15] LIU S G, LIN G J, QU L Z, et al. CD-VulD: cross-domain vulnerability discovery based on deep domain adaptation[J]. IEEE Transactions on Dependable and Secure Computing, 2020.
[16] VAN N, TRUNG L, TUE L, et al. Deep domain adaptation for vulnerable code function identification[C]//International Joint Conference on Neural Networks. 2019: 1-8.
[17] REBECCA R, LOUISK, LEI H, ET A L. Automated vulnerability detection in source code using deep representation learning[C]//The 17th IEEE International Conference on Machine Learning and Applications(ICMLA). 2018: 757-762.
[18] TIM S. Machine-learning supported vulnerability detection in source code[C]//The 27th ACM Joint Meeting on European Software Engineering Conference and Symposium on the Foundations of Software Engineering(ESEC/FSE). 2019: 1180-1183.
[19] WANG H T, YE G X, TANG Z Y, et al. Combining graph-based learning with automated data collection for code vulnerability detection[J]. IEEE Transactions on Dependable and Secure Computing. 2020.
[20] DUAN X, WU H, JI S L, et al. VulSniper: focus your attention to shoot fine-grained vulnerabilities[C]//The 28th International Joint Conference on Artificial Intelligence. 2019: 4665-4671.
[21] ZHOU Y Q, LIU S Q, SIOW J, et al. Devign: effective vulnerability identification by learning comprehensive program semantics via graph neural networks[C]//Annual Conference on Neural Information Processing Systems(NeurIPS). 2019: 10197-10207.
Intelligent vulnerability detection system based on graph structured source code slice
ZOU Deqing1, LI Xiang2, HUANG Minhuan2,SONG Xiang3,LI Hao3,LI Weiming4
1. School of Cyber Science and Engineering, Huazhong University of Science and Technology, Wuhan 430074, China 2.National Key Laboratory of Science and Technology on Information System Security,Beijing 100101, China 3.School of Software Engineering, Huazhong University of Science and Technology, Wuhan 430074, China 4. Network and Computation Center, Huazhong University of Science and Technology, Wuhan 430074, China
For the intelligent vulnerability detection, the system extracts the graph structured source code slices according to the vulnerability characteristics from the program dependency graph of source code, and then presents the graph structured slice information to carry out vulnerability detection by using the graph neural network model. Slice level vulnerability detection was realized and the vulnerability line was located at the code line level. In order to verify the effectiveness of the system, compared with the static vulnerability detection systems, the vulnerability detection system based on serialized text information, and the vulnerability detection system based on graph structured information, the experimental results show that the proposed system has a high accuracy in the vulnerability detection capability and a good performance in the vulnerability code line prediction.
vulnerability detection, graph structure, code slice, deep learning
TP393
A
10.11959/j.issn.2096?109x.2021088
2021?06?01;
2021?09?10
李響,ideal_work@163.com
國家自然科學(xué)基金(U1936211)
The National Nature Science Foundation of China (U1936211)
鄒德清, 李響, 黃敏桓, 等. 基于圖結(jié)構(gòu)源代碼切片的智能化漏洞檢測(cè)系統(tǒng)[J]. 網(wǎng)絡(luò)與信息安全學(xué)報(bào), 2021, 7(5): 113-122.
ZOU D Q, LI X, HUANG M H, et al. Intelligent vulnerability detection system based on graph structured source code slice[J]. Chinese Journal of Network and Information Security, 2021, 7(5): 113-122.
鄒德清(1975? ),男,湖南瀏陽人,華中科技大學(xué)教授、博士生導(dǎo)師,主要研究方向?yàn)橄到y(tǒng)與軟件安全、云計(jì)算安全。
李響(1983? ),女,河北涿州人,信息系統(tǒng)安全技術(shù)重點(diǎn)實(shí)驗(yàn)室高級(jí)工程師,主要研究方向?yàn)檐浖嗳跣苑治觥阂獯a檢測(cè)。
黃敏桓(1971? ),男,江西萬載人,信息系統(tǒng)安全技術(shù)重點(diǎn)實(shí)驗(yàn)室研究員,主要研究方向?yàn)榇嗳跣宰詣?dòng)分析、網(wǎng)絡(luò)安全評(píng)估與驗(yàn)證。
宋翔(1996? ),男,河南新鄉(xiāng)人,華中科技大學(xué)碩士生,主要研究方向?yàn)榫W(wǎng)絡(luò)安全。
李浩(1995? ),男,河南駐馬店人,華中科技大學(xué)碩士生,主要研究方向?yàn)榫W(wǎng)絡(luò)安全。
李偉明(1975? ),男,湖南株洲人,華中科技大學(xué)副教授,主要研究方向?yàn)榫W(wǎng)絡(luò)安全。