VulDeePecker: A Deep Learning-Based System for Vulnerability Detection 分析實踐
論文內容分析
1. 論文目的
現存的漏洞檢測系統(截止到論文發表前)有兩個缺點,一是高度依賴專家知識,二是存在較高的假負樣本率(false negative rates )。為了解決這兩個痛點,本文嘗試使用深度學習來構建一個直接面向程序源碼的自動漏洞檢測系統(很自然的想法,關鍵在於如何建立起這個工程)。
2. 系統建立需要解決的問題
- 如何轉化程序源碼為神經網絡的輸入
- 適合的學習粒度的大小(code gadget)
- 網絡的選擇(雙向lstm)
3. 系統設計
VulDeePecker總覽:
將訓練集源碼轉化為code gadget代碼集合,然后標記樣本,將樣本轉化為可處理的特征向量,輸入特征向量到BLSTM網絡(fine-tune)中,得到模型參數后對測試集進行測試,判斷程序是否存在漏洞。
具體流程
1. 生成code gadget
code gadget:基於啟發式方法構建的代碼語句集合,代碼語句間存在一定的語義聯系(數據流或控制流上的聯系);
啟發式方法:本文用程序的一些關鍵的元素(key point),如API調用,數組變量,指針變量等表征程序是否存在漏洞。比如有的漏洞是因為系統api調用,那么key point就是該api,通過把同該key point具有聯系的代碼語句組合起來形成相應的code gadget;
2. 標注樣本
根據NVD和SARD漏洞庫進行樣本標注:
3. 將code gadgets編碼為固定長向量
先轉化為符號表示,然后在利用句法分析建立詞表,再用word2vec模型進行向量編碼。
4. 模型訓練
將向量輸入blstm網絡,進行模型訓練,得到訓練參數,用於測試
4. 實驗結果
1. 數據集與評估標准
數據集是作者團隊開發的一個數據集CGD(cwe339,cwe119,兩類漏洞,緩沖區溢出和資源管理漏洞),具體見https://github.com/CGCL-codes/VulDeePecker ;
metrics:假負樣本率,假正樣本率,F值,精確度等。
數據集分為了六個子集用於不同的測試目的:
2. 實驗結果
結論:系統可以識別多種漏洞,但具有數據依賴性 ;
結論:先驗知識介入可以增加系統能力 ;
結論:系統相對於現有(2018)的一些靜態檢測方法具有顯而易見的優勢 ;
5. 討論:創新,貢獻,不足
創新與貢獻:
- 首次在漏洞檢測上引入深度學習的方法,並且解決了一些存在問題。
- 討論了一些適用深度學習的面向程序源碼的向量編碼原則。
- 在實際應用中證明了該深度學習系統一定的有效性 (檢測出了幾個實際應用中存在的漏洞)
- 給出了一個可用的數據集
不足
- 非端到端方法
- 向量編碼時使用啟發式方法
- 僅面向C/C++源碼,且用例漏洞類型太少
- 不是每個軟件都開源
論文復現
該論文官方並沒有放出源碼,但在github上還是有一份他人的復現代碼 ,我這就直接拿來用了。值得強調的是,復現的難點不在於模型,而是在於之前的一些預處理工作,所謂的dirty work。說實話,如果面對的是寫的瑣碎但卻細節模糊而且還不放源碼的論文,復現的難度太大而且沒啥意義。
這個復現代碼也存在幾個坑,都在blstm.py中,
一個是在建立特征向量的時候,轉換了label和feature;這個重寫一下就行。
另一個是關於樣本類別權重平衡的問題,這個就是tf的鍋了,tf的版本迭代的兼容性確實讓人頭疼。不嫌麻煩的可以根據調試信息改下相應的源碼,或者用pytorch重寫一個。或者簡單點直接把關於樣本類別權重平衡的代碼注釋掉就行了,像本文數據集這樣的樣本分布,其實也沒多偏,影響不了多少精度。事實上,關於樣本分布和取樣的問題到現在還是一個基礎問題,需要做的突破還有很多的。
復現結果:
cwe339:
cwe119: