国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于自然語言處理的漏洞檢測方法綜述

2022-12-15 13:18愷,3
計算機研究與發(fā)展 2022年12期
關(guān)鍵詞:漏洞代碼文檔

楊 伊 李 瀅 陳 愷,3

1(信息安全國家重點實驗室(中國科學(xué)院信息工程研究所) 北京 100093)2(中國科學(xué)院大學(xué)網(wǎng)絡(luò)空間安全學(xué)院 北京 100049)3(北京智源人工智能研究院 北京 100084)(yangyi@iie.ac.cn)

截至2021年5月,CVE(common vulnerability and exposures)上收錄的漏洞數(shù)量已達(dá)到154 504個,如圖1所示.近10年來,漏洞數(shù)量呈現(xiàn)指數(shù)增長態(tài)勢.據(jù)2021年CVE漏洞趨勢安全分析報告顯示[1],2020年漏洞數(shù)量是2010年漏洞數(shù)量的5倍之多.當(dāng)前漏洞類型占比最大的5類分別是代碼執(zhí)行(code execution)、拒絕服務(wù)(denial of services, DoS)、溢出(overflow)、跨站腳本攻擊(cross-site scripting, XSS)以及信息獲取(gain information)[2].報告顯示[1],漏洞“CVE-2018-1303”已影響資產(chǎn)數(shù)量達(dá)到459萬臺,成為目前影響最廣的一個漏洞.因此,漏洞檢測成為當(dāng)前一大熱門研究領(lǐng)域.

Fig. 1 The numbers of vulnerabilities between 2010 and 2021圖1 2010-2021年漏洞數(shù)目

隨著自然語言處理(natural language processing, NLP)技術(shù)的發(fā)展,研究人員發(fā)現(xiàn)利用這一技術(shù)處理分析文本內(nèi)容或代碼能夠輔助進行漏洞檢測研究.傳統(tǒng)漏洞檢測方法大多是基于對代碼的分析,而NLP技術(shù)以分析處理自然語言為主.基于這一前提,通過對當(dāng)前基于NLP技術(shù)實現(xiàn)漏洞檢測的研究工作按照數(shù)據(jù)類型的不同進行分類,可分為官方文檔、代碼、代碼注釋以及漏洞相關(guān)信息4部分研究內(nèi)容.

以文本為基礎(chǔ)的漏洞檢測研究工作可按照數(shù)據(jù)源的不同劃分為基于官方文檔[3]、代碼注釋[4]以及漏洞相關(guān)信息[5-6]的漏洞檢測研究.有研究表明[7],使用開源軟件時存在不遵守使用規(guī)范會出現(xiàn)安全問題.例如,setuid函數(shù)通常暫時性擁有最高權(quán)限,當(dāng)任務(wù)完成時,該函數(shù)權(quán)限應(yīng)該被釋放,而這一操作需要通過在程序中檢查返回值.libstdc庫文檔中針對這一函數(shù)進行了強調(diào)“It is a grave security error to omit to check for a failure return from setuid().”通過對文檔進行分析,提取文檔強調(diào)的操作限制,我們發(fā)現(xiàn)PulseAudio 0.9.8并沒有依照文檔的說明進行檢查返回值操作,從而導(dǎo)致本地權(quán)限逃逸漏洞CVE-2008-0008.這一漏洞出現(xiàn)的原因是開發(fā)人員沒有遵守文檔中強調(diào)的安全相關(guān)操作導(dǎo)致的.

以代碼為基礎(chǔ)的漏洞檢測研究主要為借鑒NLP技術(shù)思想輔助進行漏洞檢測研究.由于NLP技術(shù)的初期以處理文本內(nèi)容為主,在處理代碼時,通常將代碼視為一種特殊的文本[8],需要將NLP技術(shù)中的模型或方法加以修改,才能為漏洞檢測所用.

本文對從4類數(shù)據(jù)出發(fā),對利用NLP技術(shù)進行漏洞檢測的研究進行了詳細(xì)的成果闡述與討論.通過對2005-2021年期間在信息安全高水平會議USENIX Security,IEEE S&P,ACM CCS,NDSS以及頂級軟件工程期刊會議的相關(guān)文獻(xiàn)進行梳理,總結(jié)并歸納了基于NLP的漏洞檢測研究成果,針對當(dāng)前研究中出現(xiàn)的問題進行梳理,并對未來研究方向進行了討論與展望.

本文工作的主要貢獻(xiàn)有3個方面:

1) 廣泛收集并調(diào)研了基于NLP的漏洞檢測研究領(lǐng)域的現(xiàn)有相關(guān)文獻(xiàn),并對該領(lǐng)域成果進行了梳理.

2) 從不同數(shù)據(jù)源出發(fā),對基于NLP的漏洞檢測各研究成果進行橫向?qū)Ρ?并分析各成果局限性.

3) 分析當(dāng)前基于NLP的漏洞檢測研究存在的問題,并討論未來研究方向.

1 相關(guān)工作

1.1 自然語言處理(NLP)技術(shù)

在利用NLP技術(shù)輔助漏洞檢測研究的時候,通常是NLP解析器使用標(biāo)準(zhǔn)NLP技術(shù)對預(yù)處理文本中的每一條語句進行分解,依次利用依存句法解析、詞嵌入、命名實體識別、詞性標(biāo)注、語義消歧等操作對語句進行處理,每一步操作解釋如下:

依存句法解析(dependency parser)[9]主要是通過分析單詞等語言單位之間的語法關(guān)系來揭示句子的句法結(jié)構(gòu),包括主謂關(guān)系、動賓關(guān)系[10]等.依存句法解析的結(jié)果通常表示為有根解析樹[11].在樹結(jié)構(gòu)中,以動詞為中心,所有其他的詞匯與動詞直接或者間接相連,即對動詞起到直接或者間接的修飾作用.

詞嵌入(word embedding)[12]是一種語言建模和特征學(xué)習(xí)的技術(shù)[13],可以將文本(單詞或短語)從詞匯表映射到實數(shù)的高維向量,把一個維數(shù)為所有詞的數(shù)量的高維空間映射到一個低維度連續(xù)向量空間中,從而消除維數(shù)災(zāi)難的問題[14],每個單詞或詞組被映射為實數(shù)域上的向量.

命名實體識別(named entity recognition)[15]指的是識別文本中具有特定意義的實體以及可以用名稱標(biāo)識的事物,主要包括人名、地名、機構(gòu)名以及專有名詞等.在計算機領(lǐng)域,一系列的單詞或短語是具有特定含義的,如“Google maps”“Twitter”等表示應(yīng)用名稱的詞語,而使用語法、句法解析這些短語是不必要的,所以通過命名實體識別操作能夠進一步輔助文本分析.

詞性標(biāo)注(part-of-speech tagging, POS)[16]是基于上下文將文本中的單詞標(biāo)記為對應(yīng)于特定詞性如名詞、動詞、形容詞等的過程.

詞義消歧(word sense disambiguation, WSD)[17]是NLP中的核心與難點.在詞義、句義、篇章含義層次都會出現(xiàn)語言根據(jù)不同上下文產(chǎn)生不同語義的現(xiàn)象,消歧即指根據(jù)上下文確定對象語義的過程[18].

以上各步驟構(gòu)成了NLP的預(yù)訓(xùn)練內(nèi)容.而當(dāng)前預(yù)訓(xùn)練模型被劃分為詞嵌入模型如Word2Vec,GloVe,ELMo和多用途的NLP模型如Transformer和BERT.詞嵌入模型Word2Vec[19]通過隨機值初始化詞表示[20],并通過應(yīng)用連續(xù)詞袋或跳過詞將詞上下文的聯(lián)合概率分布用作其輸入模型[21];然后在神經(jīng)網(wǎng)絡(luò)的訓(xùn)練過程中利用這種分布,其中單詞向量會不斷更新以使聯(lián)合概率最大化.訓(xùn)練的結(jié)果確保相關(guān)詞被賦予其相似上下文的近似向量,不相關(guān)的詞被映射到不同的向量中,而詞與詞之間的語義差異通常通過向量之間的余弦距離進行測量[22].2014年,Pennington等人[23]提出了GloVe模型,將語料庫的全局統(tǒng)計和局部的上下文特征結(jié)合.2018年,Peters等人[24]提出了ELMo模型,解決了Word2Vec模型和GloVe模型無法解決的多義詞的情況.將一句話或一段話輸入模型后,ELMo模型能夠依據(jù)上下文推斷每個詞對應(yīng)的詞向量,能夠很好的完成詞義消歧任務(wù).

