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