本發(fā)明屬于安全技術(shù)領(lǐng)域,涉及一種基于代碼倉(cāng)庫(kù)提交說(shuō)明的PoC快速生成方法。
背景技術(shù):
目前越來(lái)越多的軟件項(xiàng)目使用版本控制功能,通過(guò)代碼倉(cāng)庫(kù)來(lái)跟蹤軟件項(xiàng)目的整個(gè)開(kāi)發(fā)過(guò)程。代碼倉(cāng)庫(kù)可以在空間上保證項(xiàng)目?jī)?nèi)容的統(tǒng)一管理,也可在時(shí)間上保證開(kāi)發(fā)過(guò)程中的每個(gè)更改細(xì)節(jié)都被記錄并保存。每次更改代碼的提交都附帶提交說(shuō)明,內(nèi)容包括提交時(shí)間、提交作者、提交原因、提交內(nèi)容等,提交目的可能是補(bǔ)充功能,或者修復(fù)項(xiàng)目中存在的安全漏洞等。
PoC(Proof of Concept),中文解釋為概念驗(yàn)證,在本發(fā)明中特指用于驗(yàn)證安全漏洞的測(cè)試代碼。PoC可以還原安全漏洞的發(fā)生場(chǎng)景,證明軟件系統(tǒng)中安全漏洞的存在和利用方式,被廣泛應(yīng)用于安全測(cè)試、滲透測(cè)試、安全漏洞驗(yàn)證等領(lǐng)域。然而,在實(shí)際應(yīng)用中常常需要大量的PoC作為測(cè)試樣本或驗(yàn)證樣本,然而目前并沒(méi)有可靠、充分的搜集來(lái)源。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明提出一種基于代碼倉(cāng)庫(kù)提交說(shuō)明的PoC快速生成方法,目的在于快速地搜集大量可靠有效的PoC作為軟件安全測(cè)試、滲透測(cè)試的輸入實(shí)例,或者作為安全漏洞的驗(yàn)證樣本,協(xié)助安全技術(shù)人員快速準(zhǔn)確定位安全漏洞的位置,為安全漏洞的驗(yàn)證提供幫助。
為實(shí)現(xiàn)上述目的,本發(fā)明采用如下技術(shù)方案:
一種基于代碼倉(cāng)庫(kù)提交說(shuō)明的PoC快速生成方法,其步驟包括:
1)從代碼倉(cāng)庫(kù)提交說(shuō)明中提取含有代碼的commit段,生成待測(cè)集;
2)提取步驟1)生成的待測(cè)集中commit段的語(yǔ)義特征,并根據(jù)commit段中是否含有PoC打正負(fù)標(biāo)簽,將語(yǔ)義特征協(xié)同正負(fù)標(biāo)簽一同作為輸入,訓(xùn)練生成PoC分類器;
3)使用步驟2)生成的PoC分類器,對(duì)步驟1)生成的待測(cè)集進(jìn)行并行分類,將含有PoC的commit段生成PoC集合,輸出PoC。
在本發(fā)明中,PoC(概念驗(yàn)證)特指用于驗(yàn)證安全漏洞的測(cè)試代碼;代碼倉(cāng)庫(kù)用于跟蹤軟件項(xiàng)目的整個(gè)開(kāi)發(fā)過(guò)程,在空間上保證項(xiàng)目?jī)?nèi)容的統(tǒng)一管理,在時(shí)間上保證開(kāi)發(fā)過(guò)程中的每個(gè)更改細(xì)節(jié)都被記錄并保存。本發(fā)明所述的代碼倉(cāng)庫(kù)包括但不限于Git;commit段指的是代碼倉(cāng)庫(kù)中每次變更代碼提交時(shí)附帶的提交說(shuō)明,內(nèi)容包括提交時(shí)間、提交作者、提交原因、提交內(nèi)容。
進(jìn)一步地,步驟1)包括以下步驟:
1-1)根據(jù)代碼倉(cāng)庫(kù)提交說(shuō)明中的關(guān)鍵字將代碼日志切割為多個(gè)commit段,人工挑選含代碼的commit段作為正訓(xùn)練樣本,不含代碼的commit段作為負(fù)訓(xùn)練樣本。
1-2)對(duì)正訓(xùn)練樣本和負(fù)訓(xùn)練樣本進(jìn)行數(shù)據(jù)預(yù)處理。所述預(yù)處理包括文本分詞(樣本語(yǔ)言為中文)、去停止詞和詞根還原(樣本語(yǔ)言為英文)。
1-3)提取預(yù)處理后的正訓(xùn)練樣本和負(fù)訓(xùn)練樣本的特征,并進(jìn)行文本向量化。
1-4)基于向量化的文本,采用并行機(jī)器學(xué)習(xí)方法對(duì)代碼倉(cāng)庫(kù)提交說(shuō)明中所有的commit段分類。
1-5)根據(jù)步驟1-4)分類的結(jié)果提取含有代碼的commit段生成待測(cè)集。
進(jìn)一步地,步驟1-4)中,在GPU中開(kāi)設(shè)多個(gè)線程,將傳輸自CPU的代碼倉(cāng)庫(kù)提交說(shuō)明中所有的commit段均分給多個(gè)線程,每個(gè)線程均完成相同的分類操作。
進(jìn)一步地,步驟2)包括以下步驟:
2-1)在待測(cè)集的commit段中,選取含有PoC的段落作為正訓(xùn)練樣本集,打正標(biāo)簽,非描述PoC的段落作為負(fù)訓(xùn)練樣本集,打負(fù)標(biāo)簽。
2-2)對(duì)正訓(xùn)練樣本集和負(fù)訓(xùn)練樣本集中的段落進(jìn)行預(yù)處理,所述預(yù)處理包括分句處理。
2-3)對(duì)預(yù)處理后的訓(xùn)練樣本采用并行深度學(xué)習(xí)方法訓(xùn)練隱層模型,提取語(yǔ)義特征。
2-4)將步驟2-3)所得最后隱層的語(yǔ)義特征,協(xié)同正標(biāo)簽和負(fù)標(biāo)簽,一同輸入分類器,訓(xùn)練生成PoC分類器。
進(jìn)一步地,步驟2-3)采用并行深度學(xué)習(xí)方法訓(xùn)練隱層模型的步驟又包括:
2-3-1)將預(yù)處理后的訓(xùn)練樣本切分為多批次,每批次切分為多塊;
2-3-2)對(duì)于每一批次的訓(xùn)練樣本,在GPU中開(kāi)啟多個(gè)線程,每個(gè)線程負(fù)責(zé)一塊訓(xùn)練樣本的隱層模型訓(xùn)練;
2-3-3)每個(gè)線程的隱層模型訓(xùn)練完成后,將得到的結(jié)果進(jìn)行統(tǒng)一化及整合后,對(duì)每個(gè)線程的訓(xùn)練結(jié)果進(jìn)行更新,繼續(xù)對(duì)下一批次的訓(xùn)練樣本進(jìn)行隱層模型訓(xùn)練。
進(jìn)一步地,步驟2-3)還包括在采用并行深度學(xué)習(xí)方法訓(xùn)練隱層模型時(shí)如需添加隱層則重復(fù)該步驟,最后再進(jìn)入步驟2-4)。
進(jìn)一步地,步驟3)包括以下步驟:
3-1)以步驟1)生成的待測(cè)集為測(cè)試樣本,并將測(cè)試樣本切分為數(shù)據(jù)1,數(shù)據(jù)2…,數(shù)據(jù)N。
3-2)將切分后的數(shù)據(jù)1至數(shù)據(jù)N平均分配給GPU中開(kāi)辟的多個(gè)線程,每個(gè)線程并發(fā)執(zhí)行步驟2)生成的PoC分類器,對(duì)本線程的測(cè)試樣本進(jìn)行語(yǔ)義分析和分類判斷,將結(jié)果返回給CPU。
3-3)CPU根據(jù)步驟3-2)返回的結(jié)果,將所含代碼為PoC的commit段生成PoC集合,輸出PoC。
進(jìn)一步地,本發(fā)明所述的并行方法是基于GPU的,GPU的并行貫穿于步驟1-4)的機(jī)器學(xué)習(xí)方法、步驟2-3)的深度學(xué)習(xí)方法和步驟3)的并行分類過(guò)程。其中,步驟1-4)所述的并行機(jī)器學(xué)習(xí)方法的目標(biāo)是通過(guò)分類獲得含有代碼的commit段,并不限定具體模型,因此所有得以實(shí)現(xiàn)該目標(biāo)的機(jī)器學(xué)習(xí)模型均可用于該步驟;步驟2-3)所述的并行深度學(xué)習(xí)方法的目標(biāo)是提取語(yǔ)義特征并分類獲得含有PoC的commit段,并不限定具體模型,因此所有得以實(shí)現(xiàn)該目標(biāo)的深度學(xué)習(xí)模型均可用于該步驟。
本發(fā)明的有益效果在于:
申請(qǐng)人在研究過(guò)程中,經(jīng)調(diào)查發(fā)現(xiàn),在代碼倉(cāng)庫(kù)中的關(guān)于修復(fù)安全漏洞的代碼提交說(shuō)明里,常常存在驗(yàn)證該安全漏洞的測(cè)試代碼,用于解釋本次提交的原因、驗(yàn)證提交前后的對(duì)比效果。本發(fā)明首次發(fā)現(xiàn)代碼倉(cāng)庫(kù)的提交說(shuō)明可以作為PoC的數(shù)據(jù)來(lái)源,并提供了有效可行的提取PoC方法,能夠快速地生成PoC集合,為軟件項(xiàng)目的安全測(cè)試、滲透測(cè)試等提供大量可靠的測(cè)試實(shí)例,同時(shí)降低安全技術(shù)人員搜集漏洞驗(yàn)證樣本的難度,進(jìn)而為安全漏洞的研究帶來(lái)幫助。
由于代碼倉(cāng)庫(kù)的提交說(shuō)明數(shù)據(jù)量龐大,導(dǎo)致分析過(guò)程耗時(shí)費(fèi)力,本發(fā)明引入GPU并行計(jì)算來(lái)解決時(shí)間瓶頸問(wèn)題。與CPU架構(gòu)不同,GPU含有更多的晶體管用于數(shù)據(jù)處理而非數(shù)據(jù)緩存和邏輯控制,旨在解決高密度、高并行度的計(jì)算問(wèn)題。GPU并行計(jì)算的最佳適用場(chǎng)景為數(shù)據(jù)量大并且重復(fù)的操作,例如深度學(xué)習(xí)中使用大量數(shù)據(jù)反復(fù)執(zhí)行的模型訓(xùn)練等。因此本發(fā)明結(jié)合機(jī)器學(xué)習(xí)方法、深度學(xué)習(xí)方法和GPU并行計(jì)算提出了一種基于代碼倉(cāng)庫(kù)提交說(shuō)明的PoC快速生成方法。該方法首先使用并行機(jī)器學(xué)習(xí)方法構(gòu)造分類器,對(duì)代碼倉(cāng)庫(kù)的提交說(shuō)明進(jìn)行分類,篩選出含代碼的commit段作為待測(cè)集。接著使用并行深度學(xué)習(xí)方法對(duì)待測(cè)集的commit段進(jìn)行語(yǔ)義分析,根據(jù)語(yǔ)義特征進(jìn)一步篩選出含有PoC的commit段,生成PoC集合。本發(fā)明適用于所有使用代碼倉(cāng)庫(kù)進(jìn)行版本控制的軟件項(xiàng)目。因此對(duì)于任意使用代碼倉(cāng)庫(kù)進(jìn)行版本控制的軟件項(xiàng)目,均可通過(guò)本發(fā)明快速地得到相應(yīng)PoC集合,包括但不限于Android和Linux Kernel。
附圖說(shuō)明
圖1是本發(fā)明基于代碼倉(cāng)庫(kù)提交說(shuō)明的PoC快速生成方法的示意圖。
圖2是本發(fā)明使用并行機(jī)器學(xué)習(xí)方法生成含代碼的commit待測(cè)集的流程圖。
圖3是本發(fā)明使用深度學(xué)習(xí)方法訓(xùn)練模型生成PoC分類器的流程圖。
圖4是本發(fā)明使用GPU并行訓(xùn)練隱層模型的流程圖。
圖5是本發(fā)明使用PoC分類器對(duì)commit待測(cè)集分類的流程圖。
圖6是本發(fā)明使用GPU并行分類的流程圖。
具體實(shí)施方式
下面結(jié)合附圖,通過(guò)實(shí)施例對(duì)本發(fā)明作進(jìn)一步的說(shuō)明。
本發(fā)明基于代碼倉(cāng)庫(kù)提交說(shuō)明的PoC快速生成方法,其總體架構(gòu)如圖1所示,主要包括以下步驟:
步驟S101、將代碼倉(cāng)庫(kù)提交說(shuō)明切割為多個(gè)commit段,人工挑選含代碼和不含代碼的commit段作為正負(fù)訓(xùn)練樣本集,經(jīng)數(shù)據(jù)預(yù)處理后,對(duì)其提取特征,使用并行機(jī)器學(xué)習(xí)方法對(duì)測(cè)試樣本集即所有commit段進(jìn)行分類,區(qū)分commit段是否含有代碼,提取含有代碼的commit段作為待測(cè)集。具體的步驟流程如圖2所示,說(shuō)明如下:
步驟S201、獲取訓(xùn)練樣本。根據(jù)代碼倉(cāng)庫(kù)提交說(shuō)明中的關(guān)鍵字將代碼日志切割為多個(gè)commit段,人工挑選含代碼的commit段作為正訓(xùn)練樣本,不含代碼的commit段作為負(fù)訓(xùn)練樣本。
步驟S202、對(duì)上述正、負(fù)訓(xùn)練樣本進(jìn)行數(shù)據(jù)預(yù)處理。包括文本分詞(樣本語(yǔ)言為中文)、去停止詞和詞根還原(樣本語(yǔ)言為英文)。
步驟S203、提取正、負(fù)訓(xùn)練樣本的特征,將文本向量化。將數(shù)據(jù)預(yù)處理后挑選出的詞用作構(gòu)建文本向量空間的特征項(xiàng),選取合適的權(quán)重算法,為每個(gè)特征項(xiàng)賦權(quán)值,構(gòu)建文本向量。
步驟S204、使用并行機(jī)器學(xué)習(xí)方法對(duì)代碼倉(cāng)庫(kù)提交說(shuō)明中所有commit段(即下述的“測(cè)試樣本集”)分類。由于測(cè)試樣本集數(shù)量龐大,且機(jī)器學(xué)習(xí)方法中文本向量距離的計(jì)算內(nèi)容較為簡(jiǎn)單,故可將該步驟移入GPU中以減少時(shí)間代價(jià)。在GPU中開(kāi)設(shè)多個(gè)線程,將傳輸自CPU的測(cè)試樣本集均分給多個(gè)線程,每個(gè)線程均完成相同的操作。
本發(fā)明在并行機(jī)器學(xué)習(xí)方法的使用中并不限定具體的機(jī)器學(xué)習(xí)模型,為了具體描述實(shí)施步驟,本實(shí)施例以K最近鄰(kNN,k-NearestNeighbor)模型為例,實(shí)際上在該步驟中也可使用其他機(jī)器學(xué)習(xí)模型。
步驟S205、計(jì)算本線程中的測(cè)試樣本與每個(gè)訓(xùn)練樣本的向量間距離。
步驟S206、挑選出與本線程中的測(cè)試樣本相似度最高的k個(gè)訓(xùn)練樣本。
步驟S207、根據(jù)該k個(gè)訓(xùn)練樣本的所屬類別,采用多數(shù)表決方法,推斷出本線程中的測(cè)試樣本的類別。
步驟S208、將分類結(jié)果傳輸至CPU,由CPU負(fù)責(zé)最后的邏輯整合。根據(jù)分類結(jié)果判別測(cè)試樣本集中每個(gè)commit段是否含有代碼。若含有,則轉(zhuǎn)至步驟S209;若不含代碼,則轉(zhuǎn)至步驟S210。
步驟S209、提取含有代碼的commit段生成待測(cè)集,作為步驟S103的測(cè)試樣本集。
步驟S210、結(jié)束。
步驟S102、使用并行深度學(xué)習(xí)方法,訓(xùn)練隱層模型,提取語(yǔ)義特征,進(jìn)而生成PoC分類器。首先在待測(cè)集的commit段中人工選取訓(xùn)練集,對(duì)其進(jìn)行數(shù)據(jù)預(yù)處理,訓(xùn)練語(yǔ)義特征,生成PoC分類器,該分類器可分類出含有PoC的commit段。具體的步驟流程如圖3所示,說(shuō)明如下:
步驟S301、獲取訓(xùn)練樣本。在待測(cè)集的commit段中,人工選取大量描述PoC的段落作為正訓(xùn)練樣本集,非描述PoC的段落作為負(fù)訓(xùn)練樣本集。
步驟S302、數(shù)據(jù)預(yù)處理。對(duì)正、負(fù)樣本集中的段落進(jìn)行分句處理。
步驟S303、將預(yù)處理后的所有訓(xùn)練樣本(不攜帶正負(fù)標(biāo)簽)作為輸入,無(wú)監(jiān)督的并行訓(xùn)練隱層模型,學(xué)習(xí)特征。
步驟S304、由于深度學(xué)習(xí)模型可包含多個(gè)隱層,該步驟由人工根據(jù)實(shí)踐經(jīng)驗(yàn)決定是否繼續(xù)添加隱層。若是,則轉(zhuǎn)入步驟S303,繼續(xù)訓(xùn)練新隱層模型;若不是,則轉(zhuǎn)入步驟S305。
步驟S305、將所得訓(xùn)練樣本最后隱層的特征,即語(yǔ)義特征,協(xié)同正負(fù)標(biāo)簽,一同輸入分類器,通過(guò)有監(jiān)督的學(xué)習(xí)對(duì)分類器進(jìn)行微調(diào)。
步驟S306、生成PoC分類器。
在步驟S303訓(xùn)練隱層模型中,由于訓(xùn)練樣本集規(guī)模龐大,且訓(xùn)練過(guò)程需要反復(fù)調(diào)節(jié),導(dǎo)致該步驟耗費(fèi)大量計(jì)算資源和計(jì)算時(shí)間,故采用GPU并行方法來(lái)加速計(jì)算效率。將訓(xùn)練數(shù)據(jù)切分為多批次,每批次切分為多塊。對(duì)于每一批次的訓(xùn)練數(shù)據(jù),在GPU中開(kāi)啟多個(gè)線程,每個(gè)線程負(fù)責(zé)一塊訓(xùn)練樣本的隱層模型訓(xùn)練任務(wù)。每個(gè)線程訓(xùn)練隱層模型的具體流程如圖4所示,說(shuō)明如下:
本發(fā)明在深度學(xué)習(xí)方法的使用中并不限定具體的深度學(xué)習(xí)模型,為了具體描述實(shí)施步驟,本實(shí)施例以自編碼器模型為例,實(shí)際上在該步驟中也可使用其他深度學(xué)習(xí)模型。
步驟S401、訓(xùn)練本線程的自編碼器。自編碼器由一對(duì)編碼器和解碼器構(gòu)成,對(duì)輸入數(shù)據(jù)先編碼后解碼,若編碼結(jié)果與輸入數(shù)據(jù)近乎一致,則認(rèn)為該編碼結(jié)果為輸入數(shù)據(jù)的良好表達(dá),即抽象特征。
步驟S402、判斷代價(jià)函數(shù)是否收斂。通過(guò)對(duì)比自編碼器的輸出結(jié)果與原始輸入的差異,可形成代價(jià)函數(shù),若代價(jià)函數(shù)收斂,則表明重構(gòu)誤差趨近最小,特征提取準(zhǔn)確,轉(zhuǎn)至步驟S404;若不收斂,則轉(zhuǎn)至步驟S403。
步驟S403、調(diào)整編碼器和解碼器的參數(shù),轉(zhuǎn)至步驟S401繼續(xù)訓(xùn)練自編碼器。
步驟S404、保存編碼器作為本線程最終的隱層模型,丟棄解碼器,提取編碼結(jié)果作為抽象特征。
由于每塊訓(xùn)練樣本不同,致使每個(gè)線程的隱層模型訓(xùn)練結(jié)果有所差異,即產(chǎn)生了多個(gè)模型實(shí)例。本發(fā)明引入圖4中的參數(shù)服務(wù)器完成模型統(tǒng)一化,每個(gè)線程模型訓(xùn)練完成后,將結(jié)果模型匯報(bào)給參數(shù)服務(wù)器,參數(shù)服務(wù)器負(fù)責(zé)將整合后的新模型分發(fā)給各線程,更新訓(xùn)練模型之后,繼續(xù)對(duì)下一批次的訓(xùn)練樣本進(jìn)行隱層模型訓(xùn)練。
步驟S103、使用步驟S102生成的PoC分類器對(duì)S101生成的含代碼的commit待測(cè)集進(jìn)行語(yǔ)義分析,分類出含PoC的commit段,生成PoC集合。為了加快分類效率,引入GPU并行方法,將測(cè)試樣本均分給多個(gè)線程,并發(fā)執(zhí)行語(yǔ)義分析。具體的步驟流程如圖5所示,說(shuō)明如下:
步驟S501、將步驟S101得到的含代碼的commit待測(cè)集作為測(cè)試樣本集。
步驟S502、由于測(cè)試樣本集數(shù)量龐大,故引入GPU并行方法加速分類效率。首先對(duì)測(cè)試樣本數(shù)據(jù)進(jìn)行切分,如圖6所示,將切分后的數(shù)據(jù)1至數(shù)據(jù)N平均分配給GPU中開(kāi)辟的多個(gè)線程,每個(gè)線程并發(fā)執(zhí)行步驟S102生成的PoC分類器,對(duì)本線程的測(cè)試樣本進(jìn)行語(yǔ)義分析和分類判斷,將結(jié)果返回給CPU。
步驟S503、CPU根據(jù)分類結(jié)果判別commit段所含代碼是否為PoC,若是,則轉(zhuǎn)至步驟S504;若不是,則轉(zhuǎn)至步驟S505。
步驟S504、生成PoC集合,輸出PoC。
步驟S505、結(jié)束。
實(shí)施例
下面提供一個(gè)具體應(yīng)用實(shí)例,其實(shí)施步驟包括:
1)使用并行機(jī)器學(xué)習(xí)方法對(duì)代碼倉(cāng)庫(kù)提交說(shuō)明中的commit段分類,區(qū)分commit段是否含有代碼,提取含有代碼的commit段作為待測(cè)集。
以Linux kernel項(xiàng)目的代碼倉(cāng)庫(kù)提交日志為例,使用并行機(jī)器學(xué)習(xí)方法對(duì)其分類,得到commit-77238f2b942b38ab4e7f3aced44084493e4a8675中含有代碼,將該commit段添加進(jìn)待測(cè)集中。
2)使用并行深度學(xué)習(xí)方法,訓(xùn)練隱層模型,提取commit段的語(yǔ)義特征。根據(jù)commit段中是否含有PoC來(lái)挑選正負(fù)樣本,將語(yǔ)義特征協(xié)同正負(fù)標(biāo)簽一同作為輸入,訓(xùn)練生成PoC分類器。
3)使用步驟2)生成的PoC分類器,并行地對(duì)步驟1)生成的commit待測(cè)集進(jìn)行語(yǔ)義分析,分類出含有PoC的commit段,生成PoC集合。
根據(jù)分類器的分類結(jié)果顯示,commit-77238f2b942b38ab4e7f3aced44084493e4a8675含有PoC。該commit段中的描述部分如下所示。
AF_UNIX:Fix deadlock on connecting to shutdown socket I found a deadlock bug in UNIX domain socket,which makes able to DoS attack against the local machine by non-root users.
How to reproduce:
1.Make a listening AF_UNIX/SOCK_STREAM socket with an abstruct namespace(*),and shutdown(2)it.
2.Repeat connect(2)ing to the listening socket from the other sockets until the connection backlog is full-filled.
3.connect(2)takes the CPU forever.If every core is taken,the system hangs.
PoC分類器通過(guò)對(duì)其文字描述部分進(jìn)行語(yǔ)義分析,發(fā)現(xiàn)所述內(nèi)容與PoC相關(guān),故將該commit段添加進(jìn)PoC集合中。生成的PoC如下所示。
以上實(shí)施例僅用于說(shuō)明本發(fā)明的技術(shù)方案而非對(duì)其進(jìn)行限制,本領(lǐng)域的普通技術(shù)人員可以對(duì)本發(fā)明的技術(shù)方案進(jìn)行修改或者等同替換,而不脫離本發(fā)明的精神和范圍,本發(fā)明的保護(hù)范圍應(yīng)以權(quán)利要求所述為準(zhǔn)。