注意力機制(attention mechanism)最早被用來解決圖像識別領(lǐng)域的技術(shù)問題.2014年,在Google Mind[25]團隊利用注意力機制進行圖像分類后逐漸進入其他領(lǐng)域.同年,Bahdanau等人[26]將注意力機制引入機器翻譯任務(wù)中.NLP領(lǐng)域使用較廣的預(yù)訓(xùn)練模型Transformer[27]的核心就是注意力機制.該模型完全依靠注意力機制繪制輸入和輸出之間的全局依賴關(guān)系,其本質(zhì)上是一種Encoder-Decoder的結(jié)構(gòu),以3種不同的方式使用多頭注意力機制.在Transformer模型的基礎(chǔ)上,Google研究人員于2018年提出了一種基于Transformer模型Encoder結(jié)構(gòu)的模型BERT[28].該模型的預(yù)訓(xùn)練部分與Word2Vec和ELMo相似.由于計算機無法直接識別文本,需要對文本進行編碼.詞向量模型提取詞的語義特征,向量之間的距離代表其語義相似性,BERT預(yù)訓(xùn)練模型可以使一個詞在不同的語境下生成不同的詞向量[29],為文本分類和詞性標(biāo)注等后續(xù)下游任務(wù)提供支持.

1.2 漏洞檢測與分析

漏洞是網(wǎng)絡(luò)和安全的根源,是信息系統(tǒng)的硬件、軟件、操作系統(tǒng)、網(wǎng)絡(luò)協(xié)議、數(shù)據(jù)庫等在設(shè)計上、實現(xiàn)上出現(xiàn)的可以被攻擊者利用的錯誤、缺陷和疏漏[30].漏洞攻擊通常包含漏洞發(fā)現(xiàn)、漏洞分析和漏洞利用這3個步驟.而漏洞檢測指的是對信息系統(tǒng)所用軟硬件進行研究,找出存在的可能威脅信息系統(tǒng)安全的薄弱環(huán)節(jié).目前常見的漏洞檢測技術(shù)包括靜態(tài)和動態(tài)2類方法.靜態(tài)檢測技術(shù)指的是在不執(zhí)行應(yīng)用程序源代碼的情況下[31],從語法和語義上理解程序的行為,直接分析被檢測程序的特征,尋找可能導(dǎo)致錯誤的異常,包括潛在的安全違規(guī)、運行時錯誤以及邏輯不一致[32]等情況.基于源代碼的靜態(tài)分析方法主要有數(shù)據(jù)流分析、抽象解釋和符號分析3種方法[33].

Gosain等人[34]分析了主流的靜態(tài)分析技術(shù)和工具,并按照靜態(tài)分析工具的功能對其進行了分類,分為靜態(tài)檢查、漏洞發(fā)現(xiàn)、軟件驗證以及類型限定符推理4類.其中靜態(tài)檢查即為查找普通的編程錯誤,包括可疑賦值、未使用的變量、無法訪問的代碼等;漏洞發(fā)現(xiàn)表示發(fā)現(xiàn)安全編碼引起的缺陷(例如緩沖區(qū)溢出)、導(dǎo)致程序崩潰的缺陷(例如空指針引用)、不正確的程序行為(例如未初始化變量)等;軟件驗證即通過靜態(tài)分析進一步證明程序是否符合規(guī)范;屬性推斷則是捕獲類型限定符之間的關(guān)系.結(jié)合當(dāng)前研究成果的分析,我們對當(dāng)前的靜態(tài)分析工具進行歸類梳理,如表1所示:

Table 1 Comparison of Static Analysis Tools表1 靜態(tài)分析工具對比

數(shù)據(jù)流分析的目的是分析變量沿著程序執(zhí)行路徑的流動過程[52],即獲取有關(guān)程序運行時行為的信息的過程,不會使用語義運算符[53].在基于數(shù)據(jù)流的源代碼漏洞分析中,通常包含代碼建模、程序代碼模型、根據(jù)規(guī)則進行漏洞分析以及檢測結(jié)果的分析.在數(shù)據(jù)流分析時,根據(jù)程序路徑的分析精度分為流不敏感分析、流敏感分析和路徑敏感分析;根據(jù)程序路徑的深度進行分類時,分為過程內(nèi)分析(只考慮函數(shù)內(nèi)的代碼進行分析)和過程間分析(考慮函數(shù)之間的數(shù)據(jù)流).而在一般情況下,程序漏洞的特征恰好可以表現(xiàn)為特定程序變量在特定的程序點上的性質(zhì)、狀態(tài)、或者取值不滿足程序安全的規(guī)定,所以應(yīng)用數(shù)據(jù)流分析恰好可以檢測這些漏洞[53].

抽象解釋是一種數(shù)學(xué)結(jié)構(gòu)的近似理論,它涉及語義模型的數(shù)學(xué)結(jié)構(gòu)[54],是對計算機程序的部分進行執(zhí)行,然后獲取關(guān)于它的語義信息的理論,其目的是找出程序在運行時的語義錯誤,比如除以0或者變量溢出.而抽象解釋在計算資源上可能比較昂貴,所以必須選擇適當(dāng)?shù)闹涤蚝瓦m當(dāng)?shù)膯l(fā)式循環(huán)終止來確??尚行?抽象解釋的優(yōu)點在于具有良好的擴展性[55],可以對許多有價值的屬性構(gòu)造格,其缺點在于只能針對簡單的屬性,如“狀態(tài)”“值”以及對時序性質(zhì)支持較弱.

符號分析指的是使用符號值而不是實際數(shù)據(jù)作為輸入,將實際變量的值表示為符號表達(dá)式,得到每個路徑抽象的輸出結(jié)果[56].

總的來說,靜態(tài)檢測有以下特點:不局限于特定的代碼執(zhí)行路徑,能夠?qū)崿F(xiàn)程序的全面分析,并且由于靜態(tài)分析不需要運行源代碼,可以在程序代碼執(zhí)行前驗證其安全性.目前常見的靜態(tài)分析工具如表1所示,其他常用的靜態(tài)分析工具還包括Dex2jar[57],IDA[58],GDA[59],Jeb[60]等.

模糊測試(fuzzing)是一種半自動化動態(tài)漏洞檢測的方法.其本質(zhì)是向程序中插入異常的、隨機的輸入來觸發(fā)程序中不可預(yù)見的代碼執(zhí)行路徑或漏洞.Manès等人[61]調(diào)研了當(dāng)前Fuzzer的相關(guān)文獻(xiàn)以及成果創(chuàng)新,對列舉的模糊測試工具進行了全面的功能概述和比較.然而,綜述中欠缺了對未來模糊測試工具研究方向的思考.模糊測試的方法通常根據(jù)目的分為2種類型:基于路徑覆蓋率的模糊測試方法(coverage-based fuzzing)和導(dǎo)向型模糊測試方法(directed fuzzing)[62].

基于覆蓋率的模糊測試方法是發(fā)現(xiàn)漏洞、錯誤或者崩潰最有效的技術(shù)之一[63].它的目的在于生成輸入以遍歷應(yīng)用程序的不同路徑,從而在一些路徑上觸發(fā)錯誤[64-69],即最大化覆蓋路徑從而觸發(fā)可能包含錯誤的路徑.當(dāng)前主流基于路徑覆蓋率的漏洞檢測工具包括AFL[64],libFuzzer[65],honggfuzz[66],AFLFast[67],VUzzer[68],CollAFL[69]等.

導(dǎo)向型模糊測試指的是在潛在漏洞位置已知的情況下,尋找可以觸發(fā)漏洞的PoC(proof of concept),即有針對性地生成一組輸入[70].目前常見的導(dǎo)向型模糊測試方法包括AFLGo[71],SemFuzz[5],Hawkeye[72]等.

