借鑒計算機視覺領域中的目標檢測過程,將深度學習用于漏洞檢測領域,主要存在以下三方面挑戰:一是目標檢測能夠很自然地利用圖像中的紋理、邊緣和顏色等信息定義候選區域,漏洞檢測則沒有明顯的細粒度代碼結構來描述漏洞的候選區域;二是目標檢測擁有海量的人工標注類別的圖像數據集,但目前沒有標注好的涵蓋各種類型漏洞的大規模數據集,且人工標注漏洞的難度遠比標注圖像大得多;三是目標檢測采用適合圖像處理的卷積神經網絡(CNN)模型來學習特征,然而程序源代碼與圖像不同,更關注語句上下文信息,且漏洞源代碼數據具有自身的特點。 為了解決上述問題,本文開展了基于深度學習的漏洞檢測研究。 該方法具有很大潛力,因為深度學習不需要人類專家定義特征,但同時也具有挑戰,因為深度學習不是為漏洞檢測這種應用而產生的。
基于邏輯推理的漏洞檢測方法將源代碼進行形式化描述,然后利用數學推理、證明等方法驗證形式化描述的一些性質,從而判斷程序是否含有某種類型的漏洞。 基于邏輯推理的漏洞檢測方法由于以數學推理為基礎,因此分析嚴格,結果可靠。 但對于較大規模的程序,將代碼進行形式化表示本身是一件非常困難的事情。 基于中間表示的漏洞檢測方法沒有上述局限性,適用于分析較大規模程序,因此得到了更為廣泛的應用。 本文針對基于中間表示的源代碼漏洞檢測方法開展研究。 依據對中間表示的分析技術,漏洞檢測方法可以分為4類:基于代碼相似性的漏洞檢測、基于符號執行的漏洞檢測、基于規則的漏洞檢測以及基于機器學習的漏洞檢測。
應用于漏洞檢測的機器學習技術目前主要涉及前兩種,下面按照是否需要人類專家定義特征分為基于傳統機器學習方法和基于深度學習方法兩類,并分別對其進行介紹。 傳統的機器學習方法通過人工定義特征屬性,然后采用機器學習方法,如支持向量機、k近鄰等進行分類。 基于傳統機器學習的漏洞檢測方法包括兩類:針對特定漏洞類型的方法和漏洞類型無關的方法。 針對特定漏洞類型的方法前提是借助專家知識(如漏洞原理)將漏洞分為不同類型,而某種類型的漏洞,通過機器學習技術學習漏洞模式。