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