2 基于NLP技術(shù)的漏洞檢測研究

隨著NLP技術(shù)的發(fā)展,提供豐富知識的文本信息,例如,官方文檔、技術(shù)博客、論壇以及代碼注釋等能夠被用來進行漏洞檢測的文本信息.除此之外,代碼也成為利用NLP技術(shù)進行漏洞檢測的主流數(shù)據(jù)源之一.這些信息為開發(fā)人員提供了額外的知識,從一定程度上填補了開發(fā)人員的知識空白.通過對文獻(xiàn)的調(diào)研,分別從官方文檔、代碼、代碼注釋以及漏洞相關(guān)信息4部分內(nèi)容出發(fā),總結(jié)利用NLP技術(shù)從文本和代碼等信息中提取相關(guān)知識,從而實現(xiàn)漏洞檢測的相關(guān)研究成果并對其進行討論與分析.基于各類數(shù)據(jù)源的文獻(xiàn)數(shù)量占比如圖2所示.

我們將當(dāng)前各部分基于NLP的漏洞檢測研究按照時間順序進行了整理,如圖3所示.從圖3可以看出,研究初期主要是針對不同類型文本數(shù)據(jù)進行漏洞檢測研究探索,后期在利用NLP技術(shù)廣泛拓展文本數(shù)據(jù)的基礎(chǔ)上,提出利用NLP技術(shù)思想對代碼進行漏洞檢測的探索研究工作.

Fig. 2 The percentage of quantities of literatures based on vulnerability detection type圖2 各類漏洞檢測研究文獻(xiàn)數(shù)量占比

Fig. 3 The development of the vulnerability detection researches based on NLP圖3 基于NLP的漏洞檢測研究發(fā)展歷程

2.1 基于官方文檔的漏洞檢測研究

應(yīng)用程序或源代碼中的漏洞發(fā)現(xiàn)通常依賴于程序分析,而直接利用程序分析或軟件測試技術(shù)檢測漏洞存在一定的局限性:1)通過人工分析一系列的代碼來推斷正確的函數(shù)調(diào)用規(guī)則.這一過程需要大量專家知識輔助完成,主觀性較強,會引入大量的誤報[73].2)代碼集的覆蓋范圍可能導(dǎo)致遺漏許多漏洞,產(chǎn)生漏報.

軟件開發(fā)過程中,開發(fā)人員通常需要閱讀官方文檔來合理使用文檔中的應(yīng)用程序接口(application programming interface, API)或函數(shù)(function),從而實現(xiàn)軟件的開發(fā)任務(wù).文檔通常描述了函數(shù)或API的使用限制及格式.然而,文檔撰寫人員和開發(fā)人員之間存在一種信息不對稱:當(dāng)開發(fā)人員錯誤理解文檔內(nèi)容或錯誤使用了API時,將產(chǎn)生API誤用錯誤,這一錯誤可能會在特定情況下引發(fā)多種漏洞,包括內(nèi)存泄漏和拒絕服務(wù)等,從而導(dǎo)致程序的崩潰.因此,針對這一類漏洞的檢測研究顯得極為重要.這一部分研究包括利用NLP技術(shù)對文檔進行信息提取和分析檢測文檔中的錯誤以及代碼中的漏洞.

因此近年來,有不少利用NLP技術(shù)對官方文檔進行分析,從而實現(xiàn)漏洞檢測或者輔助漏洞檢測的研究,包括檢查文檔聲明與實現(xiàn)的不一致性、以及文檔中的邏輯缺陷等.Zhong等人[74]提出了Doc2Spec的方法,利用NLP技術(shù)分析API文檔,自動從文檔中推斷資源規(guī)范,他們將命名實體識別技術(shù)用來分析文檔,基于隱馬爾可夫模型(hidden Markov model, HMM)使用命名實體識別技術(shù),在HMM的五元組中融入詞性特征.該方法在JavaDoc的5個庫上進行了評估,結(jié)果表明該方法推斷的規(guī)范具有相當(dāng)高的精確度、召回率和F1分?jǐn)?shù),并且對API文檔和源代碼之間的不一致檢測是有效的.但是與傳統(tǒng)的靜態(tài)分析相比,該方法可能導(dǎo)致更高的誤報.Pandita等人[75]提出了ICON,利用NLP技術(shù)解析API文檔,通過詞性標(biāo)注、短語和從句解析以及類型依賴從文檔中提取API的調(diào)用序列,從而檢測代碼中的不一致性.實驗結(jié)果表明ICON可以有效地識別時間約束語句,平均準(zhǔn)確率達(dá)到70%.Zhou等人[76]利用NLP技術(shù)分析文檔中與參數(shù)約束和異常拋出聲明相關(guān)的指令,利用了詞性標(biāo)注和依存句法解析從文檔中自動提取約束,從而檢測API誤用的缺陷,在2 000種API的使用限制條件下,可以檢測到1 158個缺陷,準(zhǔn)確率為82.6%、召回率為82.0%.Chen等人[77]提出了Dilution,根據(jù)付款服務(wù)的付款模型和安全要求,自動檢查聯(lián)合支付文檔.他們利用詞性標(biāo)注和依存句法解析分析官方支付文檔的句子、識別句子的句法元素并且明確它們的語義、利用詞嵌入模型并計算余弦相似度識別文檔中的同義詞,最終在8個主流的聯(lián)合服務(wù)共1 456 KB文檔中(包括Ping++,Paymax,BeeCloud等),自動預(yù)測了總共41個潛在問題.Lv等人[78]提出了自動化利用NLP技術(shù)分析C語言庫文檔的工具Advance.首先利用情感分析提取文檔中的API使用指導(dǎo)和限制條件,然后利用頻繁子樹挖掘并識別常用的代碼描述,最后利用詞法分析和語義分析進行參數(shù)的解析,從文檔中提取這些約束并且在5個庫(OpenSSL,SQLite,libpcap,libdbus,libxml2)和39個應(yīng)用上進行了評估,發(fā)現(xiàn)了193個API誤用錯誤,其中139個為未知錯誤,達(dá)到了88%的平均準(zhǔn)確率,高于APEx[79]和APISAN[80]的21.6%和12%,在API誤用錯誤檢出率上,Advance也有了較大提升.然而,由于一些限制條件在文檔中并不常見,將會在檢測中引起漏報.Chen等人[81]提出了Atomic,從蜂窩移動網(wǎng)絡(luò)的大量技術(shù)文檔中自動發(fā)現(xiàn)蜂窩移動網(wǎng)絡(luò)中的漏洞,利用NLP技術(shù)中的文本蘊含和依存句法解析,從大量的LTE文檔中自動發(fā)現(xiàn)某個事件發(fā)生在某個狀態(tài)時描述危險操作的語句,從而恢復(fù)狀態(tài)和事件信息生成測試用例,進一步檢測LTE設(shè)計和實施中的漏洞,并且在549頁的LTE NAS規(guī)范上運行Atomic后發(fā)現(xiàn)了42個漏洞,其中包含10個從未被報告的漏洞.

以上研究均借助了官方文檔,主要利用NLP技術(shù)中的命名實體識別、詞性標(biāo)注、依存句法解析、語法分析、語義消歧等對自然語言文檔進行分析,從文檔中提取規(guī)則和約束等,從而輔助代碼中漏洞的發(fā)現(xiàn).

除了針對代碼的漏洞檢測,研究人員同樣對文檔本身的漏洞和錯誤展開研究.計算機軟件包括程序和文檔,所以文檔的正確性對于軟件項目的成功也至關(guān)重要,而在檢測源代碼的漏洞之前,文檔中可能也存在錯誤,直接檢測文檔中的錯誤有助于加速代碼審核的速度.因此,Zhong等人[82]結(jié)合代碼分析技術(shù)和NLP技術(shù)來自動化檢測API文檔中的錯誤并且以相對較高的精度和召回率檢測了1 000多個JavaDoc中以前未知的錯誤.以上研究主要利用依存句法解析來分析文檔,從而檢測其他文檔中的缺陷.在整個漏洞檢測的過程中,NLP主要對文本內(nèi)容分析起到了輔助的作用,自動化分析文檔并且提取文本中的信息,從而輔助源代碼或應(yīng)用程序文檔中的漏洞分析.

