論文筆記-基於程式碼屬性圖和Bi-GRU的軟體脆弱性檢測方法
阿新 • • 發佈:2021-11-22
一.摘要
提出了一種基於程式碼屬性圖和Bi-GRU
的軟體脆弱性檢測方法。該方法通過從函式的程式碼屬性圖中提取出抽象語法樹序列、控制流圖序列作為函式表徵的表徵方式,減少程式碼表徵過程中的資訊的損失,並通過選取Bi-GRU
來構建特徵提取模型,提高對脆弱性程式碼的特徵提取能力。實驗結果表明,與以抽象語法樹為表徵方式的方法相比,該方法最大可提高35%
的精確率和22%
的召回率,可改善面向多個軟體原始碼混合的真實資料集的脆弱性檢測效果,有效降低誤報率和漏報率。
二.本文貢獻
- 提出了一種基於程式碼屬性圖的軟體脆弱性智慧檢測方法(vulnerability detection based on code property graph,VDCPG),該方法基於程式碼屬性圖對原始碼進行表徵,並根據在
LibTIFF
Bi-GRU
的特徵提取模型對錶徵向量進行特徵提取,降低了不同專案編碼風格差異對脆弱性檢測效果的影響。 - 提出了一種基於程式碼屬性圖的表徵方式,利用從函 數的程式碼屬性圖中提取的抽象語法樹序列和控制流圖序列對函式進行表徵,以減少程式碼表徵過程中的語法和語義資訊的損失,提高表徵能力。
- 在特徵提取階段,基於
Bi-GRU
和Bi-LSTM
(bi-directional long short-term memory)構建多個提取模型。通過實驗發現,與基於Bi-LSTM
構建的特徵提取模型相比,利用Bi-GRU
構建的特徵提取模型最大可提高10%
的精確率和6%
的召回率。
三.整體架構
本方法通過3個步驟對待測軟體進行脆弱性檢測:
- 程式碼表徵階段。利用
Joern
根據從原始碼中生成程式碼屬性圖,並提取程式碼屬性圖中的資訊作為函式的表徵。 - 特徵提取階段。利用基於
Bi-GRU
的特徵提取模型提取函式表徵中的脆弱性特徵,獲得函式的特徵向量。 - 脆弱性檢測階段。利用隨機森林模型學習函式特徵向量中的脆弱性特徵,以此進行脆弱性檢測。
四.程式碼表徵
原始碼示例:
int fun1(int x) { int y = test2(x); for(int i = 0, i < 5, i++) { if (i == 3) { printf(i); return y; } } return (x + y); }
-
通過
Joern
工具生成程式碼屬性圖,並存儲為Json
格式(fun1
函式的程式碼屬性圖的Json
表示)。 -
從程式碼屬性圖中提取抽象語法樹
(AST)
序列以及控制流圖(CFG)
序列,替換程式碼中的所有字串為"str"
。 -
將控制流序列和抽象語法樹序列合併得到文字型向量(稱為
ACS
,abstract syntax tree and control flow graph sequence),可唯一標識fun1
函式。#抽象語法樹序列: [METHOD, fun1, PARAM, int, x, ...] #控制流圖序列: [METHOD, fun1, test2, test2(x), <operator>.assignment, y, =, test2, (, x, ), ...] #文字型向量ACS ACS = [METHOD, fun1, PARAM, int, x, ...] + [METHOD, fun1, test2, test2(x), <operator>.assignment, y, =, test2, (, x, ), ...]
-
通過
keras
分詞器Tokenizer
將ACS(METHOD, fun1, PARAM, int, x, ...)轉為數值型向量(1,2,25,...)
,並統一向量長度(長度大於L,向量末端進行截斷;長度小於L,向量末端用0來填充)。 -
利用所有函式的文字型向量組成的語料庫對
Word2vec
模型進行訓練,得到對映集。利用對映集將向量中的每個元素轉換為N維詞向量,當元素沒有對應的詞向量時,使用全零的N維向量作為當前元素的詞向量。
五.特徵提取和脆弱性檢測
分別使用BIGRU
和隨機森林
進行特徵提取和脆弱性檢測。