• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      PDGcross:基于跨文件圖表征的源代碼漏洞檢測

      2023-08-15 02:02:10熊可欣喬夢晴
      計算機技術與發(fā)展 2023年8期
      關鍵詞:函數(shù)調用樣例源代碼

      熊可欣,李 濤,余 琴,喬夢晴

      (1.武漢科技大學 計算機科學與技術學院,湖北 武漢 430065;2.智能信息處理與實時工業(yè)系統(tǒng)湖北省重點實驗室,湖北 武漢 430065)

      0 引 言

      隨著軟件的復雜性不斷提高,漏洞的形態(tài)變得多樣化,軟件漏洞檢測技術需求不斷增加。為了實現(xiàn)漏洞檢測的高準確率、低誤報率,大量的深度學習方法被嘗試用于檢測源代碼漏洞問題中,以實現(xiàn)漏洞檢測的自動化和智能化[1-3]。在目前的漏洞檢測中,重點關注于單個文件內部是否存在漏洞。然而在實際的項目開發(fā)中代碼規(guī)模大,存在多種復雜的函數(shù)調用與參數(shù)傳遞,在單文件范圍內有較好的檢測效果,然而檢測過程中都忽略了文件與文件之間可能存在的調用關系以及可能由于該類調用關系而產生的漏洞[4-5],多文件間的函數(shù)調用關系而產生的漏洞危害性較高但關注度較低,檢測難度較高[6-8]。因此,該文將關注多文件間的函數(shù)調用,檢測因調用關系而導致的漏洞。

      在基于源代碼的漏洞檢測中,需要將源代碼中的有效部分提取出并進行抽象表示,再進行向量化處理供給模型訓練[9-11]。目前代碼的特征表示方式可以大致分為文本、序列、圖、抽象語法樹和混合五種,不同的代碼表征方式有其不同的優(yōu)勢[12-13]。

      文獻[14-16]將文本表示和深度學習相結合,從源代碼中提取有效的特征信息,利用詞頻統(tǒng)計方法構建特征向量,采用深度學習對特征向量進行學習和訓練。但普通的詞法分析忽略了代碼的上下文結構,無法確定代碼內的函數(shù)調用關系。

      序列表征是在源代碼基礎上提取字符流相關的標識符、函數(shù)名等關鍵特征信息,同時也包含一定的函數(shù)調用和語句調用等信息。在文獻[17-20]通過序列表征進行漏洞檢測,從函數(shù)調用序列出發(fā),采用深度學習自動獲取序列特征。文獻[18]利用雙向長短期記憶循環(huán)神經網絡構建了一個VulDeePecker漏洞檢測系統(tǒng),文獻[19]在文獻[18]的基礎上添加了控制依賴關系,但對全局特征和局部特征存在一定的學習偏差,文獻[18-19]誤報率都較大。文獻[20]在程序執(zhí)行過程中進行收集函數(shù)調用序列作為特征用來訓練模型,可以更好地挖掘出更多的特征信息。

      抽象語法樹是源代碼抽象語法結構的樹狀表現(xiàn)形式,樹的每個節(jié)點中都包含源代碼的語義和結構信息。文獻[21]在抽象語法樹的基礎上進行項目內的漏洞預測?;诔橄笳Z法樹的檢測可以在節(jié)點上進行標記,可以對漏洞的定位工作有一定的幫助。然而對于多文件之間的函數(shù)調用,抽象語法樹的生成時間和空間復雜度都較高,難以適用于規(guī)模較大的系統(tǒng)。

      基于圖的表征方式可以通過圖結構表示源代碼的語義和詞法,能夠有效保留代碼的上下文結構信息。相比于抽象語法樹的表征方式,圖表征中包含了更多的源代碼內部結構信息。文獻[22]提出獲取Sink函數(shù)調用的代碼子圖,Sink函數(shù)即在源代碼中可能導致漏洞的調用函數(shù),但該檢測僅局限于Sink函數(shù)內部有無漏洞,無法檢測無漏洞文件間的函數(shù)調用導致的漏洞。文獻[23]在代碼屬性圖的基礎上,學習圖的局部和全局信息,利用程序切片技術簡化圖結構。

      該文的漏洞檢測重點關注多個無漏洞文件間因函數(shù)調用和參數(shù)傳遞而導致的漏洞,因此在將JAVA源代碼轉化為程序依賴圖(PDG),保留源代碼的上下文結構關系,提出了一種通過圖節(jié)點信息觀察函數(shù)調用關系、融合多文件的圖特征為PDGcross特征、再進行深度學習的模型訓練和預測的漏洞檢測方法,實現(xiàn)了檢測文件間函數(shù)調用而產生的漏洞。與傳統(tǒng)的漏洞檢測相比,該文的創(chuàng)新點在于更關注文件之間的函數(shù)調用關系,實現(xiàn)檢測因函數(shù)調用和參數(shù)傳遞而導致的該類漏洞的高準確率和低漏報率。

      1 基于PDGcross的源代碼漏洞檢測

      1.1 整體架構

      提出的基于PDGcross特征和LSTM模型的漏洞檢測方法的整體架構如圖1所示。

      圖1 基于PDGcross的源代碼漏洞檢測整體架構

      首先,將源代碼通過開源工具Sourcedg[24]轉為程序依賴圖(PDG);在程序依賴圖的基礎上遍歷圖節(jié)點,判斷代碼中有無跨文件的函數(shù)調用事件,若無則不做處理,若有函數(shù)調用事件則需要確定被調用文件,形成一個代碼群;在當前文件所擁有的代碼群中,通過數(shù)據(jù)流分析和控制流分析,融合被調用文件的節(jié)點,通過節(jié)點間數(shù)據(jù)依賴關系和控制依賴關系添加邊信息,為當前文件形成一個新的PDGcross圖表征,在PDGcross的基礎上利用圖嵌入將圖表征轉為特征矩陣,訓練LSTM模型實現(xiàn)跨文件的漏洞檢測。

      1.2 基于程序依賴圖的特征提取

      在目前的圖表征中,常用的圖表征包含數(shù)據(jù)流圖、控制流圖、程序依賴圖(Program Dependence Graph,PDG)、數(shù)據(jù)依賴圖和數(shù)據(jù)屬性圖等,不同的圖表征結構包含的源代碼信息各有不同。程序依賴圖主要包括控制依賴圖(Control Dependence Graph,CDG)和數(shù)據(jù)依賴圖(Data Dependence Graph,DDG),是源代碼的一種圖形表示,是帶有標簽的有向圖,節(jié)點代表語句,邊表示兩種依賴關系。由于程序依賴圖(PDG)通過在節(jié)點標簽中保留代碼信息,用圖的有向邊保留程序之間的上下文關系,可以更多地保留程序的控制依賴和數(shù)據(jù)依賴關系,因此該文選用了程序依賴圖(PDG)的表征方式。

      在Sourcedg通過JAVA源代碼生成程序依賴圖(PDG)的過程中,為了更好地表達節(jié)點信息,去除冗余信息,保留上下文關系,將程序依賴圖的節(jié)點和邊劃分為多種類型,通過不同類型之間的關系進行圖的繪制,有選擇地保留節(jié)點和邊。Sourcedg生成程序依賴圖的過程中更多地關注于類型為類聲明、實參的傳入傳出、形參的傳入傳出、方法入口和賦值等操作節(jié)點,對于其他類型的節(jié)點則較多的省略。在程序依賴圖的邊中,分為實際控制邊和非實際控制邊,實際控制邊是指上下文中確實存在著控制關系,用實線邊表示;為了更好地表達數(shù)據(jù)流和控制流,PDG中會產生一些與源代碼無關的僅表示圖結構的節(jié)點,在該類節(jié)點的關系中,這類則為非實際控制邊,常用虛線邊表示。

      盡管Sourcedg工具生成的程序依賴圖已經很大程度地保留了原代碼的有價值內容,盡可能通過控制流和數(shù)據(jù)流表達了上下文關系。但當源文件中存在調用其他文件的操作時,在源文件的程序依賴圖中并沒有任何表達,僅將該類調用語句作為一個普通節(jié)點,不考慮調用產生的數(shù)據(jù)流和控制流。對于跨文件的函數(shù)調用,Sourcedg無法發(fā)現(xiàn)文件之間及函數(shù)之間的關系,僅僅依靠PDG的表征方法對多文件的函數(shù)調用產生的漏洞檢測效率低下。

      1.3 基于PDGcross的特征提取

      以圖2所示的代碼為例,源文件A調用BC源文件,ABC源文件在單個檢測時并無漏洞,但由于A調用了BC,導致在參數(shù)傳遞之后在A中形成了一個較為典型的SQL注入漏洞語句。在常見的漏洞檢測方法中,一般在文件粒度上進行檢測,即ABC分別檢測,A中調用語句產生的數(shù)據(jù)流和控制流并不會被過多關注,僅僅是作為普通的語句進行檢測。對于單個文件即造成漏洞的對于ABC該種文件間調用傳參而造成的代碼漏洞則被一定程度上忽略,可能變成漏洞攻擊的薄弱之處。因此,該文的主要研究目的是要捕獲ABC代碼塊之間的調用關系,通過觀察調用關系而產生的數(shù)據(jù)流和控制流進一步進行漏洞檢測。

      圖2 代碼示例

      在PDG的基礎上進行節(jié)點的遍歷,確定當前文件是否調用了其他文件,若有調用,則將被調用文件劃分在當前文件的代碼群中,存放在一個序列中。在構建代碼群時的過程中,用字典的形式來存儲任一單文件內的方法和聲明方法的節(jié)點地址,即字典名{方法名:節(jié)點地址}。在產生調用關系之后,查找被調用文件中該方法的節(jié)點地址,最后存儲為{調用節(jié)點地址:被調用地址}的格式,即為圖融合中需要新增的邊信息。在多文件中反復多次調用某一方法時,并不需要重復多次添加該方法相關節(jié)點,僅需添加相應的邊來表達之間的調用關系。提取PDGcross特征的算法偽代碼如算法1-3所示。

      算法1:PDGcross生成算法

      輸入:輸入樣本的PDG特征集X={X1={nodes={n1,n2,…,nM},edges={e1,e2,…,eN}},…,Xq}

      輸出:輸出樣本的PDGcross特征O={O1={nodes={N1,N2,…,Nk},edges={E1,E2,…,ET}},…,Oq}

      1.union←[] //初始化代碼群列

      2.entryDict←{}//初始化方法字典

      3.dependeOther←{}//初始化依賴關系字典

      4.forx←X1toXqdo//遍歷PDG特征集

      5.list←[]

      6.調用算法2生成entryDict

      7.調用算法3生成list和dependeOther

      8.union.append(list)

      9.end for

      10.for files[]in union do//將屬于同一代碼群中的文件融合

      11.if files[]長度>1 then//說明該文件存在調用關系

      12.for file in files[]do//遍歷文件代碼群

      13.融合該代碼群中的PDG圖節(jié)點和邊

      14.for nodes in dependeOther[file]do//遍歷節(jié)點之間的依賴關系

      15.添加相應的表示控制關系的邊

      16. end for

      17. end for

      18.end if

      19.存為Oi

      20.end for

      21.returnO//輸出結果

      算法2:方法字典生成算法

      輸入:輸入樣本的PDG特征X={nodes={n1,n2,…,nM},edges={e1,e2,…,eN}}

      輸出:輸出方法字典entryOne={{labelMeans1:node1},{labelMeans2:node2},…,{labelMeansM:nodeM}}

      1.entryOne←{}//初始化方法字典

      2.for node←n1tonMdo//遍歷PDG的節(jié)點

      3.labelType←node中的標簽信息

      4.labelMeans←node中的節(jié)點內容//包含方法名

      5.if(labelType的類別==‘Entry’)(labelMeans not in entryOne)then//該節(jié)點為方法節(jié)點且該方法為被加入方法字典

      6. entryOne[labelMeans]←node//鍵值對為(方法名:節(jié)點地址)

      7.end if

      8.end for

      9.entryDict[]=entryOne

      算法3:依賴關系生成算法

      輸入:輸入樣本的PDG特征X={nodes={n1,n2,…,nM},edges={e1,e2,…,eN}}

      輸出:輸出依賴關系字典dependes

      1.dependes←{}//初始化依賴關系字典

      2.list.append(X)//把當前文件添加至代碼群

      3.for node←n1tonMdo//遍歷PDG的節(jié)點

      4.labelType←node中的標簽信息

      5.labelMeans←node中的節(jié)點內容//包含方法名

      6.if labelMeans用正則表達式匹配到調用關系格式 then

      7. filename←被調用文件名

      8. method←被調用文件名

      9. if filename是輸入文件之一 then

      10. if filename not in list then

      11. filename調用算法2和算法3

      12. end if

      13. if filename in entryDict then

      //依賴關系字典當前節(jié)點值列表中添加方法節(jié)點地址

      14. dependes[node].append(entryDict[filename][method])

      15. end if

      16. end if

      17.end if

      18.end for

      19.dependeOther[X]←dependes//賦值

      1.4 特征矩陣

      在圖表征的基礎上,采用了圖嵌入算法將圖表示為低維、實值、稠密的向量形式,以數(shù)值化的方式表達圖中的信息,供給學習模型直接使用。圖嵌入的方法主要分為矩陣分解、隨機游走和深度學習,圖基于隨機游走技術的頂點嵌入經典算法包括DeepWalk、Node2Vec、SDNE等,該文則選取了其中的Node2Vec算法。Node2Vec算法在DeepWalk的基礎上改進了隨機游走的生成方式,采用有偏的隨機游走方式獲取頂點的近鄰序列,使得生成的隨機游走可以反映深度優(yōu)先和廣度優(yōu)先兩種采樣的特性,再利用word2vec去學習頂點的embedding向量,最后得到45*64的特征矩陣。

      1.5 模型訓練

      在PDGcross特征的基礎上通過Node2Vec圖嵌入得到特征矩陣后,按照文件是否含有漏洞為該文件對應的特征矩陣添加相應的標簽,1為有漏洞,0為無漏洞,利用長短時記憶神經網絡(LSTM)在含有標簽的數(shù)據(jù)集上訓練出分類模型,進行漏洞類別的預測。

      在實驗中,首先以CWE89類漏洞進行模型訓練。模型的訓練集負樣本選擇Juliet數(shù)據(jù)集CWE89類別中單文件即構成漏洞的數(shù)據(jù)集,包含352個樣例;正樣本隨機選擇benchmark數(shù)據(jù)集中無漏洞的350個樣例。有漏洞文件的特征矩陣標簽為1,無漏洞的則為0,數(shù)據(jù)集的90%劃分為訓練集,10%劃分為測試集?;贚STM神經網絡,通過批標準化進行歸一化處理,利用自適應調整學習率,快速又精確地獲得最優(yōu)模型。最終模型的學習效果十分不錯,在測試集上的精確率和召回率都有很好的表現(xiàn),最優(yōu)時可以達到100%的準確率,從另一方面也可以證明圖表征在模型檢測方面有較好的效果。

      2 實驗結果與分析

      為了驗證所提特征提取的有效性,將其與原PDG圖表征及現(xiàn)有的開源工具檢測的結果進行對比實驗。選用的數(shù)據(jù)集來自于NIST參考數(shù)據(jù)集SARD中的Juliet測試數(shù)據(jù)集JAVA語言版和OWASP組織下的OWASP Benchmark項目中的數(shù)據(jù)集。Juliet數(shù)據(jù)集包含了上百種CWE相關漏洞代碼,Benchmark數(shù)據(jù)集包含了11類漏洞和無漏洞數(shù)據(jù),該文選取了Juliet數(shù)據(jù)集中的三個子集與Benchmark數(shù)據(jù)集作為實驗數(shù)據(jù)來源。

      2.1 數(shù)據(jù)集

      實驗中選取了Juliet數(shù)據(jù)集中的CWE 15(External_Control_of_System_or_Configuration_Setting)、CWE 89(SQL_Injection)、CWE 90(LDAP_Injection)三類漏洞代碼,見表1,benchmark數(shù)據(jù)集中無漏洞文件隨機選取680個。

      在Juliet數(shù)據(jù)集中,名為“****a.java”與“****b.java”的文件劃分為一組,通過入口文件調用其他文件后組合產生一個漏洞,具有一個漏洞標簽,稱這樣的一組為一個多文件樣例。在Juliet數(shù)據(jù)集的一個多文件樣例中,名為“****a.java”的文件為該組樣例的入口,稱其為該組樣例的入口文件。

      將Juliet多文件樣例的入口文件又細分為AGS和G2BS兩類,AGS類為整組樣例中每單個文件并無漏洞,但因調用關系后產生漏洞,G2BS類為入口文件無漏洞但被調用文件有漏洞。實驗重點關注于AGS類數(shù)據(jù)集的漏洞檢測,針對G2BS類的數(shù)據(jù)可以作為安全風險提示。以CWE89的多文件樣例為例,數(shù)據(jù)分布如表2所示。

      表2 多文件樣例構成

      在人工檢驗后可以認證該類多文件樣例確實包含相應的漏洞,然而在使用第三方檢測工具Fortify和CodeSec掃描后,發(fā)現(xiàn)該類代碼在檢測工具中進行掃描時未發(fā)現(xiàn)該類漏洞,因此認為進行跨文件的漏洞檢測十分具有必要性。

      2.2 評價指標

      在實驗中,選取了precision、recall和F1值作為結果的衡量指標。precision為精確率,表示正確預測漏洞種類的樣本數(shù)占全部預測為該類漏洞的樣本數(shù)的比例;recall為召回率,表示正確預測漏洞種類的樣本數(shù)占實際為該類漏洞的樣本數(shù)的比例;F1值為和的調和平均數(shù)。

      (1)

      (2)

      (3)

      其中,TP表示預測為某類漏洞且分類準確的樣本數(shù)量,FP為預測為某類漏洞但實際可能不存在漏洞或為其他漏洞的樣本數(shù)量,FN為實際為某類漏洞但未被正確檢測的樣本數(shù)量。

      2.3 實驗結果

      首先選取CWE89漏洞數(shù)據(jù)與benchmark無漏洞數(shù)據(jù)訓練二分類模型,在訓練得到CWE89漏洞的二分類模型后,抽取CWE89數(shù)據(jù)集中多文件樣例的119組AGS類樣例的入口文件和92組G2BS類樣例的入口文件及單文件樣例作為測試集進行漏洞分類。在實驗中,特征提取階段分別使用Fortify檢測工具與PDG和PDGcross表征進行對比,檢測結果如表3所示。

      表3 模型檢測結果

      由實驗可知,Fortify和PDG特征目前僅在單文件漏洞方面有不錯的效果,但在多文件產生組合漏洞的樣例檢測中漏報率較高。而所提出的特征不論是在檢測單文件漏洞、無漏洞文件因調用而產生漏洞(AGS類)的情況還是警告某一無漏洞文件調用有漏洞文件(G2BS類)的風險時都有較為不錯的效果。因此在實驗中進一步添加了CWE15和CWE90兩類漏洞,訓練了一個四分類模型,進行多文件樣的檢測,取得了91%的精確率和90%的召回率,優(yōu)于現(xiàn)有的開源工具檢測方法,結果如表4所示。

      表4 四分類模型檢測結果

      3 結束語

      聚焦于多文件間調用產生的漏洞檢測,確定了被調用的文件范圍,利用圖表征技術中的程序依賴圖實現(xiàn)了多文件的融合。采用LSTM神經網絡,利用批標準化進行歸一化處理,學習且訓練出相應的漏洞分類模型。實驗在CWE15、CWE89、CWE90這三種漏洞的小規(guī)模數(shù)據(jù)集上取得了91%的精確率和90%的召回率,在檢測多文件調用漏洞方面更是優(yōu)于CodeSec和Fortify等工具。但是目前漏洞檢測工作是針對于文件粒度,缺少函數(shù)粒度的標簽,無法更進一步的確定漏洞范圍,因此下一步的工作是將代碼粒度細化,減少特征中的冗余信息,做到一定程度的漏洞定位。

      猜你喜歡
      函數(shù)調用樣例源代碼
      人工智能下復雜軟件源代碼缺陷精準校正
      計算機仿真(2023年8期)2023-09-20 11:23:42
      樣例復雜度與學習形式對不同數(shù)量樣例學習的影響
      樣例呈現(xiàn)方式對概念訓練類別表征的影響
      心理學探新(2022年1期)2022-06-07 09:15:40
      基于C語言的數(shù)學菜單的設計與實現(xiàn)
      基于TXL的源代碼插樁技術研究
      “樣例教學”在小學高年級數(shù)學中的應用
      軟件源代碼非公知性司法鑒定方法探析
      基于函數(shù)調用序列模式和函數(shù)調用圖的程序缺陷檢測方法*
      探討C++編程中避免代碼冗余的技巧
      Unity3D項目腳本優(yōu)化分析與研究
      中國新通信(2017年1期)2017-03-08 03:12:21
      宁德市| 湘乡市| 遵化市| 明溪县| 湘乡市| 深水埗区| 玉溪市| 临江市| 岳普湖县| 嵊州市| 隆昌县| 乌苏市| 文昌市| 宜黄县| 乌苏市| 陵川县| 天津市| 洛宁县| 基隆市| 社会| 威海市| 苏尼特右旗| 陈巴尔虎旗| 万源市| 望江县| 沭阳县| 葵青区| 陇西县| 治多县| 海口市| 古交市| 宁强县| 靖宇县| 慈利县| 莱州市| 华坪县| 南开区| 铜川市| 大同市| 上栗县| 凤城市|