討論與分析1.本文列舉了基于官方文檔的漏洞檢測研究中的6項代表性成果,如表2所示,分別從數(shù)據(jù)源、主要NLP技術(shù)、效果以及缺陷等部分進行橫向?qū)Ρ?研究人員針對漏洞檢測中的高誤報和高漏報現(xiàn)象,提出將官方文檔作為漏洞檢測的重要數(shù)據(jù)來源.當(dāng)前研究成果能夠檢測出Use-After-Free漏洞、內(nèi)存泄漏、DoS拒絕服務(wù)漏洞、信息泄露等多種漏洞類型.由表2可知,當(dāng)前基于官方文檔信息進行漏洞檢測的研究對象以Java和C++等高級程序語言為主,利用NLP技術(shù),從官方文檔中提取API使用約束并進行漏洞檢測研究.大部分研究使用了詞性標(biāo)注和依存句法解析的方法,對文本中與API使用的相關(guān)限制信息進行提取和分析.隨著研究的發(fā)展,研究中采用的NLP技術(shù)也從簡單的提取關(guān)鍵信息,轉(zhuǎn)變到對文本中信息進行理解再提取信息,在提取API限制信息的準(zhǔn)確率上也有了提升.

同時,研究也存在一定的局限性:

問題1.提取文檔中API使用限制的方法存在一定局限性:例如,Advance和Atomic難以處理描述模糊的語句,會產(chǎn)生一定的誤報或漏報.

問題2.研究能夠檢測的漏洞類型相對單一:例如,Atomic僅能檢測DoS相關(guān)的漏洞類型.

在未來的研究工作中,研究人員可探索的內(nèi)容為:1)如何解決NLP技術(shù)難以處理文本信息中描述模糊的語句問題;2)如何解決利用官方文檔進行漏洞檢測時漏洞類型單一的問題.總體來說,基于官方文檔的漏洞檢測研究補充了一部分從代碼中無法獲取的知識,輔助更加全面的漏洞檢測研究.自動化檢測文檔中的缺陷與錯誤,能夠為程序分析(例如模糊測試)提供指導(dǎo),從而更有效地檢測漏洞.

2.2 基于代碼的漏洞檢測研究

NLP技術(shù)已在自然語言分析與理解領(lǐng)域廣泛應(yīng)用.然而,對于代碼的理解,以及從代碼中檢測漏洞仍有較大的研究空間.調(diào)研發(fā)現(xiàn)當(dāng)前以源代碼作為輸入數(shù)據(jù)來輔助漏洞檢測的工作借鑒了NLP技術(shù)思想,下面將詳細(xì)闡述這部分研究工作.

由于自然語言(natural language, NL)和編程語言(programming language, PL)本質(zhì)上的區(qū)別,當(dāng)前NLP技術(shù)難以直接應(yīng)用到源代碼中進行漏洞檢測.因此,研究人員提出借鑒NLP技術(shù)的思想通過一些模型變體對源代碼進行分析處理,從而實現(xiàn)漏洞檢測任務(wù).

由于源代碼的數(shù)量巨大,人們很難僅從源代碼中歸納并提取出編程規(guī)則的限定條件.因此,Engler等人[83]提出了一種自動化提取某段代碼中的約束限定條件的方法.在不需要額外信息的情況下,僅從源代碼中提取函數(shù)的使用限定.提出“以大多數(shù)代碼的表現(xiàn)形式為基準(zhǔn),少數(shù)與這些形式不同的代碼為潛在錯誤”,這一思想也被后續(xù)應(yīng)用到各項研究中.這一方法應(yīng)用廣泛,為大量從源代碼中檢測漏洞的工作提供了新思路.

基于Engler的工作,Wang等人[84]提出“當(dāng)一種模式?jīng)]有以很高的頻率出現(xiàn)時就不會形成規(guī)則,將會對漏洞產(chǎn)生漏報”.在代碼集上出現(xiàn)頻率較低的標(biāo)記序列是不正常的,這些標(biāo)記序列可能會導(dǎo)致錯誤和漏洞.研究提出了一個新工具Bugram,利用n-gram語言模型對程序的調(diào)用序列進行統(tǒng)計,并進行漏洞檢測.該工作在14個Java項目上檢測出21個真實漏洞.

另一些工作圍繞Engler提出的思想,探索了直接在代碼集中檢測漏洞的可行性.由于無法實現(xiàn)對系統(tǒng)中的大部分漏洞的自動化檢測,在大規(guī)模代碼中進行漏洞檢測長期依賴于對代碼的人工審核,導(dǎo)致這一工作的效率變低.同時,研究人員發(fā)現(xiàn),許多漏洞是由不充分的輸入驗證導(dǎo)致的,因此忘記檢查輸入或錯誤檢查輸入為漏洞檢測提供了重要的信息.因此,Yamaguchi等人[85]提出了一項工作CHUCKY,通過對代碼進行污點分析并識別出安全關(guān)鍵性對象的異?;蛉笔l件,加速人工代碼審核的過程.研究人員以“大多數(shù)代碼的表現(xiàn)形式為正確的”這一觀察為基礎(chǔ),認(rèn)為缺少檢查或錯誤檢查是罕見的事件、并且對軟件項目中的安全關(guān)鍵性對象施加的大多數(shù)條件都是正確的.因此,CHUCKY通過對給定函數(shù)源碼進行語法分析,在代碼集上對具有相似的函數(shù)進行檢測,確定與給定函數(shù)相關(guān)的安全檢查,對給定函數(shù)和與它相似的函數(shù)進行分析,最終計算出一個模型對函數(shù)進行正態(tài)分析,并實現(xiàn)對缺失安全檢查的檢測.研究人員發(fā)現(xiàn)安全檢查通常和代碼上下文內(nèi)容高度相關(guān).在檢測相似函數(shù)時,CHUCKY將使用相似API符號的函數(shù)稱為相似函數(shù),并借鑒NLP中的詞袋模型(bag-of-words model),將代碼集中的函數(shù)與向量空間匹配,維度是API符號在代碼中出現(xiàn)的頻率,使用相似API符號的函數(shù)在此向量空間中鄰接出現(xiàn),反之,距離越大函數(shù)的內(nèi)容越不同.在對函數(shù)進行嵌入部分,同樣借鑒了NLP中的詞嵌入(word embedding)方法從上一階段中的限制條件提取表達(dá)式,從而解決安全檢查描述中的細(xì)微語法差異.基于函數(shù)的嵌入這一操作,CHUCKY能夠在向量中根據(jù)距離檢測缺失檢查的操作,并輔助安全研究人員進行代碼審計.實驗表明,CHUCKY作為一項輔助工具,無需額外的數(shù)據(jù)和信息,能夠一定程度輔助提高人工審計的效率.在5個開源項目(Firefox,Linux,LibPNG,LibTIFF,Pidgin)上進行檢測,在其中2個項目上發(fā)現(xiàn)了12個未知漏洞.然而,這一工具也存在一些研究缺陷,例如,與缺失安全檢查無關(guān)的一些漏洞是無法被檢測出來的;盡管這一工具能夠指出潛在的安全問題,但不能確認(rèn)這一問題導(dǎo)致安全漏洞的必然性;同時,這一工具在成熟的代碼項目中更加有效.

當(dāng)前研究嘗試了從已知漏洞學(xué)習(xí)規(guī)則來檢測未知漏洞,這一方法已經(jīng)形成了大范圍的應(yīng)用.但這一方法存在一定的缺陷:1)模型訓(xùn)練的過程需要輸入大量已知漏洞的數(shù)據(jù),才能在一定程度上降低模型的誤報率;2)大多數(shù)模型只能實現(xiàn)針對特定類型漏洞的檢測.

