亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        面向源代碼的軟件漏洞靜態(tài)檢測(cè)綜述1

        2019-02-20 07:49:10李珍鄒德清王澤麗金海
        關(guān)鍵詞:源代碼相似性漏洞

        李珍,鄒德清,5,王澤麗,金海

        (1. 華中科技大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,湖北 武漢 430074;2. 華中科技大學(xué)服務(wù)計(jì)算技術(shù)與系統(tǒng)教育部重點(diǎn)實(shí)驗(yàn)室,湖北 武漢 430074;3. 華中科技大學(xué)集群與網(wǎng)格計(jì)算湖北省重點(diǎn)實(shí)驗(yàn)室,湖北 武漢 430074;4. 華中科技大學(xué)湖北省大數(shù)據(jù)安全工程研究中心,湖北 武漢 430074;5. 深圳華中科技大學(xué)研究院,廣東 深圳 518057)

        1 引言

        計(jì)算機(jī)科學(xué)技術(shù)的發(fā)展在為人類帶來便利的同時(shí),也給惡意分子提供了犯罪的工具。尤其是在網(wǎng)絡(luò)空間安全領(lǐng)域,黑客攻擊、數(shù)字資產(chǎn)盜竊、用戶隱私信息泄露等各種網(wǎng)絡(luò)安全事件屢屢出現(xiàn),嚴(yán)重危害了網(wǎng)絡(luò)的進(jìn)一步發(fā)展和用戶對(duì)其的信任度。軟件系統(tǒng)作為網(wǎng)絡(luò)空間的核心組件,其本身存在的漏洞是導(dǎo)致這些攻擊的根本原因。軟件漏洞是指軟件在其生命周期(即開發(fā)、部署、執(zhí)行整個(gè)過程)中存在的缺陷,而這些缺陷可能會(huì)被不法分子利用,繞過系統(tǒng)的訪問控制,非法竊取較高的權(quán)限從而任意操縱系統(tǒng),如觸發(fā)特權(quán)命令、訪問敏感信息、冒充身份、監(jiān)聽系統(tǒng)運(yùn)行等。隨著現(xiàn)有軟件系統(tǒng)愈加復(fù)雜龐大,漏洞出現(xiàn)頻率不斷提升,急需針對(duì)漏洞檢測(cè)領(lǐng)域開展系統(tǒng)的研究工作,以便高效及時(shí)地發(fā)現(xiàn)軟件系統(tǒng)的漏洞,實(shí)時(shí)修補(bǔ),提高網(wǎng)絡(luò)空間的安全等級(jí)。

        依據(jù)分析對(duì)象,軟件漏洞靜態(tài)檢測(cè)可以分為二進(jìn)制漏洞檢測(cè)和源代碼漏洞檢測(cè)兩類。二進(jìn)制漏洞檢測(cè)方法通過直接分析二進(jìn)制代碼檢測(cè)漏洞,漏洞檢測(cè)的準(zhǔn)確度較高,實(shí)用性廣泛;但缺乏上層的代碼結(jié)構(gòu)信息和類型信息,分析難度較大,因此基于二進(jìn)制代碼的漏洞檢測(cè)研究工作相對(duì)較少。而源代碼相對(duì)于編譯后的二進(jìn)制代碼擁有更豐富的語義信息,因此更利于快捷地找出漏洞,得到了漏洞檢測(cè)研究人員的廣泛關(guān)注。

        源代碼漏洞檢測(cè)針對(duì)軟件設(shè)計(jì)開發(fā)階段,通過提取源代碼模型和漏洞規(guī)則,基于靜態(tài)程序分析技術(shù)檢測(cè)源代碼中的漏洞,具有代碼覆蓋率高、漏報(bào)低的優(yōu)點(diǎn),但對(duì)已知漏洞的依賴性較大,誤報(bào)較高。源代碼漏洞檢測(cè)方法主要包括基于中間表示的漏洞檢測(cè)和基于邏輯推理的漏洞檢測(cè)。基于中間表示的漏洞檢測(cè)方法首先將源代碼轉(zhuǎn)換為有利于漏洞檢測(cè)的中間表示,然后對(duì)中間表示進(jìn)行分析,檢查是否匹配預(yù)定義的某個(gè)漏洞規(guī)則,從而判斷源程序中是否含有對(duì)應(yīng)漏洞規(guī)則相關(guān)的漏洞?;谶壿嬐评淼穆┒礄z測(cè)方法將源代碼進(jìn)行形式化描述,然后利用數(shù)學(xué)推理、證明等方法驗(yàn)證形式化描述的一些性質(zhì),從而判斷程序是否含有某種類型的漏洞?;谶壿嬐评淼穆┒礄z測(cè)方法由于以數(shù)學(xué)推理為基礎(chǔ),因此分析嚴(yán)格,結(jié)果可靠。但對(duì)于較大規(guī)模的程序,將代碼進(jìn)行形式化表示本身是一件非常困難的事情?;谥虚g表示的漏洞檢測(cè)方法沒有上述局限性,適用于分析較大規(guī)模程序,因此得到了更為廣泛的應(yīng)用。

        本文針對(duì)基于中間表示的源代碼漏洞檢測(cè)方法開展研究。依據(jù)對(duì)中間表示的分析技術(shù),漏洞檢測(cè)方法可以分為4類:基于代碼相似性的漏洞檢測(cè)、基于符號(hào)執(zhí)行的漏洞檢測(cè)、基于規(guī)則的漏洞檢測(cè)以及基于機(jī)器學(xué)習(xí)的漏洞檢測(cè)。其中,第一類方法主要針對(duì)由于代碼復(fù)制(code clone)導(dǎo)致的相同漏洞進(jìn)行檢測(cè);后三類方法基于漏洞模式,針對(duì)各種原因?qū)е碌穆┒催M(jìn)行檢測(cè)。

        2 基于代碼相似性的漏洞檢測(cè)

        基于代碼相似性進(jìn)行漏洞檢測(cè)的核心思想是相似的代碼很可能含有相同的漏洞,主要包括3個(gè)屬性:代碼表征、代碼段級(jí)別和比較方法。具體來講,通過代碼表征和代碼段級(jí)別抽象地描述代碼段,然后利用比較方法說明如何依據(jù)兩個(gè)代碼段表征判斷它們的相似性。

        1) 代碼表征

        代碼表征的方式有5種,分別是文本、度量、標(biāo)記、樹和圖表?;谖谋镜谋碚饔捎谌鄙賹?duì)代碼語法和語義信息的表達(dá),很少用于檢測(cè)或預(yù)測(cè)漏洞。

        基于度量的表征通過從代碼段采集不同的度量,用相應(yīng)的度量值衡量代碼相似度,主要用于漏洞檢測(cè)領(lǐng)域。Chowdhury等[1]基于復(fù)雜性、內(nèi)聚和耦合 3個(gè)度量自動(dòng)預(yù)測(cè)漏洞。Neuhaus等[2]發(fā)現(xiàn)漏洞構(gòu)件具有相似的導(dǎo)入和函數(shù)調(diào)用的集合,基于此預(yù)測(cè)一個(gè)新的構(gòu)件是否含有漏洞?;诙攘康谋碚鞣椒ò绦虻恼Z法信息,容易擴(kuò)展到多類編程語言中,但無法表示比較單元的全部特征,限定條件較多,檢測(cè)效果的好壞需要進(jìn)一步驗(yàn)證。

        基于標(biāo)記(token)的表征不需要語法分析,僅通過詞法分析將源代碼轉(zhuǎn)換為一個(gè)標(biāo)記序列,通過比較這些標(biāo)記數(shù)組的行來發(fā)現(xiàn)相似代碼。ReDeBug[3]能夠迅速發(fā)現(xiàn)操作系統(tǒng)規(guī)模代碼庫中未打補(bǔ)丁的漏洞代碼。它使用特征散列法編碼位向量中的n個(gè)標(biāo)記,使ReDeBug以cache高效方式執(zhí)行相似性檢測(cè),并借助diff補(bǔ)丁代碼段發(fā)現(xiàn)漏洞代碼。Li等[4]將每個(gè)文件按行標(biāo)記,即每行作為一個(gè)標(biāo)記,滑動(dòng)窗口大小為n,每n個(gè)標(biāo)記作為比較的基本單位。從diff補(bǔ)丁代碼段中提取得到漏洞代碼,當(dāng)漏洞代碼的n個(gè)標(biāo)記集合為目標(biāo)代碼的n個(gè)標(biāo)記集合的子集時(shí),則發(fā)現(xiàn)代碼復(fù)制。Scandariato等[5]對(duì)應(yīng)用軟件中的構(gòu)件源碼進(jìn)行文本挖掘,每個(gè)構(gòu)件用源碼中一系列術(shù)語及出現(xiàn)頻率標(biāo)識(shí),基于這些特征來預(yù)測(cè)含有漏洞的構(gòu)件。Yamaguchi等[6]將每個(gè)函數(shù)表示為主要 API使用模式的組合。通過抽取每個(gè)函數(shù)的類型名和函數(shù)名,嵌入向量空間,使用機(jī)器學(xué)習(xí)方法得到API使用模式,基于此輔助發(fā)現(xiàn)源碼中的漏洞。CP-Miner[7]采用頻繁子序列挖掘技術(shù),以程序中的基本塊為單位識(shí)別基本的復(fù)制粘貼代碼段,之后發(fā)現(xiàn)復(fù)制粘貼代碼段中的缺陷。基于標(biāo)記的表征方法在詞法級(jí)別對(duì)代碼復(fù)制漏洞有良好的檢測(cè)效果,但未考慮到語法語義信息。

        在基于樹的表征中,采用樹來表示源代碼中變量、常量、函數(shù)調(diào)用以及其他標(biāo)記的語法結(jié)構(gòu)。Yamaguchi等[8]從源碼中提取所有函數(shù)的抽象語法樹,嵌入向量空間中,使用機(jī)器學(xué)習(xí)方法分析函數(shù)的結(jié)構(gòu)模式,利用函數(shù)的結(jié)構(gòu)模式組合來發(fā)現(xiàn)漏洞。SecureSync[9]采用擴(kuò)展的抽象語法樹(xAST)來表征漏洞代碼段,用于復(fù)制源碼的再現(xiàn)漏洞檢測(cè)。基于樹的表征方法雖然檢測(cè)效果較好,但復(fù)雜度高,難以用在大規(guī)模軟件系統(tǒng)中。

        在基于圖的表征中,圖的節(jié)點(diǎn)表示表達(dá)式或語句,邊表示控制流、控制依賴或數(shù)據(jù)依賴。通過分析源代碼的語法結(jié)構(gòu)以及函數(shù)調(diào)用關(guān)系、控制依賴關(guān)系、數(shù)據(jù)流等,構(gòu)建程序依賴圖(PDG)。匹配圖中的節(jié)點(diǎn),由這些節(jié)點(diǎn)組成的連通圖稱為相似子圖,由此判斷代碼的相似性。這種語義表征已用于復(fù)制檢測(cè)、缺陷檢測(cè)和漏洞檢測(cè)。在漏洞檢測(cè)方面,Yamaguchi等[10]采用代碼屬性圖表征函數(shù)源碼來發(fā)現(xiàn)漏洞,代碼屬性圖結(jié)合了抽象語法樹、控制流圖和程序依賴圖。CBCD[11]用子圖同構(gòu)匹配來確定缺陷代碼的 PDG是否是軟件系統(tǒng)PDG的子圖,并提供了4種PDG查詢的優(yōu)化方法。SecureSync[9]采用基于圖的 API(xGRUM)來表征漏洞代碼段,用于檢測(cè)針對(duì)共享庫的再現(xiàn)漏洞。基于圖的表征方法綜合考慮程序的語法和語義特征,有很好的檢測(cè)能力,但建立圖結(jié)構(gòu)代價(jià)非常高,尋找圖相似的匹配算法復(fù)雜度高,時(shí)空效率低,較難運(yùn)用于大型軟件檢測(cè)。

        2) 代碼段級(jí)別

        代碼段是程序比較的單位,這意味著代碼需要以特定的粒度級(jí)別進(jìn)行抽象?,F(xiàn)有的工作包括5個(gè)級(jí)別的代碼段:不帶上下文的補(bǔ)丁級(jí)、切片級(jí)、帶上下文的補(bǔ)丁級(jí)、函數(shù)片段級(jí)和文件/構(gòu)件代碼段級(jí)。在不帶上下文的補(bǔ)丁級(jí)別,通過提取前綴為“-”的連續(xù)行(表示刪去的行),從 diff文件中獲取代碼段。這種粒度已用于錯(cuò)誤檢測(cè)。在切片級(jí)別,基于程序依賴圖對(duì)程序進(jìn)行切片。由于切片通常保留了程序依賴圖的結(jié)構(gòu),因此代碼相似性通過子圖間的同構(gòu)來表示。切片級(jí)粒度已用于代碼復(fù)制檢測(cè)[12]和漏洞檢測(cè)[13]。在帶上下文的補(bǔ)丁級(jí)別,通過提取前綴為“-”的行和沒有前綴的行,從diff補(bǔ)丁文件中獲取片段。這種粒度已用于缺陷檢測(cè)[7]和漏洞檢測(cè)[3,4]。在函數(shù)片段級(jí)別,函數(shù)作為獨(dú)立的單位,已用于漏洞檢測(cè)[6,8]和代碼復(fù)制檢測(cè)[1]。在文件/構(gòu)件代碼段級(jí)別,每個(gè)文件/構(gòu)件都被視為一個(gè)單元,這種粗粒度級(jí)別主要用于漏洞預(yù)測(cè)[1-2]。

        3) 比較方法

        代碼相似性方法中的比較主要包括兩種方法:向量比較和近似/精確匹配。向量比較方法首先將漏洞的表征和目標(biāo)程序的表征轉(zhuǎn)換為向量,然后通過比較這些向量來檢測(cè)漏洞。近似/精確匹配方法是通過包含關(guān)系[3,4,7]、子串匹配[14]、完整子圖同構(gòu)匹配或近似γ-同構(gòu)匹配,在目標(biāo)程序的代碼表征中查找漏洞表征。

        基于代碼相似性的漏洞檢測(cè)方法只需要單個(gè)漏洞代碼實(shí)例就可以檢測(cè)目標(biāo)程序中的相同漏洞,但它局限于檢測(cè)類型I和類型II的代碼復(fù)制[15](即相同或幾乎相同的代碼復(fù)制)和部分類型 III的代碼復(fù)制[15](如語句的刪除、插入和移動(dòng))引發(fā)的漏洞。即使使用人工定義的特征來增強(qiáng)基于代碼相似性的漏洞檢測(cè)能力,也很難檢測(cè)那些不是由代碼復(fù)制引發(fā)的漏洞,因此當(dāng)用來檢測(cè)不是由代碼復(fù)制引發(fā)的漏洞時(shí),會(huì)導(dǎo)致很高的漏報(bào)率。

        3 基于符號(hào)執(zhí)行的漏洞檢測(cè)

        基于符號(hào)執(zhí)行的漏洞檢測(cè)方法使用中間語言,結(jié)合符號(hào)執(zhí)行和約束求解來檢測(cè)漏洞。通過使用符號(hào)執(zhí)行技術(shù),將程序中變量的值表示為符號(hào)值和常量組成的計(jì)算表達(dá)式,而一些程序漏洞可以表現(xiàn)為某些相關(guān)變量的取值不滿足相應(yīng)的約束。通過判斷表示變量取值的表達(dá)式是否滿足相應(yīng)的約束,來檢測(cè)程序是否存在相應(yīng)的漏洞。約束求解過程一方面判斷路徑條件是否可滿足,根據(jù)判斷條件對(duì)分析的路徑進(jìn)行取舍,另一方面檢查程序存在漏洞的條件是否可以滿足。符號(hào)執(zhí)行的過程常常需要利用一定的漏洞分析規(guī)則,分析規(guī)則描述在什么情況下需要引入符號(hào),以及在什么情況下程序可能存在漏洞等信息。通過對(duì)漏洞分析初步結(jié)果進(jìn)行進(jìn)一步的確認(rèn)處理,得到最終的漏洞分析結(jié)果。

        Liang等[16]提出了一個(gè)基于LLVM中間表征的靜態(tài)分析工具,結(jié)合符號(hào)執(zhí)行和Z3 SMT解釋器來發(fā)現(xiàn)缺陷,能夠檢測(cè)3種類型的程序缺陷,即除零錯(cuò)誤、指針溢出和死代碼。Cassez等[17]提出了一個(gè)靜態(tài)分析工具,能夠分析LLVM中間表征,并檢查是否存在可以到達(dá)LLVM中間表征中某個(gè)指定錯(cuò)誤塊的一次運(yùn)行。Thome等[18]提出一個(gè)搜索驅(qū)動(dòng)的約束求解技術(shù),采用基于蟻群優(yōu)化元啟發(fā)式算法的混合約束求解過程,作為任何現(xiàn)有字符串求解器提供的復(fù)雜字符串操作的補(bǔ)充。沈維軍等[19]基于動(dòng)靜態(tài)相結(jié)合的程序分析與符號(hào)執(zhí)行技術(shù),通過數(shù)值變量符號(hào)式提取、靜態(tài)攻擊流程分析以及高精度動(dòng)態(tài)攻擊驗(yàn)證來檢測(cè)和分析軟件中可能存在的數(shù)值穩(wěn)定性相關(guān)安全漏洞。

        基于符號(hào)執(zhí)行的漏洞檢測(cè)方法能夠生成觸發(fā)漏洞的具體輸入,能夠利用符號(hào)執(zhí)行工具生成的輸入驗(yàn)證并分析漏洞。然而由于約束求解器無法求解所有形式的約束,符號(hào)執(zhí)行的分析精度也會(huì)受到影響;同時(shí)由于開銷大,往往無法擴(kuò)展到大規(guī)模程序。

        4 基于規(guī)則的漏洞檢測(cè)

        基于規(guī)則的漏洞檢測(cè)方法由專家針對(duì)各類漏洞人工分析生成漏洞規(guī)則,在詞法語法解析基礎(chǔ)上,對(duì)源代碼建模[20],進(jìn)行數(shù)據(jù)流分析、污點(diǎn)分析等。數(shù)據(jù)流分析是一種用來獲取相關(guān)數(shù)據(jù)沿著程序執(zhí)行路徑流動(dòng)的信息分析技術(shù),分析對(duì)象是程序執(zhí)行路徑上的數(shù)據(jù)流動(dòng)或可能的取值。數(shù)據(jù)流分析可以獲得程序變量在某個(gè)程序點(diǎn)上的性質(zhì)、狀態(tài)或取值等關(guān)鍵信息,而一些程序漏洞的特征恰好可以表現(xiàn)為特定程序變量在特定程序點(diǎn)上的性質(zhì)、狀態(tài)或取值不滿足程序安全的規(guī)定,因此數(shù)據(jù)流分析可直接應(yīng)用于檢測(cè)程序漏洞。污點(diǎn)分析[21]是一種跟蹤并分析污點(diǎn)信息在程序中流動(dòng)的技術(shù)。在漏洞分析中,使用污點(diǎn)分析技術(shù)將所感興趣的數(shù)據(jù)標(biāo)記為污點(diǎn)數(shù)據(jù),然后通過跟蹤和污點(diǎn)數(shù)據(jù)相關(guān)信息的流向,可以分析這些信息是否會(huì)影響某些關(guān)鍵的程序操作,進(jìn)而挖掘程序漏洞。

        常見的軟件漏洞檢測(cè)工具包括開源工具Flawfinder、RATS、ITS4[22-24],商業(yè)產(chǎn)品Checkmarx、Fortify、Coverity[25-27]等。開源工具一般采用簡單的解析器和漏洞規(guī)則,因此誤報(bào)漏報(bào)高;商業(yè)產(chǎn)品Checkmarx基于源代碼進(jìn)行數(shù)據(jù)流分析,不需要編譯,解析能力明顯優(yōu)于開源工具;商業(yè)產(chǎn)品Fortify和Coverity基于中間語言進(jìn)行數(shù)據(jù)流分析,需要對(duì)源代碼進(jìn)行編譯,檢測(cè)效果一般優(yōu)于直接分析源代碼的方法,但專家生成的漏洞規(guī)則仍然不夠完善。

        基于規(guī)則的漏洞檢測(cè)方法中漏洞規(guī)則的生成依賴人類專家,因此主觀性強(qiáng)。漏洞檢測(cè)能夠精確定位到漏洞行,但由于人工定義的漏洞規(guī)則很難考慮全各種區(qū)分有漏洞和無漏洞的情況,規(guī)則的不完善導(dǎo)致漏洞檢測(cè)具有較高的誤報(bào)和漏報(bào)[28]。

        5 基于機(jī)器學(xué)習(xí)的漏洞檢測(cè)

        機(jī)器學(xué)習(xí)技術(shù)可以分為3種主要方法。1) 監(jiān)督學(xué)習(xí):學(xué)習(xí)系統(tǒng)基于一組標(biāo)記的訓(xùn)練樣本學(xué)習(xí)所需的模型,其中每個(gè)樣本由輸入數(shù)據(jù)(通常是向量)和所需的相應(yīng)輸出值(標(biāo)簽)組成。2) 無監(jiān)督學(xué)習(xí):在沒有標(biāo)記訓(xùn)練數(shù)據(jù)的情況下,學(xué)習(xí)系統(tǒng)的目標(biāo)是識(shí)別給定數(shù)據(jù)集中的模式和結(jié)構(gòu)。3) 強(qiáng)化學(xué)習(xí):通過與動(dòng)態(tài)環(huán)境的互動(dòng)來接受獎(jiǎng)勵(lì)和懲罰,訓(xùn)練學(xué)習(xí)系統(tǒng)達(dá)到某個(gè)目標(biāo)。應(yīng)用于漏洞檢測(cè)的機(jī)器學(xué)習(xí)技術(shù)目前主要涉及前兩種,下面按照是否需要人類專家定義特征分為基于傳統(tǒng)機(jī)器學(xué)習(xí)方法和基于深度學(xué)習(xí)方法兩類,并分別對(duì)其進(jìn)行介紹。

        5.1 基于傳統(tǒng)機(jī)器學(xué)習(xí)的方法

        傳統(tǒng)的機(jī)器學(xué)習(xí)方法通過人工定義特征屬性,然后采用機(jī)器學(xué)習(xí)方法,如支持向量機(jī)、k近鄰等進(jìn)行分類?;趥鹘y(tǒng)機(jī)器學(xué)習(xí)的漏洞檢測(cè)方法包括兩類:針對(duì)特定漏洞類型的方法和漏洞類型無關(guān)的方法。

        針對(duì)特定漏洞類型的方法前提是借助專家知識(shí)(如漏洞原理)將漏洞分為不同類型,而某種類型的漏洞,通過機(jī)器學(xué)習(xí)技術(shù)學(xué)習(xí)漏洞模式。Yamaguchi等[29]針對(duì)C程序缺少檢查漏洞,提出了一個(gè)在源代碼中自動(dòng)識(shí)別缺少檢查的方法Chucky,靜態(tài)地對(duì)源代碼加污點(diǎn),并識(shí)別與安全關(guān)鍵對(duì)象關(guān)聯(lián)的異常條件或缺少的條件;針對(duì) C程序污點(diǎn)類型漏洞,提出了自動(dòng)推斷搜索模式的方法,給定一個(gè)安全敏感的 sink,如內(nèi)存函數(shù),該方法自動(dòng)識(shí)別相應(yīng)的source-sink系統(tǒng)以及構(gòu)建系統(tǒng)中數(shù)據(jù)流和凈化的模式[30]。此外,還有針對(duì)格式化字符串漏洞[31]、信息泄露漏洞等的漏洞檢測(cè)[32]等。針對(duì)特定漏洞類型的方法中,每種方法僅限于檢測(cè)一種類型漏洞,而且要求專家定義幫助識(shí)別特定類型漏洞的特征。

        漏洞類型無關(guān)的方法針對(duì)各種類型的漏洞,采用機(jī)器學(xué)習(xí)技術(shù),如支持向量機(jī)、k近鄰等學(xué)習(xí)漏洞模式依靠專家手工定義特征來刻畫漏洞。Grieco等[33]采用系統(tǒng)調(diào)用作為特征來刻畫漏洞,以整個(gè)程序?yàn)榱6葋頇z測(cè)漏洞。Neuhaus等[34]采用導(dǎo)入和函數(shù)調(diào)用作為特征來刻畫漏洞,以構(gòu)件為粒度來預(yù)測(cè)漏洞,采用依賴的名字來預(yù)測(cè)哪個(gè)包中含有漏洞。Shin等[35]采用復(fù)雜度、代碼變化和開發(fā)人員活動(dòng)作為特征來刻畫漏洞,以文件為粒度來預(yù)測(cè)漏洞。Moshtari等[36]針對(duì)跨項(xiàng)目的漏洞預(yù)測(cè),對(duì)復(fù)雜性、耦合度以及新提出的耦合度量指標(biāo)集進(jìn)行了評(píng)價(jià)和比較。Scandariato[37]等將每個(gè)構(gòu)件表征為一系列的源代碼中的詞以及出現(xiàn)的頻率,通過對(duì)構(gòu)件源代碼的文本挖掘來預(yù)測(cè)一個(gè)構(gòu)件是否含有漏洞。

        基于傳統(tǒng)機(jī)器學(xué)習(xí)的漏洞檢測(cè)方法依賴于專家手工定義特征屬性,采用機(jī)器學(xué)習(xí)模型自動(dòng)對(duì)漏洞代碼和無漏洞代碼進(jìn)行分類。但由于輸入機(jī)器學(xué)習(xí)模型的代碼粒度通常較粗,無法確定漏洞行的確切位置。

        5.2 基于深度學(xué)習(xí)的方法

        基于深度學(xué)習(xí)的方法不需要專家手工定義特征,可以自動(dòng)生成漏洞模式,在漏洞檢測(cè)方面的相關(guān)研究目前剛剛起步。Lin等[38]針對(duì)跨項(xiàng)目情況,采用深度學(xué)習(xí)模型在函數(shù)級(jí)別檢測(cè)漏洞。Xu等[39]采用神經(jīng)網(wǎng)絡(luò)方法在函數(shù)級(jí)別進(jìn)行基于代碼相似性的二進(jìn)制漏洞檢測(cè)。Rajpal等[40]針對(duì)模糊測(cè)試發(fā)現(xiàn)漏洞的過程,采用神經(jīng)網(wǎng)絡(luò)從過去模糊探測(cè)的輸入文件中學(xué)習(xí)模式來指導(dǎo)未來的模糊探測(cè)。Russell等[41]針對(duì)C/C++開源軟件代碼,開發(fā)了一個(gè)大規(guī)模函數(shù)級(jí)漏洞檢測(cè)系統(tǒng),針對(duì)詞法解析后的源代碼學(xué)習(xí)深度特征表征,并利用3個(gè)不同的靜態(tài)分析檢測(cè)工具的結(jié)果構(gòu)建了一個(gè)開源軟件數(shù)據(jù)集。Harer等[42]針對(duì) C/C++程序,采用機(jī)器學(xué)習(xí)方法進(jìn)行數(shù)據(jù)驅(qū)動(dòng)的漏洞檢測(cè),基于一個(gè)靜態(tài)分析器的結(jié)果構(gòu)建了開源函數(shù)數(shù)據(jù)集,比較了應(yīng)用到源代碼和編譯后代碼的效果。然而目前基于深度學(xué)習(xí)的漏洞檢測(cè)方法存在很多不足,主要表現(xiàn)在以下4個(gè)方面:1) 無法精確定位各種類型漏洞,目前工作的漏洞檢測(cè)粒度基本都在函數(shù)級(jí),粒度太粗導(dǎo)致無法定位漏洞的具體位置;2) 缺少涵蓋各種類型漏洞的大規(guī)模標(biāo)注數(shù)據(jù)集;3) 現(xiàn)有工作面向漏洞檢測(cè)采用的深度學(xué)習(xí)模型有限,哪種深度學(xué)習(xí)模型更適合檢測(cè)漏洞,或者更適合檢測(cè)哪種類型的漏洞尚不清楚;4) 現(xiàn)有工作只能檢測(cè)是否含有漏洞,無法提供更全面的漏洞信息。

        在軟件缺陷預(yù)測(cè)方面,Yang等[43]采用深度學(xué)習(xí)技術(shù)來預(yù)測(cè)代碼更改中的缺陷。Wang等[44]采用深度信念網(wǎng)絡(luò)從源代碼中自動(dòng)學(xué)習(xí)程序的語義表征,在文件級(jí)預(yù)測(cè)軟件缺陷。Phan等[45]利用表征程序執(zhí)行流程的控制流圖來自動(dòng)學(xué)習(xí)缺陷特征,進(jìn)行缺陷預(yù)測(cè)。Li等[46]提出了基于卷積神經(jīng)網(wǎng)絡(luò)進(jìn)行缺陷預(yù)測(cè)的框架DP-CNN,基于程序的抽象語法樹,利用深度學(xué)習(xí)來生成有效的特征。Dam等[47]提出能夠自動(dòng)學(xué)習(xí)源碼特征,采用樹結(jié)構(gòu)的長短期記憶網(wǎng)絡(luò),來直接匹配抽象語法樹表征的源代碼,用于缺陷預(yù)測(cè)。然而這些軟件缺陷預(yù)測(cè)方法無法用于漏洞檢測(cè),因?yàn)槲墨I(xiàn)[43]提出的缺陷預(yù)測(cè)方法適用于檢測(cè)代碼更改中的缺陷,無法針對(duì)整個(gè)目標(biāo)程序,文獻(xiàn)[44-47]的方法在文件級(jí)或程序級(jí)表征程序進(jìn)行缺陷預(yù)測(cè),若應(yīng)用于漏洞檢測(cè),則粒度太粗導(dǎo)致無法定位漏洞。

        在軟件缺陷檢測(cè)方面,通常結(jié)合針對(duì)缺陷報(bào)告的信息檢索技術(shù)來檢測(cè)和定位源代碼中的缺陷。Huo等[48]利用詞法和程序結(jié)構(gòu)信息,學(xué)習(xí)來自自然語言和編程語言源代碼中的統(tǒng)一特征,提出了一個(gè)卷積神經(jīng)網(wǎng)絡(luò)NP-CNN,依據(jù)缺陷報(bào)告自動(dòng)定位潛在的缺陷代碼。Xiao等[49]采用卷積神經(jīng)網(wǎng)絡(luò)和級(jí)聯(lián)森林提取語義和結(jié)構(gòu)特征,根據(jù)缺陷報(bào)告來定位缺陷文件。然而缺陷檢測(cè)方法不能用于檢測(cè)漏洞,主要原因是:一方面,缺陷不一定是漏洞;另一方面,上述缺陷檢測(cè)通常依賴缺陷報(bào)告,而在漏洞檢測(cè)中是無法提供漏洞報(bào)告的。

        此外,深度學(xué)習(xí)技術(shù)也開始應(yīng)用到程序分析中與漏洞檢測(cè)相關(guān)性較小的其他研究領(lǐng)域,如異常檢測(cè)[50]、軟件語言建模[51]、代碼復(fù)制檢測(cè)[52]、API學(xué)習(xí)[53]、二進(jìn)制函數(shù)邊界識(shí)別[54]、惡意 URL、文件路徑檢測(cè)和注冊(cè)表鍵檢測(cè)[55]、修復(fù)程序錯(cuò)誤[56]、軟件的可追溯性[57]、預(yù)測(cè)程序的屬性[58]、代碼作者歸屬[59]等。

        基于深度學(xué)習(xí)的漏洞檢測(cè)方法不需要專家手工定義特征,可以自動(dòng)生成漏洞模式,有望改變軟件源代碼漏洞檢測(cè)方法,使面向各種類型漏洞的漏洞模式從依賴專家手工定義向自動(dòng)生成轉(zhuǎn)變,并且顯著提高漏洞檢測(cè)的有效性。然而目前該方法的相關(guān)研究剛剛起步,在漏洞定位、數(shù)據(jù)集構(gòu)建、深度學(xué)習(xí)模型解釋等方面有待深入研究。

        6 實(shí)例1:基于源代碼相似性的漏洞檢測(cè)

        6.1 問題闡述

        代碼復(fù)制的廣泛存在使一個(gè)軟件漏洞可能存在于多個(gè)應(yīng)用程序中,修補(bǔ)主機(jī)的某個(gè)漏洞并不意味著能夠完全排除該漏洞對(duì)主機(jī)的潛在威脅。因此,當(dāng)有針對(duì)某個(gè)漏洞的補(bǔ)丁公布時(shí),應(yīng)及時(shí)檢查主機(jī)中其他軟件是否也存在該漏洞,即在給定漏洞和源代碼的前提下,能夠自動(dòng)判斷源代碼中是否含有該漏洞,如果有,給出具體位置,以便于及時(shí)修補(bǔ)。上述問題主要面臨兩個(gè)挑戰(zhàn):一是尚不存在能夠用來評(píng)測(cè)基于代碼相似性進(jìn)行漏洞檢測(cè)研究的數(shù)據(jù)集;二是不存在某個(gè)代碼相似性算法適用于所有漏洞。

        6.2 解決方案

        針對(duì)上述問題與挑戰(zhàn),在構(gòu)建用于評(píng)價(jià)的數(shù)據(jù)集基礎(chǔ)上,基于漏洞代碼特征,實(shí)現(xiàn)基于源代碼相似性的漏洞檢測(cè)系統(tǒng) VulPecker[60],降低誤報(bào)與漏報(bào)。系統(tǒng)整體結(jié)構(gòu)圖1所示,包括兩個(gè)階段:學(xué)習(xí)階段和檢測(cè)階段。學(xué)習(xí)階段用來選擇對(duì)給定漏洞有效的代碼相似性算法,選擇的算法反過來指導(dǎo)漏洞簽名的生成以及檢測(cè)階段的復(fù)制漏洞檢測(cè)。

        給定一個(gè)漏洞及其補(bǔ)丁,該漏洞可以通過描述漏洞補(bǔ)丁的diff文件來刻畫。漏洞補(bǔ)丁diff文件由一個(gè)或多個(gè)diff塊組成,對(duì)于每個(gè)diff塊,定義以下兩個(gè)特征集合:基本特征和修補(bǔ)特征,如表1所示?;咎卣鲗?duì)應(yīng)表1中的類型1,包括漏洞的唯一標(biāo)識(shí)符CVE ID、描述漏洞類型的通用弱點(diǎn)枚舉標(biāo)識(shí)符CWE ID、廠商、受影響的產(chǎn)品和漏洞嚴(yán)重度。修補(bǔ)特征對(duì)應(yīng)表1中的類型2~類型 6,描述了從修補(bǔ)前代碼段到修補(bǔ)后代碼段的代碼變化。

        表1 漏洞diff塊特征

        圖1 VulPecker的結(jié)構(gòu)

        為了構(gòu)建數(shù)據(jù)集,首先選擇具有一系列發(fā)布版本且由C/C++語言開發(fā)的開源軟件產(chǎn)品,從美國國家漏洞庫(NVD)中篩選出19個(gè)軟件產(chǎn)品?;诤Y選后的產(chǎn)品,構(gòu)建了一個(gè)包含1 761個(gè)漏洞(含3 454個(gè)漏洞補(bǔ)丁diff 塊)的漏洞補(bǔ)丁數(shù)據(jù)庫(VPD)和一個(gè)包含455個(gè)漏洞代碼復(fù)制實(shí)例的漏洞代碼實(shí)例漏洞庫(VCID)。diff塊數(shù)量和漏洞代碼復(fù)制實(shí)例數(shù)量的差距表明,許多 diff塊沒有得到對(duì)應(yīng)的漏洞代碼復(fù)制實(shí)例。

        基于上述構(gòu)建的數(shù)據(jù)集,直接從 NVD漏洞庫中提取類型1的特征;通過對(duì)diff塊進(jìn)行文本分析和簡單的語法分析,分別提取類型 2和類型6的特征;接著針對(duì)漏洞代碼和修補(bǔ)后代碼,采用 Joern[10]工具在函數(shù)級(jí)分別生成各自的抽象語法樹(AST),通過gumtree算法[61]對(duì)兩棵AST中節(jié)點(diǎn)進(jìn)行匹配,根據(jù)匹配節(jié)點(diǎn)集合以及不匹配節(jié)點(diǎn)信息,生成從漏洞代碼到修補(bǔ)后代碼的編輯操作序列,最后根據(jù)編輯操作對(duì)應(yīng)的節(jié)點(diǎn)信息提取出diff塊具有類型3~類型5的特征。

        代碼相似度算法選擇引擎是 VulPecker的核心部分,用于確定哪個(gè)代碼相似性算法對(duì)哪個(gè)漏洞有效。通過向算法引擎中輸入候選代碼相似性算法、漏洞diff塊特征向量、準(zhǔn)確率閾值和VCID數(shù)據(jù)庫,引擎會(huì)自動(dòng)輸出 CVE-算法映射表。整個(gè)過程主要包括以下3個(gè)步驟,如圖2所示。首先,選擇能夠區(qū)分漏洞代碼和修補(bǔ)后代碼的代碼相似性算法;然后,識(shí)別具有最合適代碼段級(jí)別的代碼相似性算法;最后,選擇對(duì)于VCID具有最低漏報(bào)率的代碼相似性算法。

        基于上述步驟選擇合適的代碼相似性算法后,需要生成漏洞簽名。漏洞簽名的生成包括兩個(gè)步驟。首先,通過提取前綴為“-”的行和沒有前綴的行來獲取漏洞diff代碼,通過提取前綴為“+”的行和沒有前綴的行來獲取修補(bǔ)后diff代碼。根據(jù)每個(gè)diff塊以及為該diff塊選擇的代碼相似性算法所使用的代碼段級(jí)別,從漏洞軟件的源代碼中提取出漏洞代碼段。然后,對(duì)于每個(gè)diff塊,對(duì)上一步獲得的漏洞/修補(bǔ)后diff代碼和漏洞代碼段進(jìn)行預(yù)處理并表示。因?yàn)閐iff塊中給出的代碼語句可能不完整,因此對(duì)于基于樹或圖的代碼相似性算法,需要從漏洞代碼段中提取缺失的部分。根據(jù)為diff塊選擇的代碼相似性算法所使用的代碼表征,來表示預(yù)處理后的漏洞/修補(bǔ)后diff代碼和漏洞代碼段,作為漏洞簽名用于漏洞檢測(cè)。

        圖2 代碼相似性算法的選擇過程

        最后,基于已有的 CVE-算法映射表進(jìn)行漏洞檢測(cè)。CVE-算法映射表能夠提供關(guān)于指定diff塊的代碼相似性算法及其代碼片段級(jí)別、代碼表征和比較方法的信息。給定diff塊和目標(biāo)程序,在對(duì)目標(biāo)程序經(jīng)過有關(guān)空格、格式和注釋等預(yù)處理后,通過為diff塊選擇的代碼相似性算法使用的代碼表征生成目標(biāo)程序簽名。漏洞檢測(cè)引擎采用為diff塊選擇的代碼相似性算法使用的比較方法從目標(biāo)程序簽名中搜索漏洞簽名。如果找到漏洞簽名,則報(bào)告目標(biāo)程序中漏洞的位置。

        6.3 效果評(píng)測(cè)

        針對(duì)3個(gè)開源軟件產(chǎn)品(即Firefox、FFmpeg和Qemu)在2013到2015年公布的246個(gè)漏洞,使用上述漏洞的漏洞簽名和 CVE-算法映射表判斷目標(biāo)產(chǎn)品中是否含有上述漏洞中的一個(gè)或多個(gè)。VulPecker檢測(cè)出了40個(gè)在NVD漏洞庫中沒有公布的漏洞。在這些漏洞中,有18個(gè)未知漏洞,已報(bào)告廠商。對(duì)于剩余的22個(gè)漏洞進(jìn)行了手動(dòng)檢查和確認(rèn),在相關(guān)軟件的后續(xù)發(fā)布版本中默默地進(jìn)行了修補(bǔ),從漏洞發(fā)布到修補(bǔ)的首個(gè)版本發(fā)布的平均時(shí)間為7.3個(gè)月。

        7 實(shí)例2:面向源代碼的軟件漏洞智能檢測(cè)

        7.1 問題闡述

        現(xiàn)有的漏洞靜態(tài)分析方法存在兩個(gè)問題。第一,依賴人類專家定義漏洞特征。由于漏洞特征復(fù)雜,即使對(duì)專家而言也是一個(gè)冗長乏味、主觀性強(qiáng)、易出錯(cuò)的工作。不同專家定義的漏洞特征可能不同,漏洞特征的質(zhì)量決定了漏洞檢測(cè)系統(tǒng)的有效性。第二,現(xiàn)有的漏洞檢測(cè)方法漏報(bào)較高。一個(gè)具有高誤報(bào)的漏洞檢測(cè)系統(tǒng)是不可用的,而具有高漏報(bào)的漏洞檢測(cè)系統(tǒng)是無用的。理想的漏洞檢測(cè)系統(tǒng)是同時(shí)滿足低誤報(bào)和低漏報(bào)的,但通常二者很難同時(shí)滿足,更好的處理方法是強(qiáng)調(diào)低漏報(bào),只要誤報(bào)在可接受的范圍內(nèi)。

        借鑒計(jì)算機(jī)視覺領(lǐng)域中的目標(biāo)檢測(cè)過程,將深度學(xué)習(xí)用于漏洞檢測(cè)領(lǐng)域,主要存在以下三方面挑戰(zhàn):一是目標(biāo)檢測(cè)能夠很自然地利用圖像中的紋理、邊緣和顏色等信息定義候選區(qū)域,漏洞檢測(cè)則沒有明顯的細(xì)粒度代碼結(jié)構(gòu)來描述漏洞的候選區(qū)域;二是目標(biāo)檢測(cè)擁有海量的人工標(biāo)注類別的圖像數(shù)據(jù)集,但目前沒有標(biāo)注好的涵蓋各種類型漏洞的大規(guī)模數(shù)據(jù)集,且人工標(biāo)注漏洞的難度遠(yuǎn)比標(biāo)注圖像大得多;三是目標(biāo)檢測(cè)采用適合圖像處理的卷積神經(jīng)網(wǎng)絡(luò)(CNN)模型來學(xué)習(xí)特征,然而程序源代碼與圖像不同,更關(guān)注語句上下文信息,且漏洞源代碼數(shù)據(jù)具有自身的特點(diǎn)。

        7.2 解決方案

        為了解決上述問題,本文開展了基于深度學(xué)習(xí)的漏洞檢測(cè)研究。該方法具有很大潛力,因?yàn)樯疃葘W(xué)習(xí)不需要人類專家定義特征,但同時(shí)也具有挑戰(zhàn),因?yàn)樯疃葘W(xué)習(xí)不是為漏洞檢測(cè)這種應(yīng)用而產(chǎn)生的。本文主要探討了將深度學(xué)習(xí)用于漏洞檢測(cè)的指導(dǎo)原則,包括將深度學(xué)習(xí)用于漏洞檢測(cè)的程序表征、代碼粒度以及神經(jīng)網(wǎng)絡(luò)的選擇。具體來說,采用代碼段(code gadget)來表征程序,其中代碼段是語義相關(guān)的多行代碼(可以不連續(xù)),通過編碼為向量作為深度學(xué)習(xí)模型的輸入。針對(duì)緩沖區(qū)漏洞和資源管理異常漏洞,構(gòu)建了含61 638個(gè)代碼段的訓(xùn)練集,以代碼段為粒度檢測(cè)漏洞,提出了基于深度學(xué)習(xí)的漏洞檢測(cè)系統(tǒng)VulDeePecker[62],漏洞檢測(cè)過程如圖3所示。

        基于雙向長短期記憶網(wǎng)絡(luò)模型(BLSTM)自動(dòng)學(xué)習(xí)生成漏洞模式,在不需要人類專家定義特征的前提下,自動(dòng)檢測(cè)目標(biāo)程序是否含有漏洞,并給出漏洞代碼的位置。該模型包括兩個(gè)階段:學(xué)習(xí)階段和檢測(cè)階段。學(xué)習(xí)階段針對(duì)訓(xùn)練程序,包括以下4個(gè)步驟。

        步驟1生成代碼段。首先提取庫/API函數(shù)調(diào)用,然后針對(duì)庫/API函數(shù)調(diào)用的每個(gè)參數(shù)提取一個(gè)或多個(gè)程序切片,最后將針對(duì)同一個(gè)庫/API函數(shù)調(diào)用的多個(gè)切片組合成為一個(gè)代碼段。

        步驟 2為代碼段加標(biāo)簽。根據(jù)已知的漏洞信息及漏洞位置,給生成的代碼段加漏洞標(biāo)簽“1”或無漏洞標(biāo)簽“0”。

        步驟 3將代碼段轉(zhuǎn)換為向量。首先將代碼段轉(zhuǎn)換為符號(hào)表征來容納更多的語義信息,然后將符號(hào)表征轉(zhuǎn)換為向量,作為BLSTM神經(jīng)網(wǎng)絡(luò)的輸入。

        步驟 4訓(xùn)練 BLSTM 神經(jīng)網(wǎng)絡(luò)。將轉(zhuǎn)換為向量的代碼段及其標(biāo)簽輸入標(biāo)準(zhǔn)的BLSTM神經(jīng)網(wǎng)絡(luò)進(jìn)行訓(xùn)練。

        檢測(cè)階段針對(duì)目標(biāo)程序,包括步驟5~步驟7,其中步驟5與步驟1類似,步驟6與步驟3類似。在步驟7中,對(duì)代碼段進(jìn)行分類。采用學(xué)習(xí)階段訓(xùn)練好的BLSTM神經(jīng)網(wǎng)絡(luò),對(duì)目標(biāo)程序的代碼段進(jìn)行分類,若分類為 1,則為有漏洞,否則為無漏洞。

        7.3 效果評(píng)測(cè)

        本文針對(duì)能否同時(shí)處理多類漏洞、人類經(jīng)驗(yàn)?zāi)芊窀倪M(jìn)有效性、與其他靜態(tài)檢測(cè)方法的有效性比較這3個(gè)方面對(duì)VulDeePecker的有效性進(jìn)行了評(píng)價(jià)。實(shí)驗(yàn)結(jié)果表明,VulDeePecker可以應(yīng)用到多類漏洞,其有效性與安全相關(guān)庫/API函數(shù)的個(gè)數(shù)有關(guān);人類經(jīng)驗(yàn)可用于選擇和安全有關(guān)的庫/API函數(shù),能夠改進(jìn) VulDeePecker的有效性;VulDeePecker比人工定義規(guī)則的靜態(tài)分析工具(開源工具和商業(yè)工具)更有效,比基于代碼相似性的漏洞檢測(cè)方法具有更低的漏報(bào),其有效性受數(shù)據(jù)量的影響。此外,VulDeePecker在 Xen、Seamonkey和Libav這3個(gè)開源軟件產(chǎn)品中檢測(cè)到4個(gè)在NVD漏洞庫中未公布的漏洞,這些漏洞在相應(yīng)軟件的后續(xù)版本中默默地進(jìn)行了修補(bǔ)。而這些漏洞幾乎未能被其他漏洞檢測(cè)系統(tǒng)檢測(cè)到。更準(zhǔn)確地說,一個(gè)漏洞檢測(cè)系統(tǒng)檢測(cè)出了4個(gè)漏洞中的1個(gè),漏掉了3個(gè),而其他漏洞檢測(cè)系統(tǒng)漏掉了全部。

        圖3 VulDeePecker的漏洞檢測(cè)過程

        8 局限性及未來展望

        本節(jié)對(duì)第6節(jié)和第7節(jié)實(shí)例解決方案的局限性進(jìn)行闡述,并展望了未來的漏洞檢測(cè)研究工作。

        基于源代碼相似性的漏洞檢測(cè)系統(tǒng)VulPecker的局限性主要表現(xiàn)在以下方面:首先,目前的實(shí)驗(yàn)集中于 C/C++開源軟件,雖然VulPecker本身對(duì)語言沒有限制,但需要針對(duì)其他語言程序(如Java或者python)的效果進(jìn)行實(shí)驗(yàn)研究,也有待于擴(kuò)展到中間語言等級(jí)別;其次,VPD和VCID數(shù)據(jù)庫的構(gòu)建尚不完善,如在創(chuàng)建VPD的過程中使用了啟發(fā)式方法。盡管通過取樣并進(jìn)行人工分析驗(yàn)證了啟發(fā)式能產(chǎn)生相對(duì)正確的結(jié)果,但有待通過大規(guī)模的實(shí)驗(yàn)進(jìn)行進(jìn)一步的驗(yàn)證。最后,在未來的工作中,需要在性能方面進(jìn)行改進(jìn),使其能夠針對(duì)大規(guī)模軟件進(jìn)行檢測(cè),提高可擴(kuò)展性。

        面向源代碼的軟件漏洞智能檢測(cè)系統(tǒng)VulDeePecker雖然檢測(cè)效果比傳統(tǒng)的漏洞檢測(cè)方法更好,但仍存在一些局限性。第一,目前只能處理C/C++程序,未來工作希望能夠適用于處理更多其他的編程語言。第二,目前只能處理與庫/ API函數(shù)調(diào)用相關(guān)的漏洞,如何針對(duì)其他類型漏洞提取代碼段需要進(jìn)一步研究。第三,雖然代碼段可同時(shí)基于數(shù)據(jù)依賴和控制依賴分析,但是目前借助商業(yè)工具提取的代碼段只涵蓋了數(shù)據(jù)依賴。提高數(shù)據(jù)依賴分析的利用以及采用控制依賴提高漏洞檢測(cè)能力是未來的一項(xiàng)重要工作。第四,在標(biāo)記代碼段、轉(zhuǎn)化為符號(hào)表征等階段使用了啟發(fā)式方法,未來需要對(duì)啟發(fā)式給漏洞檢測(cè)結(jié)果的有效性影響進(jìn)行評(píng)估。第五,采用的深度學(xué)習(xí)模型局限于BLSTM神經(jīng)網(wǎng)絡(luò),對(duì)其他可用于漏洞檢測(cè)的神經(jīng)網(wǎng)絡(luò)的有效性需要進(jìn)一步研究。最后,目前用于實(shí)驗(yàn)的數(shù)據(jù)集僅包含緩沖區(qū)漏洞和資源管理異常漏洞,需要利用更多漏洞類型、更大規(guī)模的數(shù)據(jù)集對(duì)方法的有效性進(jìn)行評(píng)測(cè)。

        總體來說,未來將陸續(xù)開展以下三方面的研究工作:1) 研究面向訓(xùn)練程序的代碼段標(biāo)注,基于公開漏洞數(shù)據(jù)庫中的大量數(shù)據(jù),對(duì)訓(xùn)練程序中的代碼段進(jìn)行自動(dòng)標(biāo)注,并實(shí)現(xiàn)已標(biāo)注代碼段的數(shù)據(jù)量擴(kuò)充,有望構(gòu)建涵蓋各種類型漏洞的大規(guī)模標(biāo)注數(shù)據(jù)集;2) 研究面向訓(xùn)練程序的漏洞模式智能化學(xué)習(xí),采用面向漏洞代碼數(shù)據(jù)特性的深度學(xué)習(xí)模型實(shí)現(xiàn)各類型漏洞模式的自動(dòng)生成,有望給出哪種深度學(xué)習(xí)模型更適合檢測(cè)哪種類型的漏洞;3)研究面向目標(biāo)程序的漏洞檢測(cè)與模型解釋,基于代碼段進(jìn)行多層級(jí)漏洞檢測(cè),有望提供除是否含有漏洞外更全面的漏洞信息,并且基于漏洞檢測(cè)結(jié)果進(jìn)行深度學(xué)習(xí)模型的解釋,進(jìn)一步改進(jìn)模型的有效性。

        9 結(jié)束語

        基于源代碼的軟件漏洞靜態(tài)檢測(cè)是保障網(wǎng)絡(luò)空間安全技術(shù)的重要研究領(lǐng)域。通過對(duì)給定源代碼進(jìn)行分析,檢測(cè)軟件系統(tǒng)中存在的安全缺陷,從而維護(hù)整個(gè)系統(tǒng)的穩(wěn)定運(yùn)行。本文從實(shí)現(xiàn)源代碼漏洞檢測(cè)的方法角度出發(fā),以采用的技術(shù)類型為分類依據(jù),總結(jié)了現(xiàn)有的源代碼漏洞檢測(cè)研究工作,并重點(diǎn)闡述了基于源代碼相似性的漏洞檢測(cè)系統(tǒng)以及基于深度學(xué)習(xí)的軟件漏洞智能檢測(cè)系統(tǒng)兩個(gè)方案。在此基礎(chǔ)上,分析了源代碼漏洞檢測(cè)研究存在的問題,并對(duì)未來的研究工作進(jìn)行了展望。

        猜你喜歡
        源代碼相似性漏洞
        人工智能下復(fù)雜軟件源代碼缺陷精準(zhǔn)校正
        一類上三角算子矩陣的相似性與酉相似性
        漏洞
        基于TXL的源代碼插樁技術(shù)研究
        淺析當(dāng)代中西方繪畫的相似性
        軟件源代碼非公知性司法鑒定方法探析
        三明:“兩票制”堵住加價(jià)漏洞
        漏洞在哪兒
        低滲透黏土中氯離子彌散作用離心模擬相似性
        揭秘龍湖產(chǎn)品“源代碼”
        亚洲综合网国产精品一区| 2021年性爱喷水视频| 国产精品二区三区在线观看| 午夜国产视频一区二区三区| 久久久无码精品亚洲日韩按摩| 国产精品露脸视频观看| 亚洲成a人片77777kkkkk| 精品国产一区二区三区香| 国产精品扒开腿做爽爽爽视频| 国产露脸精品产三级国产av| 亚洲AV无码一区二区一二区色戒| 亚洲av调教捆绑一区二区三区| 无码色av一二区在线播放| 日本老熟欧美老熟妇| 日日噜噜噜夜夜爽爽狠狠视频| 91一区二区三区在线观看视频| 无码一区二区三区免费视频| chinesefreexxxx国产麻豆| 美腿丝袜一区二区三区| 日本系列中文字幕99| 亚洲欧洲精品无码av| 亚洲乱码一区二区三区成人小说 | 亚洲综合中文字幕综合| 国产成人涩涩涩视频在线观看| 亚洲永久精品ww47永久入口| 亚洲av大片在线免费观看| 亚洲av日韩精品久久久久久a| 国产午夜视频在线观看| 国产V亚洲V天堂A无码| 成人久久久精品乱码一区二区三区| 亚洲精品熟女国产| 国产成人精品三级在线影院| 国产一区二区视频在线看| 强开少妇嫩苞又嫩又紧九色| 成年女人永久免费看片| 一区二区亚洲 av免费| 亚洲一区二区二区视频| 国模少妇一区二区三区| 久久久久亚洲AV无码专区一区| 亚洲一区二区三区精品| 久久久久久久久蜜桃|