針對這一研究現(xiàn)狀,Ahmadi等人[86]提出了一個工具FICS,無需已知漏洞數(shù)據(jù)集或額外信息進行模型訓(xùn)練,就能夠檢測出數(shù)據(jù)集中的已知漏洞和未知漏洞.同樣延續(xù)了Engler等人[83]提出的理論,FICS以大多數(shù)代碼的形式為基準(zhǔn),以偏離這些代碼的表現(xiàn)形式作為檢測漏洞的基礎(chǔ),實現(xiàn)了在5個現(xiàn)有開源項目數(shù)據(jù)集(QEMU,OpenSSL,wolfSSL,OpenSSH,LibTIFF)上檢測功能相似但表現(xiàn)形式不同的潛在錯誤代碼,稱之為“不一致相關(guān)漏洞”.FICS從當(dāng)前代碼集上提取代碼片段(construct),利用2步聚類方法來檢測代碼中功能相似的代碼片段,最后檢測這些片段中與大多數(shù)代碼形式不一致的部分實現(xiàn)對不一致漏洞的檢測.FICS利用了程序的數(shù)據(jù)依賴圖(data dependency graph, DDG)來提取代碼片段,該圖通過保留程序依賴圖(program dependency graph, PDG)中的數(shù)據(jù)依賴邊、去掉控制依賴邊生成.從根節(jié)點出發(fā),遍歷數(shù)據(jù)依賴圖中的所有子節(jié)點,當(dāng)遍歷所有子節(jié)點或達(dá)到construct最大深度時,形成了最終的construct.根節(jié)點和最大深度能夠唯一確定construct.在第1步進行相似construct聚類的過程中,Ahmadi等人[86]發(fā)現(xiàn)如果排除邊,能夠最大程度的不影響計算construct的相似性.因此,借鑒了NLP中詞袋模型思想,提出了“bag of nodes”方法:只考慮construct中的節(jié)點,將每一個construct嵌入1個節(jié)點向量中,通過計算每一個節(jié)點向量的余弦相似性,這一方法能夠有效的檢測相似的construct.這一工作在5個開源軟件上進行測試,發(fā)現(xiàn)了22個新漏洞.但這一工作也存在一定局限性,對于代碼量過小和過大的工程檢測效果并不是很好;對于細(xì)微漏洞來說,FICS的檢測效果并不好,原因是FICS工具中的construct粒度仍然比一些漏洞要大.

同樣在其他研究工作中,也借鑒了NLP技術(shù)中“詞嵌入”思想.當(dāng)傳統(tǒng)基于控制流程圖的檢測工具無法在大規(guī)模的IoT設(shè)備上實現(xiàn)漏洞檢測時,Geniu[87]能夠很好地解決這一問題,將控制流程圖轉(zhuǎn)換到高階數(shù)字特征向量中.這一工作對8 126個Firmware Images中的420 558 702個函數(shù)進行實驗,在最終結(jié)果中發(fā)現(xiàn)了5個廠商的38個潛在脆弱的Firmware Images.同時,另一項工作也借鑒了這一思想.因為代碼中變量和函數(shù)的名稱在一定程度上能夠為檢測代碼中某些種類漏洞提供語義信息.然而當(dāng)前研究往往忽略了這一信息,導(dǎo)致漏洞檢測工具可能會對某些漏洞產(chǎn)生漏報.因此,Pradel等人[88]提出了一項新技術(shù)“DeepBugs”,能夠從代碼名稱中將語義相似的標(biāo)識符識別出來.借鑒NLP的“詞嵌入”思想,將標(biāo)識符進行嵌入操作,輔助識別具有相似語義的標(biāo)識符.該工作在12萬個JavaScript文件中檢測出102個程序誤用,達(dá)到了至少89%的準(zhǔn)確率.針對抄襲檢測、惡意軟件檢測以及漏洞檢測等任務(wù),跨平臺二進制代碼的相似性檢測極為重要.現(xiàn)有研究使用相似圖匹配的方法進行相似性檢測,這一方法在一定程度上非常耗時且容易出錯,普適性差.Xu等人[89]提出了一項工具Gemini,對每一個二進制函數(shù)生成其控制流程圖,對他們進行嵌入向量的操作,通過計算向量間的距離來檢測相似性.這一思想同樣也借鑒了NLP技術(shù)中的“詞嵌入”思想.實驗表明,Gemini能夠?qū)⒛P陀?xùn)練速度從1周的時間降至30 min到10 h.同樣地,與Genius相比,Gemini能夠檢測出更多有潛在漏洞的Firmware Images.Saccente等人[90]提出了Project Achilles,利用詞嵌入對源代碼進行表征,然后利用長短期記憶循環(huán)神經(jīng)網(wǎng)絡(luò)(LSTM RNN)來檢測源代碼中的漏洞.在使用44 495個測試用例檢測后發(fā)現(xiàn),可以對29種不同類型的CWE漏洞中的24種達(dá)到高于90%的檢測準(zhǔn)確率,但其對于其他漏洞類型的檢測仍有不足.Wang等人[91]提出了FUNDED,這是一種用于漏洞檢測的模型框架.它利用詞嵌入對代碼的語法信息進行學(xué)習(xí),從而進行初始化節(jié)點嵌入.FUNDED利用圖神經(jīng)網(wǎng)絡(luò)(GNN)來捕獲程序的控制、數(shù)據(jù)和調(diào)用依賴.利用該框架評估在大型真實世界數(shù)據(jù)集上C,Java,Swift,Php編寫的程序,表明其性能優(yōu)于其他替代方法.嘗試在5個開源項目的不同版本中進行漏洞檢測,在56個漏洞中共檢測出了53個漏洞,達(dá)到了95%的準(zhǔn)確率.但該方法同樣對不同漏洞類型的覆蓋度不足.

討論與分析2.本文選擇4項具有代表性的基于代碼的漏洞檢測研究進行橫向?qū)Ρ?如表3所示.由于NLP技術(shù)最初被用來處理文本信息,因此,當(dāng)前針對代碼的漏洞檢測研究僅借鑒了NLP技術(shù)中“詞嵌入”的思想,但數(shù)據(jù)源大多為Github中的開源代碼項目,通過對代碼進行降維處理從而達(dá)到后續(xù)漏洞檢測的目的.當(dāng)前基于代碼的漏洞檢測研究成果既可以以較高準(zhǔn)確率對已知漏洞進行檢測,還可以檢測出未知漏洞.由于基于代碼的漏洞檢測研究覆蓋率依賴于代碼規(guī)模,在代碼量一定的前提下,研究人員提出了借鑒NLP技術(shù)思想,將代碼轉(zhuǎn)換為低階向量,這一操作能夠一定程度降低通過進行圖比較產(chǎn)生的損耗.

Table 3 Comparison of Vulnerability Detection Based on Code表3 基于代碼的漏洞檢測對比

然而,現(xiàn)有研究成果也存在一定的局限性:

問題3.研究針對代碼量規(guī)模有一定要求:例如,FICS針對代碼量過大或者過小的工程檢測效果一般.

問題4.部分研究存在漏洞檢測的單一性:例如,CHUKCY難以檢測與missing-check漏洞無關(guān)的其他漏洞類型.

因此,未來研究工作中潛在的研究方向可歸納為:1)如何解決代碼量級對漏洞檢測效果的影響問題;2)如何在單一數(shù)據(jù)源上實現(xiàn)檢測多種漏洞類型的問題.總體來說,基于代碼的漏洞檢測研究從另一方面為研究人員提供了研究思路.從開發(fā)人員的角度出發(fā),借鑒NLP技術(shù)思想輔助漏洞檢測效率的提升,在無需額外文本信息的輔助下實現(xiàn)相對高效的漏洞檢測,但如何實現(xiàn)針對多種類型的漏洞檢測仍是未來需要探索的方向.

2.3 基于代碼注釋的漏洞檢測研究

相對于程序代碼,代碼中的注釋更加直接,描述清晰且易于理解[92].Woodfield等人[93]對48名資深程序員進行了一個問卷調(diào)查,結(jié)果表明對于程序員來說,帶有注釋的代碼更容易被理解.因此,開發(fā)人員會把代碼實現(xiàn)的功能以及對代碼操作的限制條件寫在注釋中.這些注釋語言為漏洞檢測研究提供了極大的幫助.例如,微軟開發(fā)的源代碼注釋語言(source-code annotation language, SAL)可以用來注釋函數(shù)的參數(shù)和返回值[94].這一注釋語言不僅可以幫助用戶清晰地表達(dá)代碼含義,還能夠輔助靜態(tài)分析工具以低誤報率和低漏報率自動化且準(zhǔn)確地分析代碼.SAL注釋[95]幫助檢測了Windows代碼中的1 000多個潛在安全漏洞[96].看到SAL的成功,微軟最近提出了新的注解,包括與并發(fā)相關(guān)的注釋.此外,其他幾種注釋語言,包括來自Linux內(nèi)核社區(qū)的Sparse[97],Sun的Lock_Lint[98]和SharC[99],研究了與并發(fā)相關(guān)的問題.代碼注釋包含了程序開發(fā)中需要注意的限定條件,然而由于自然語言表述不夠直接且規(guī)模巨大,使得從代碼注釋中提取程序編寫的限定條件,并利用這些信息進行漏洞檢測的工作難以自動化[100].因此,Tan等人[4]提出了利用NLP技術(shù)對代碼注釋進行自動化分析,并將其語義和代碼進行比較,檢測他們之間的不一致,檢測潛在安全漏洞及惡意代碼注釋的工具iComment.這一工具在Linux,Mozilla,Wine,Apache這4個代碼集上提取了1 832條鎖相關(guān)和調(diào)用相關(guān)的限定規(guī)則,準(zhǔn)確率達(dá)到90.8%~100%,并檢測出33個新漏洞和27條錯誤注釋.然而,這一工具在檢測其他類型錯誤時有一定的局限性:iComment在處理“中斷相關(guān)(interrupt-related)”的注釋時,準(zhǔn)確率會降低.因此,Tan等人[101]提出了新的工具aComment,從注釋和代碼中提取“中斷相關(guān)”的前置和后置條件,再利用這些信息檢測程序中和中斷相關(guān)的并發(fā)缺陷.

這一工作從Linux內(nèi)核中提取96 821條中斷相關(guān)的注釋,并檢測到9個操作系統(tǒng)的并發(fā)缺陷,這些錯誤可能會導(dǎo)致并發(fā)攻擊,使得攻擊者攻擊系統(tǒng)的機密性、完整性和可用性[102].2012年,Tan等人[103]基于先前的研究繼續(xù)提出了tComment工具.由于Javadoc文檔的規(guī)范性,無需利用NLP技術(shù)對注釋進行處理.工具檢測出28個不一致錯誤,其中12個已經(jīng)被確認(rèn).以上研究工作將關(guān)注點聚焦在C/C++編寫的系統(tǒng)代碼上和鎖協(xié)議(locking protocol)、函數(shù)調(diào)用以及中斷錯誤上.因此,在檢測其他類型漏洞時具有一定的局限性.然而,這些研究為基于文本的漏洞檢測研究提供了新的數(shù)據(jù)源方向.檢測代碼注釋與函數(shù)實現(xiàn)之間的不一致也幫助研究人員發(fā)現(xiàn)了大量未知的漏洞.Wong等人[104]提出了DASE來改進自動化的測試生成以及錯誤檢測.DASE利用自然語言處理中的語法關(guān)系來分析程序的文檔(手冊和代碼注釋)自動提取輸入約束.DASE在對在5個廣泛使用的軟件套件(GNU COREUTILS,GNU FINDUTILS,GNU GREP,GNU BINUTILS,ELFTOOLCHAIN)的88個程序上進行評估,發(fā)現(xiàn)了12個未知的錯誤.但該方法專注于幾種錯誤類型,對更多的錯誤類型的可行性未知.Rabbi等人[105]使用Siamese recurrent network解決了代碼和代碼注釋序列的不一致問題.利用詞嵌入思想對代碼和代碼注釋進行向量化表示,利用2個單獨的RNN-LSTM模型分別輸入代碼和注釋,從而檢測代碼與注釋的相似度來發(fā)現(xiàn)不一致的問題.實驗表明,在對300個代碼注釋對進行評估后,召回率達(dá)到91.7%,精確度63.2%.代碼注釋有助于提高代碼的可讀性,而開發(fā)人員通常會忽略更改代碼后的注釋更新,從而導(dǎo)致代碼與注釋的不一致.因此,Zhai等人[106]提出了CPC,即利用程序分析來傳播注釋.CPC將詞嵌入思想用于注釋分類器的分類,利用依存句法解析提取注釋中詞匯之間的依賴類型從而完成對注釋的特征提取.CPC同時使用程序分析來傳播注釋,派生的注釋用于檢測5個實際項目的代碼,并檢測出37個新的錯誤代碼,其中30個已由開發(fā)人員確認(rèn)并修復(fù).此外,CPC還發(fā)現(xiàn)現(xiàn)有注釋中存在304個缺陷,其中包括12條不完整的注釋以及292條錯誤注釋.但是該方法不是上下文敏感的,無法識別傳遞觸發(fā)函數(shù)返回null或-1的參數(shù)的情況.

討論與分析3.本文將4項具有代表性的基于代碼注釋的漏洞檢測研究成果列舉出來,如表4所示.研究人員利用NLP技術(shù)對代碼注釋進行語義提取,并將其與代碼進行比較,檢測兩者間不一致導(dǎo)致的漏洞成為近年來的一個新興研究方向.當(dāng)前研究成果中,大多數(shù)采取詞嵌入以及依存句法解析的方法對代碼注釋進行關(guān)鍵信息提取,輔助實現(xiàn)對開源代碼的漏洞檢測.當(dāng)前研究不僅能夠?qū)崿F(xiàn)對未知漏洞或錯誤的檢測,還可以對代碼注釋中的錯誤或不一致情況進行檢測.

Table 4 Comparison of Vulnerability Detection Based on Code Comment表4 基于代碼注釋的漏洞檢測對比

代碼注釋能夠幫助其他開發(fā)人員更好地理解代碼,同時也幫助研究人員從注釋中找出代碼實現(xiàn)上的問題.然而這一研究方向的成果也存在一定的局限性:

問題5.研究工具的普適性還有一定的提升空間.例如,iComment將研究重心放在了鎖相關(guān)和調(diào)用相關(guān)的限定規(guī)則中,aComment將研究點落在中斷相關(guān)的限定規(guī)則中,這2個工具在單一領(lǐng)域的運用效果不錯,但是難以提取其他領(lǐng)域的規(guī)則并進行漏洞檢測.

問題6.研究在跨語言平臺不夠友好.例如,當(dāng)前研究僅針對C/C++編程語言的代碼注釋進行分析,在檢測一致性時僅能夠?qū)我婚_發(fā)語言進行處理分析,對于多種開發(fā)語言的適用性未知.

因此,在未來的研究工作中,研究人員可嘗試探索如何保證利用代碼注釋進行漏洞檢測時形成的工具具備更好的普適性,使得工具能夠在跨語言平臺的檢測效果更好.

2.4 基于漏洞相關(guān)信息輔助漏洞檢測研究

本文將漏洞相關(guān)信息分為官方給出的漏洞信息(CVE[109]和NVD)以及第三方漏洞描述信息(如漏洞報告,漏洞利用數(shù)據(jù)庫).接下來,將分別從這2部分內(nèi)容出發(fā),對基于漏洞相關(guān)信息輔助漏洞檢測的研究成果進行梳理與總結(jié),并對成果中存在的問題進行分析并給出潛在未來研究方向.

CVE[109]是由US-CERT發(fā)起的針對公眾已知的信息安全漏洞和披露的參考系統(tǒng).截至2021年6月,CVE中已包含153 821個漏洞的描述信息.種類包括代碼執(zhí)行、DoS、溢出以及XSS等.

在模糊測試這一過程中,有研究人員發(fā)現(xiàn)漏洞相關(guān)信息能夠輔助進行漏洞檢測工作.結(jié)合CVE中的漏洞描述,You等人[5]提出了一個新的模糊測試工具SemFuzz,該工具利用NLP技術(shù)對漏洞描述和Linux git logs進行分析,提取漏洞相關(guān)的信息,例如,受影響的版本、漏洞類型、有漏洞的函數(shù),以及系統(tǒng)調(diào)用等.利用這些信息,SemFuzz能夠生成針對Linux內(nèi)核的模糊測試用例.該工具成功觸發(fā)了112個已知Linux內(nèi)核漏洞中的18個,并發(fā)現(xiàn)了一個0-day漏洞和一個未被披露的漏洞.當(dāng)前大部分基于文本分析的漏洞檢測研究集中在對官方文檔的分析上,SemFuzz提出了一個新思路,利用漏洞描述信息來輔助進行漏洞檢測工作,這一工作也為后續(xù)利用官方文檔以外的文本信息進行漏洞檢測提供了新的方向.

同樣,CVE和NVD(national vulnerability data-base)上有關(guān)漏洞的描述促進了威脅情報的共享,為漏洞檢測的上游任務(wù)提供了依據(jù).Gartner認(rèn)為威脅情報(threat intelligence)是一種基于證據(jù)的知識,包括了情境、機制、指標(biāo)、影響和操作建議.它描述了現(xiàn)存的、或者是即將出現(xiàn)針對資產(chǎn)的威脅或危險,并可以用于通知主體針對相關(guān)威脅或危險采取某種響應(yīng)[110].然而,對于平臺上大量的漏洞信息,有研究人員發(fā)現(xiàn)第三方漏洞描述與NVD之間存在不一致的情況.Dong等人[111]提出了一項大規(guī)模不一致信息分析的工具VIEM.該工具從CVE中使用自然語言描述的漏洞信息以及NVD中結(jié)構(gòu)化的漏洞相關(guān)數(shù)據(jù)來檢測相關(guān)漏洞技術(shù)博客中與這2個平臺漏洞數(shù)據(jù)不一致的情況,從不規(guī)則文本中提取軟件中有潛在安全問題的軟件名稱和版本信息.在近20年中的78 296個漏洞以及70 569個漏洞報告中進行不一致檢測,發(fā)現(xiàn)僅有59.82%的報告與NVD中的信息完全一致.不同程度的不一致信息可能會導(dǎo)致在漏洞檢測和漏洞修復(fù)過程中的安全問題.這一工作以NVD中對于漏洞信息的描述為基準(zhǔn),實現(xiàn)了大規(guī)模針對漏洞報告中有漏洞的軟件名稱以及版本不一致的檢測.漏洞報告通常作為為漏洞打補丁或生成威脅情報指標(biāo)的重要依據(jù).而漏洞報告中漏洞相關(guān)信息的錯誤可能導(dǎo)致漏洞被延遲或漏打補丁.這一結(jié)果將導(dǎo)致更加嚴(yán)重的漏洞出現(xiàn).

漏洞在公開后,研究人員通常會對漏洞進行評估,并以報告的形式對漏洞評估結(jié)果進行公開,而報告對于解決任何未發(fā)現(xiàn)的問題至關(guān)重要.如果沒有清晰且結(jié)構(gòu)良好的報告,項目和組織負(fù)責(zé)人可能無法了解他們面臨的威脅規(guī)模以及他們應(yīng)該采取哪些措施來緩解威脅.漏洞報告首先清楚地總結(jié)評估和關(guān)于資產(chǎn)、安全缺陷和整體風(fēng)險的關(guān)鍵發(fā)現(xiàn).然后,更詳細(xì)地介紹了與程序所有者最相關(guān)的漏洞以及它們?nèi)绾斡绊懡M織的各個方面.評估和后續(xù)報告的主要目的都是修復(fù)漏洞,因此報告應(yīng)特別注意提供指導(dǎo)和建議措施以解決當(dāng)前問題,同時防止未來出現(xiàn)問題.因此,研究人員發(fā)現(xiàn)漏洞報告中提供了漏洞代碼本身或官方漏洞數(shù)據(jù)未提供的信息,基于漏洞報告內(nèi)容的漏洞檢測研究也是有意義的.研究人員發(fā)現(xiàn),只有當(dāng)漏洞被漏洞數(shù)據(jù)庫公開或已經(jīng)被修復(fù)后才會被大眾所知.當(dāng)一些漏洞被公開后,與它相關(guān)的錯誤,稱之為HIB(hidden impact bug)[112],這些錯誤并不會被及時修復(fù)或給出安全評級.研究人員[113]針對這些漏洞,利用NLP技術(shù)從公開的漏洞報告中提取信息并分析,生成分類器對提交給漏洞數(shù)據(jù)庫的漏洞進行分類,區(qū)分出HIB和普通錯誤.在同時期對Bugzilla[114]和CVE上的漏洞數(shù)據(jù)上進行了實驗驗證,表明NLP能夠準(zhǔn)確區(qū)分出88%的HIB.基于漏洞報告的文檔分析同樣也適用于針對IoT設(shè)備的漏洞檢測與防御.Feng等人[6]提出對從漏洞技術(shù)博客和論壇中抓取的過去20年里的43萬份報告中提取的與IoT設(shè)備安全相關(guān)的7 500個漏洞報告進行分析.通過提取IoT設(shè)備安全相關(guān)的實體名稱,生成惡意行為簽名來輔助入侵檢測系統(tǒng)和防火墻降低對IoT設(shè)備的攻擊.Sun等人[115]進行了實證研究,主要研究ExploitDB的帖子和CVE之間的關(guān)系.為了減少為ExploitDB帖子記錄CVE的延遲和缺失,他們從詳細(xì)的漏洞利用帖子中生成CVE描述,利用基于BERT的命名實體識別技術(shù)和問答技術(shù)從漏洞利用的帖子中提取版本、漏洞類型、攻擊向量等9個關(guān)鍵點然后對所提取的內(nèi)容進行組合,在實體識別階段準(zhǔn)確率高于97%,確保了ExploitDB帖子內(nèi)和跨異構(gòu)漏洞的數(shù)據(jù)一致性.此外,這項研究明確了ExploitDB帖子對于CVE發(fā)現(xiàn)和分析的重要性.

討論與分析4.CVE作為官方給出的漏洞信息數(shù)據(jù)庫,為研究人員提供了認(rèn)證的漏洞信息,而第三方漏洞描述是開源可獲取的新興研究數(shù)據(jù)信息.這2類數(shù)據(jù)構(gòu)成了漏洞相關(guān)數(shù)據(jù)的集合.本文將該方向具有代表性的4項研究進行匯總,如表5所示.當(dāng)前利用漏洞相關(guān)信息的研究工作,大部分利用了命名實體識別的方法,對文本中與漏洞相關(guān)的關(guān)鍵信息進行提取.在漏洞檢測階段,嘗試?yán)寐┒葱畔δ:郎y試進行輔助,嘗試對漏洞信息之間的不一致性進行檢測從而達(dá)到漏洞檢測的目的.

基于官方漏洞信息的漏洞檢測研究,通過利用NLP技術(shù)從漏洞信息中提取漏洞類型、存在漏洞的函數(shù)以及系統(tǒng)調(diào)用等標(biāo)準(zhǔn)化信息,輔助漏洞檢測的研究.而第三方漏洞描述為官方漏洞信息補充了豐富的專家知識,多方位輔助漏洞檢測研究的工作.

同樣地,這部分研究也存在一些問題:

問題7.漏洞檢測類型上比較單一,例如,Semfuzz在檢測邏輯漏洞上的效果未知,對于需要特殊工具才能觸發(fā)的漏洞檢測效果未知.官方漏洞信息CVE和NVD不僅為檢測未知漏洞提供了新思路,還為漏洞打補丁的過程提供了幫助.以上研究表明,基于漏洞相關(guān)信息不但可以輔助進行漏洞檢測,還可以生成威脅情報輔助提高入侵檢測系統(tǒng)的準(zhǔn)確率.

問題8.NLP技術(shù)在處理漏洞相關(guān)語句上的局限性,對于長難句以及描述不夠完整的語句分析效果未知.因此,在未來的研究工作中,研究人員可將以下2點內(nèi)容作為研究方向:1)探索如何在單一數(shù)據(jù)源上實現(xiàn)檢測多種漏洞類型的問題;2)探索如何解決當(dāng)前NLP技術(shù)難以處理漏洞相關(guān)長難句的問題.

Table 5 Comparison of Vulnerability Detection Based on Vulnerability-related Information表5 基于漏洞相關(guān)信息的漏洞檢測研究對比

3 延伸研究領(lǐng)域成果

研究人員圍繞漏洞進行的研究工作除了漏洞檢測與發(fā)現(xiàn),還有漏洞的復(fù)現(xiàn)、漏洞的修復(fù)以及漏洞的利用.本節(jié)將簡要介紹利用NLP技術(shù)實現(xiàn)漏洞復(fù)現(xiàn)、漏洞修復(fù)以及漏洞利用的當(dāng)前研究成果.

利用文本進行漏洞復(fù)現(xiàn)工作的前提是漏洞報告內(nèi)容的詳細(xì)和準(zhǔn)確.為了使漏洞報告能夠為研究人員所用,報告應(yīng)該清晰地描述觀察到的行為、復(fù)現(xiàn)步驟以及預(yù)期行為來輔助研究人員理解和復(fù)現(xiàn)潛在的錯誤.Chaparro等人[116]通過詞性標(biāo)記和啟發(fā)式的方法將句子和段落與話語模式相匹配,從而進一步識別漏洞報告的描述中是否具備復(fù)現(xiàn)步驟和預(yù)期行為.Zhao等人[117]提出了ReCDroid,利用NLP技術(shù)中的詞性標(biāo)注和依存句法解析來分析漏洞報告的文本,采用22條語法規(guī)則從報告中提取復(fù)現(xiàn)錯誤相關(guān)的事件表示,從而進一步實現(xiàn)自動化地漏洞復(fù)現(xiàn).在對33個安卓應(yīng)用的51個原始漏洞報告評估后,顯示ReCDroid對漏洞的復(fù)現(xiàn)成功率達(dá)到了63.5%.另一方面,有研究人員開展了利用文本內(nèi)容輔助漏洞修復(fù)的研究.Nappa等人[118]對漏洞補丁進行了研究,并且利用NLP技術(shù)從文本描述中提取易受攻擊的范圍,從而自動化比較文本漏洞描述中的易受攻擊范圍和NVD XML轉(zhuǎn)儲中的易受攻擊版本.

當(dāng)前利用NLP技術(shù)輔助漏洞復(fù)現(xiàn)和漏洞修復(fù)的研究還有很多難題未解,未來研究的發(fā)展空間很大.利用NLP技術(shù)輔助漏洞檢測研究領(lǐng)域中的成果可以遷移到下游任務(wù)中,輔助實現(xiàn)漏洞的復(fù)現(xiàn)和修復(fù)工作.

4 總結(jié)展望

當(dāng)前利用NLP技術(shù)展開的漏洞檢測研究根據(jù)數(shù)據(jù)源不同可劃分為4類:官方文檔、代碼、代碼注釋以及漏洞相關(guān)信息.當(dāng)前領(lǐng)域已經(jīng)探索了大部分開源可用的數(shù)據(jù),技術(shù)上相比傳統(tǒng)漏洞檢測工具在準(zhǔn)確率上已有較大的提升.然而,我們發(fā)現(xiàn)當(dāng)前研究成果多存在一些局限性,即成果在漏洞檢測類型上的單一.分析其原因,我們發(fā)現(xiàn)當(dāng)前研究在選取數(shù)據(jù)集以及NLP技術(shù)上存在一定的局限性,從而導(dǎo)致漏洞檢測類型不盡如人意.通過對當(dāng)前研究存在的問題進行總結(jié)歸納,將問題類型劃分為數(shù)據(jù)、技術(shù)以及效果3類,如表6所示:

Table 6 Problems of Vulnerability Detection Based on NLP

除此之外,還將對未來研究工作與方向進行討論.

1) 數(shù)據(jù)

在基于代碼和代碼注釋的漏洞檢測研究中,我們發(fā)現(xiàn)多個研究均出現(xiàn)數(shù)據(jù)源過于單一的情況.通過分析問題3、問題5和問題6,我們發(fā)現(xiàn):數(shù)據(jù)結(jié)構(gòu)單一、數(shù)據(jù)來源單一、以及數(shù)據(jù)類型單一均包含在數(shù)據(jù)單一的范疇中.而本文提到的當(dāng)前研究成果中出現(xiàn)數(shù)據(jù)源單一問題的集中在基于代碼的研究部分.因此,結(jié)合文本信息輔助進行漏洞檢測研究可能會增加后續(xù)檢測出的漏洞類型.對于基于文本的漏洞檢測研究,我們發(fā)現(xiàn)豐富文本類型可能會增加后續(xù)檢測出的漏洞類型,能夠最大程度地降低后期研究成果的局限性.未來方向?qū)⑻剿鞫嘣獢?shù)據(jù)在漏洞檢測領(lǐng)域的作用.通過文獻(xiàn)調(diào)研,我們發(fā)現(xiàn)官方文檔在開發(fā)過程中起到了教科書的作用,而第三方技術(shù)論壇和博客則扮演了教輔的角色,即通過補充文檔信息,給出錯誤的應(yīng)用場景以及相應(yīng)的解決方案等給研究人員提供額外的知識.當(dāng)前,基于第三方漏洞描述以及技術(shù)知識輔助進行漏洞檢測工作主要集中在完成漏洞檢測的上游任務(wù)中,而利用第三方漏洞描述直接進行漏洞檢測的研究非常有限,這表明從大量無序文本中提取有助于漏洞檢測研究的信息非常具有挑戰(zhàn)性.未來可以將研究探索重心放在如何利用第三方技術(shù)知識實現(xiàn)漏洞檢測上.同時,通過分析問題1和問題8,我們發(fā)現(xiàn)從數(shù)據(jù)角度也可以通過結(jié)合不同數(shù)據(jù)源的信息,補充上下文將模糊語句清晰化,從而達(dá)到漏洞檢測的目的.

2) 技術(shù)

在調(diào)研文獻(xiàn)的過程中,我們發(fā)現(xiàn)在處理文檔信息的時候,工具對特定語句的處理能力未知,例如問題1和問題8,相關(guān)研究成果在表述不清或不完整、語氣不夠強烈的語句以及長難句上的提取分析能力未知.這部分問題的主要原因是傳統(tǒng)NLP技術(shù)對于處理多元文本數(shù)據(jù)的局限性.未來方向?qū)⑻剿鱊LP技術(shù)處理多樣數(shù)據(jù)的潛能.針對同一類型下的多元數(shù)據(jù),嘗試突破現(xiàn)有技術(shù)在處理特定類型語句,例如長難句、描述不完整的語句以及情感不強烈的描述性語句等上的局限性.未來可以將研究重點集中到如何利用傳統(tǒng)NLP技術(shù)解決多元數(shù)據(jù)的方向上.

3) 效果

在多個研究成果中,我們發(fā)現(xiàn)問題2、問題4和問題7提出的研究在漏洞檢測類型上的單一性、數(shù)據(jù)范圍過窄,數(shù)據(jù)處理技術(shù)無法突破,從而導(dǎo)致檢測到的漏洞類型過于單一,直接影響成果的影響范圍.未來方向?qū)⑻剿髀┒礄z測方法的泛化潛能.當(dāng)前大部分研究成果大多具有針對性,即在某一領(lǐng)域下針對特定數(shù)據(jù)源或特定類型的漏洞進行研究.研究產(chǎn)出的工具在一定程度上難以達(dá)到大規(guī)模、跨平臺以及跨領(lǐng)域的漏洞檢測能力.未來可以對如何構(gòu)建高質(zhì)量大規(guī)模數(shù)據(jù)集進行深度探索.同時,嘗試在多語言數(shù)據(jù)集上應(yīng)用工具,使漏洞檢測方法具有泛化能力.

作者貢獻(xiàn)聲明:楊伊是主要撰寫人和構(gòu)思者,完成相關(guān)文獻(xiàn)資料的收集和分析及論文的寫作;李瀅參與文獻(xiàn)資料的部分整理工作以及圖表的制作;陳愷負(fù)責(zé)指導(dǎo)論文的構(gòu)思和寫作工作.

猜你喜歡
漏洞代碼文檔
漏洞
淺談Matlab與Word文檔的應(yīng)用接口
有人一聲不吭向你扔了個文檔
創(chuàng)世代碼
創(chuàng)世代碼
創(chuàng)世代碼
創(chuàng)世代碼
Word文檔 高效分合有高招
三明:“兩票制”堵住加價漏洞
漏洞在哪兒