王 敏,馮登國(guó),程 亮,張 陽(yáng)
1(中國(guó)科學(xué)技術(shù)大學(xué),合肥 230026)
2(中國(guó)科學(xué)院 軟件研究所 可信計(jì)算與信息保障實(shí)驗(yàn)室,北京 100190)
隨著計(jì)算機(jī)技術(shù)的迅猛發(fā)展以及在各個(gè)行業(yè)中日益廣泛的應(yīng)用.人們的生活和生產(chǎn)方式發(fā)生了前所未有的改變,計(jì)算機(jī)在人們生活、工作生產(chǎn)、國(guó)防事業(yè)、科技研究中所起到的作用越來(lái)越無(wú)法代替.各行各業(yè)都在依靠計(jì)算機(jī)來(lái)實(shí)現(xiàn)生產(chǎn)、管理、銷售、控制等各個(gè)主要流程.然而伴隨而來(lái)的計(jì)算機(jī)安全性的問題也在日益陡增.軟件作為計(jì)算機(jī)中,不可或缺的一部分,軟件的安全性也受到了十分嚴(yán)峻的考驗(yàn).軟件漏洞,又稱為Bug,指的是軟件在具體實(shí)現(xiàn)或系統(tǒng)安全策略上存在的缺陷.攻擊者可以利用漏洞來(lái)完成未授權(quán)的訪問或者是對(duì)系統(tǒng)的破壞.一些我們耳熟能詳?shù)娜湎x病毒、木馬病毒,都是利用軟件漏洞來(lái)植入的,它們會(huì)竊取受害者的信息,拒絕服務(wù)攻擊,傳染給互聯(lián)網(wǎng)上其他的計(jì)算機(jī).某些更嚴(yán)重的漏洞可以被用來(lái)執(zhí)行黑客想執(zhí)行的任意代碼.漏洞的危害不言而喻,所以想要避免這些危害一個(gè)直接的辦法便是在這些漏洞被攻擊者加以利用之前首先找到并修復(fù)這些安全漏洞.
然而,程序漏洞的數(shù)量非常龐大.例如Image Tragick這款軟件,每個(gè)月都可以在這款軟件中找到新的漏洞,并且每年都會(huì)發(fā)現(xiàn)一些影響比較大的嚴(yán)重漏洞,2017年就發(fā)現(xiàn)了357 個(gè)CVE.對(duì)于如此大的危害,我們急需一些方法和手段,在黑客利用這些漏洞之前找出它們.找出安全漏洞的技術(shù)被稱為漏洞挖掘.在目前漏洞挖掘領(lǐng)域中,有一個(gè)越來(lái)越被廣泛使用的方法:模糊測(cè)試[1],它的基本流程如圖1所示.
圖1 模糊測(cè)試基本流程圖
模糊測(cè)試通過某些策略,隨機(jī)生成大量的非預(yù)期輸入種子文件,以這些種子作為目標(biāo)程序的輸入,觀察目標(biāo)程序是否會(huì)出現(xiàn)執(zhí)行異?;蛘弑罎?以此來(lái)檢測(cè)出目標(biāo)程序中的漏洞.模糊測(cè)試相當(dāng)于是去解一個(gè)搜索問題,即從一個(gè)預(yù)先構(gòu)造好的種子輸入開始,搜索經(jīng)過幾百萬(wàn)次變異之后,覆蓋率最高,崩潰最多的種子集合.由于其自動(dòng)化程度較高,所以得到了安全人員的大量廣泛的使用.模糊測(cè)試目前有很多種流派,從編譯策略的不同選擇可以大致分為3 種:白盒模糊測(cè)試[2]、黑盒模糊測(cè)試[3]、灰盒模糊測(cè)試[4].白盒模糊測(cè)試指的是對(duì)目標(biāo)程序的源代碼和程序內(nèi)部的邏輯結(jié)構(gòu)完全了解的情況下,針對(duì)性地對(duì)程序進(jìn)行分析后執(zhí)行模糊測(cè)試,以執(zhí)行程序中更多的代碼塊,提高代碼覆蓋率;黑盒模糊測(cè)試則是無(wú)法獲取目標(biāo)程序的源代碼,對(duì)目標(biāo)程序內(nèi)部的代碼邏輯一無(wú)所知.大部分情況下,源代碼等都是公司或者機(jī)構(gòu)的機(jī)密,無(wú)法輕易獲取.所以針對(duì)這種黑盒情況下一般只會(huì)采用一些簡(jiǎn)單的隨機(jī)變異的方法后進(jìn)行模糊測(cè)試.灰盒模糊測(cè)試介于白盒模糊測(cè)試與黑盒模糊測(cè)試之間.灰盒模糊測(cè)試會(huì)同時(shí)考慮代碼程序的邏輯結(jié)構(gòu)以及觀察目標(biāo)程序執(zhí)行時(shí)的輸出來(lái)獲取一些有價(jià)值的模糊測(cè)試信息,利用這些信息來(lái)更好地指導(dǎo)模糊測(cè)試的效果提升.然而現(xiàn)有的灰盒模糊測(cè)試工具的效果不盡如人意,根據(jù)文獻(xiàn)[5]中的實(shí)驗(yàn)結(jié)果,拿目前最流行的灰盒模糊測(cè)試工具AFL (American Fuzzy Lop)來(lái)說(shuō),它的測(cè)試通過率也僅僅不到30%,所以灰盒模糊測(cè)試的代碼覆蓋率仍有足夠的提升空間.為了解決當(dāng)前模糊測(cè)試測(cè)試率低且代碼覆蓋率不高的問題,我們提出了一個(gè)基于機(jī)器學(xué)習(xí)的框架來(lái)提高模糊測(cè)試的有效性和效率.該框架用來(lái)發(fā)現(xiàn)目標(biāo)種子輸入和待測(cè)目標(biāo)程序執(zhí)行之間的相關(guān)性,然后用該相關(guān)性繼續(xù)指導(dǎo)新種子輸入的生成.然后利用新生成的種子文件作為模糊測(cè)試的輸入,研究新生成的種子輸入文件對(duì)目標(biāo)程序的代碼覆蓋率的影響,從而達(dá)到探索目標(biāo)待測(cè)試程序更多行為的目的.
本文的主要貢獻(xiàn)如下:
(1)我們提出了一個(gè)基于機(jī)器學(xué)習(xí)的框架來(lái)生成模糊測(cè)試的種子文件,利用Transformer 模型來(lái)學(xué)習(xí)PDF 文件內(nèi)部的格式化文件語(yǔ)法,并指導(dǎo)生成全新的完整PDF 文件,用于后續(xù)的模糊測(cè)試.實(shí)驗(yàn)表明對(duì)于mupdf 這款PDF 閱讀器,我們的代碼覆蓋率有了一定提高.
(2)我們提出了兩種采樣算法來(lái)對(duì)學(xué)習(xí)的分布進(jìn)行采樣,在確保obj 對(duì)象序列依據(jù)概率分布進(jìn)行預(yù)測(cè)的同時(shí),保證了生成結(jié)果的多樣性.大大減少了生成的obj 對(duì)象序列存在較多重復(fù)這一問題.
文章后續(xù)章節(jié)的內(nèi)容如下:第2 節(jié)闡述了相關(guān)研究與背景,第3 節(jié)詳細(xì)介紹了我們?cè)O(shè)計(jì)的框架細(xì)節(jié),第4 節(jié)闡述了本文所使用的模型以及在模型上所做的適應(yīng)性改進(jìn).第5 節(jié)介紹了我們實(shí)驗(yàn)的結(jié)果與評(píng)估.最后第6 節(jié)是總結(jié)和展望.
目前國(guó)內(nèi)外對(duì)于提高模糊測(cè)試的效率有很多工作,這些工作大致可以分為兩種策略:一種是改進(jìn)其變異機(jī)制來(lái)智能地生成更可能觸發(fā)目標(biāo)程序中潛在錯(cuò)誤和崩潰的測(cè)試輸入來(lái)實(shí)現(xiàn)增強(qiáng)模糊器的功能;另一種是提高種子輸入的質(zhì)量,以便能夠探索目標(biāo)程序的更多代碼和行為.
改變變異機(jī)制是提高模糊測(cè)試代碼覆蓋率的一種方案,大致可以把改變變異機(jī)制的工作分為兩類:第1 種基于程序的方法關(guān)注程序本身,第2 種基于模糊測(cè)試的方法側(cè)重于模糊測(cè)試本身.第1 種方法會(huì)利用一些程序分析的方法來(lái)探索目標(biāo)程序和種子輸入文件之間的聯(lián)系.例如,文獻(xiàn)[6]中利用了符號(hào)執(zhí)行的技術(shù)提出了一種混合測(cè)試方法,該方法將符號(hào)執(zhí)行技術(shù)和模糊測(cè)試結(jié)合起來(lái).符號(hào)執(zhí)行是一種常用的程序分析技術(shù),它不向程序提供正常的輸入(如數(shù)字),而是提供代表任意值的符號(hào).除了值可以在輸入符號(hào)上使用符號(hào)公式外,執(zhí)行過程與正常執(zhí)行一樣進(jìn)行.符號(hào)執(zhí)行理論上是對(duì)路徑約束求解,所以能夠發(fā)現(xiàn)和探索程序中所有可能的路徑,但實(shí)際上是不可擴(kuò)展的,因?yàn)槁窂降臄?shù)量很快會(huì)呈指數(shù)級(jí)增長(zhǎng),實(shí)際情況下不可能提供無(wú)限大的資源,因此符號(hào)執(zhí)行的缺點(diǎn)是費(fèi)時(shí)費(fèi)力.而模糊測(cè)試比符號(hào)執(zhí)行快得多,一臺(tái)機(jī)器就可以完成一項(xiàng)模糊測(cè)試,因此模糊測(cè)試可以更深入地探索代碼,但是它在廣度上限制了代碼覆蓋的范圍.所以混合測(cè)試是利用符號(hào)執(zhí)行來(lái)擴(kuò)展到各種不同的(唯一的)路徑,然后使用模糊測(cè)試來(lái)快速測(cè)試每個(gè)路徑,從而更好地提高代碼覆蓋率.
第2 種方法是基于模糊測(cè)試的,該方法會(huì)從已經(jīng)執(zhí)行過的模糊測(cè)試中學(xué)習(xí)一些有用的經(jīng)驗(yàn),這些經(jīng)驗(yàn)可以更好地指導(dǎo)種子變異機(jī)制,從而變異出更高質(zhì)量的種子.例如,文獻(xiàn)[7]中提出了一種基于覆蓋的灰盒模糊測(cè)試方法(CGF),CGF 沒有使用任何程序分析的技術(shù),它使用輕量級(jí)的二進(jìn)制工具來(lái)確定由輸入執(zhí)行的路徑的唯一標(biāo)識(shí)符.如果模糊出一個(gè)新的和有趣的路徑,模糊測(cè)試會(huì)保留那個(gè)輸入,否則,它將丟棄該輸入.
這些方法都在一定程度上提高了代碼覆蓋率,但是還是有一定的不足,例如基于程序的方法利用到的符號(hào)執(zhí)行方法效率很低,對(duì)新生成的種子輸入的代碼覆蓋率沒有顯著提高.另外更重要的一點(diǎn)是,當(dāng)種子文件的格式十分復(fù)雜時(shí)[8],普通的基于變異策略的方法產(chǎn)生的新的種子文件很可能連最初的語(yǔ)法檢查都沒法通過,導(dǎo)致生成大量的無(wú)效種子,從而也無(wú)法明顯提高代碼覆蓋率.由于基于變異機(jī)制的方法,針對(duì)于復(fù)雜格式的種子文件,想要提升代碼覆蓋率是比較困難的,因?yàn)檫@種方式生成的新的種子輸入文件很可能無(wú)法通過語(yǔ)法檢查器的檢查.無(wú)論變異機(jī)制有多好,我們都相信初始種子語(yǔ)料庫(kù)的質(zhì)量,就其在目標(biāo)計(jì)劃中可以探索的代碼量而言,對(duì)于模糊測(cè)試的成功具有最重要的影響.其中AFL 僅在初始種子語(yǔ)料庫(kù)覆蓋的15 個(gè)月模糊測(cè)試后,能夠覆蓋目標(biāo)程序(腳本解析器)中多5.1%的行.
目前國(guó)內(nèi)外有很多工作提出了各種方法來(lái)提高輸入種子文件的質(zhì)量來(lái)進(jìn)行模糊測(cè)試,這也是與我們工作最相關(guān)的方法.文獻(xiàn)[9]提出了一種從原始語(yǔ)料庫(kù)中選擇最合適的種子輸入的方案,以此來(lái)最大化目標(biāo)程序的代碼覆蓋率.最近機(jī)器學(xué)習(xí)的火熱也讓很多工作利用神經(jīng)網(wǎng)絡(luò)來(lái)進(jìn)行程序分析和漏洞檢測(cè)相結(jié)合,例如,文獻(xiàn)[10,11]提出了一些神經(jīng)網(wǎng)絡(luò)來(lái)對(duì)數(shù)組進(jìn)行排序和復(fù)制算法進(jìn)行學(xué)習(xí).文獻(xiàn)[12]提出了一種叫Neural FlashFill 的方法來(lái)在特定領(lǐng)域的語(yǔ)言上生成基于正則表達(dá)式的代碼.文獻(xiàn)[13–15]用到了Seq2Seq 這樣先進(jìn)的深度神經(jīng)網(wǎng)絡(luò)模型在正確的程序上來(lái)學(xué)習(xí)語(yǔ)法知識(shí),然后基于學(xué)到的知識(shí)來(lái)指導(dǎo)修復(fù)程序中的語(yǔ)法錯(cuò)誤.文獻(xiàn)[16]利用機(jī)器學(xué)習(xí)方法學(xué)習(xí)種子語(yǔ)料庫(kù)的輸入種子文件的語(yǔ)法和語(yǔ)義,并利用學(xué)習(xí)到的這種相關(guān)性來(lái)更好的指導(dǎo)新的種子輸入的生成,實(shí)驗(yàn)表明他們的方法對(duì)于代碼覆蓋率的提升確實(shí)起到了一定的作用.Nichols 等在文獻(xiàn)[17]中提出了聯(lián)合LSTM (長(zhǎng)短期記憶人工神經(jīng)網(wǎng)絡(luò))[18]網(wǎng)絡(luò)和GAN (生成式對(duì)抗網(wǎng)絡(luò))[19]來(lái)學(xué)習(xí)整個(gè)種子語(yǔ)料庫(kù)中的語(yǔ)法信息,并生成新的種子文件.但是他們都沒有生成一個(gè)全新的格式良好的復(fù)雜種子文件例如PDF 文件,這導(dǎo)致了他們新生成的初始種子與原始種子庫(kù)中的種子相比,覆蓋范圍的提升很有限并且存在很大的重復(fù).
PDF 文件格式是現(xiàn)實(shí)軟件應(yīng)用程序可能需要處理的復(fù)雜輸入的一個(gè)很好的例子,這是模糊測(cè)試技術(shù)面臨的主要挑戰(zhàn)之一.當(dāng)前版本的PDF 文件格式規(guī)范,長(zhǎng)度超過1300 頁(yè),將每個(gè)PDF 文件定義為扁平位流,包含以下4 個(gè)部分:
(1)標(biāo)題部分,聲明PDF 規(guī)范版本后跟文件,該文件通常位于單行中,例如“%PDF-1.7”.
(2)正文部分,由一系列表示PDF 文件內(nèi)容的對(duì)象組成.如圖2(a)所示,PDF 文件中的對(duì)象由兩部分組成:1) 前兩個(gè)數(shù)分別是對(duì)象的標(biāo)識(shí)符和當(dāng)對(duì)象被修改為更新時(shí)增加1 的世代號(hào);2) 由關(guān)鍵字“obj”和“endobj”包圍的對(duì)象的內(nèi)容.對(duì)象可以采用8 種有效類型中的任何一種,即布爾值、數(shù)字、字符串、名稱、數(shù)組、字典、流和NULL.布爾、數(shù)字和字符串類型與編程語(yǔ)言中的類型相同,而數(shù)組和字典類型分別由“[”/“]”和“?”/“?”對(duì)分隔.流類型通常用于大量數(shù)據(jù),并由流和端流分隔.PDF 文件中的名稱類型,以“/”開頭,后跟一系列字符,定義PDF 文件中使用的鍵.例如,圖2(a)中的/Type/Pages 顯示該對(duì)象代表PDF 文件中的頁(yè)面;/Count 1 聲明該頁(yè)面只有一個(gè)子對(duì)象;/Kids [3 0 R]指定子對(duì)象的標(biāo)識(shí)符為3,其世代號(hào)為0.
圖2 PDF 文件結(jié)構(gòu)
(3)交叉引用表,用于快速訪問PDF 文件中的對(duì)象.該表以關(guān)鍵字xref 開頭,后跟一條指示起始對(duì)象的行(例如,圖2(b)中第2 行的0)和文件中的對(duì)象數(shù)(例如,圖2(b)中第2 行的4).表的其余部分是許多條目,為PDF 文件中的每個(gè)對(duì)象提供參考信息.每個(gè)條目都是一行聲明,其中前10 個(gè)數(shù)字表示對(duì)象的地址(作為文件中的偏移量),后面的5 個(gè)數(shù)字定義對(duì)象的世代號(hào),結(jié)束字符表示對(duì)象是否為占位符(表示為f)或使用中(表示為n).
(4)文件尾部分,定義PDF 文件的其他元數(shù)據(jù),例如每個(gè)部分的地址和大小.文件尾部分包含一個(gè)至少有兩個(gè)條目的字典:/Root 指的是PDF 文件1 中的第一個(gè)對(duì)象;和/Size 表示交叉引用表中的條目數(shù).關(guān)鍵字startxref和下一行中的數(shù)字表示交叉引用表的起始地址(即關(guān)鍵字xref 的文件中的偏移量).
我們的系統(tǒng)框架如圖3所示.我們將種子語(yǔ)料庫(kù)中的PDF 的obj 對(duì)象提取出來(lái),生成包含很多obj 對(duì)象的obj 對(duì)象庫(kù),然后經(jīng)過obj 對(duì)象生成器,生成新的obj 對(duì)象.再結(jié)合PDF 的結(jié)構(gòu),在PDF 組裝器中生成完整的新的PDF 種子.最后便是將生成的全新種子投入到模糊測(cè)試中,觀察代碼覆蓋率是否提升和種子質(zhì)量的好壞.我們的框架主要分為3 個(gè)部分:
圖3 基于機(jī)器學(xué)習(xí)的模糊測(cè)試框架圖
第1 部分為框架的輸入.輸入為obj 對(duì)象,我們將原始語(yǔ)料庫(kù)中的所有PDF 種子文件的obj 對(duì)象抽取出來(lái),這里的PDF 種子文件都是經(jīng)過錯(cuò)誤檢測(cè)和數(shù)據(jù)清洗的,我們?nèi)サ袅烁袷藉e(cuò)誤以及重復(fù)的PDF 種子文件,確保它們的正確性.然后如如圖2所示.我們截取“20 obj”和“obj”中間的這段主體部分.之后對(duì)obj 對(duì)象做一些格式上的處理.首先我們只選擇主體長(zhǎng)度在50 以內(nèi)的obj 對(duì)象,因?yàn)殚L(zhǎng)度過長(zhǎng)的obj 對(duì)象在學(xué)習(xí)時(shí)會(huì)因?yàn)橐蕾囆缘膯栴}導(dǎo)致學(xué)習(xí)效果的下降.其次我們?cè)跇?biāo)簽之間用<ENT>做特殊標(biāo)記,表示換行符,方便將obj 展開成一個(gè)字符序列,同時(shí)也方便之后我們生成的obj 序列翻譯回格式正確的obj 對(duì)象.最后,對(duì)于PDF 中的二進(jìn)制對(duì)象,我們用<stream>做特殊標(biāo)記,由于二進(jìn)制數(shù)據(jù)量非常大,并且針對(duì)二進(jìn)制的全自動(dòng)黑盒和白盒模糊測(cè)試已經(jīng)被證明有效,我們只是將它作一個(gè)特殊標(biāo)記,不去具體學(xué)習(xí)它的內(nèi)在內(nèi)容,并且也方便之后生成的obj 序列翻譯回格式完整的obj 對(duì)象.
第2 部分是obj 對(duì)象生成器,它是由Transformer網(wǎng)絡(luò)構(gòu)成.我們將第一步生成的obj 對(duì)象序列當(dāng)做一個(gè)由若干個(gè)單詞所組成的句子來(lái)處理,即我們把每個(gè)obj 序列看成是由一個(gè)一個(gè)標(biāo)簽或者符號(hào)組成的字符串序列.然后我們將這些序列輸入到基于Transformer網(wǎng)絡(luò)的obj 對(duì)象生成器中來(lái)生成新的obj 對(duì)象序列.我們通過將輸入序列右移位一個(gè)位置得到對(duì)應(yīng)的輸出序列.具體而言,obj 對(duì)象生成器會(huì)學(xué)習(xí)第一步得到的obj 序列語(yǔ)料,學(xué)習(xí)標(biāo)簽和符號(hào)之間的關(guān)系和轉(zhuǎn)移概率.我們根據(jù)這種學(xué)習(xí)到的知識(shí),加上給定的起始o(jì)bj 序列的片段,就可以指導(dǎo)性地預(yù)測(cè)出新的obj 對(duì)象序列.并且,我們也在這其中人為地引入了兩種隨機(jī)采樣的方案,我們稱之為Sample 采樣和SampleFunc 采樣,在保證生成的obj 對(duì)象序列格式正確率的同時(shí),增加一些隨機(jī)采樣的方法,來(lái)生成各種新的obj 對(duì)象序列.
第3 部分是PDF 組裝器.我們將由obj 對(duì)象生成的新的obj 對(duì)象序列經(jīng)過PDF 組裝器得到新生成的PDF 文件,作為模糊測(cè)試的種子輸入.我們從種子語(yǔ)料庫(kù)中隨機(jī)選擇若干個(gè)PDF 文件作為初始種子,并獲取他們的結(jié)構(gòu).然后我們利用這些PDF 的結(jié)構(gòu),結(jié)合新生成的obj 對(duì)象,組裝成一個(gè)完整的PDF.具體而言,我們將新生成的obj 對(duì)象中的<ENT>特殊標(biāo)記轉(zhuǎn)化為空格,將<stream>特殊標(biāo)記轉(zhuǎn)化為原始種子語(yǔ)料庫(kù)中的隨機(jī)一個(gè)二進(jìn)制流文件.最后我們將PDF 文件的文件頭、文件尾以及交叉引用表生成,并將幾個(gè)部分組裝在一起,形成最后格式完整的新的PDF 種子文件.
本節(jié)將詳細(xì)地介紹框架中所用到的神經(jīng)網(wǎng)絡(luò)模型和它的具體實(shí)現(xiàn).本文所用到的Transformer 模型是基于Python3.6.8+PyTorch1.5.0 實(shí)現(xiàn)的.
Transformer 模型由Google 在2017年6月發(fā)表的文章《Attention is all you need》提出[20].自從attention機(jī)制問世以來(lái),就已經(jīng)成為了Seq2Seq 網(wǎng)絡(luò)的標(biāo)準(zhǔn)配置.然而傳統(tǒng)的Seq2Seq 網(wǎng)絡(luò)還是需要用CNN 或者RNN等網(wǎng)絡(luò)來(lái)作為網(wǎng)絡(luò)架構(gòu)的主體.Transformer 網(wǎng)絡(luò)創(chuàng)新性的摒棄Seq2Seq 網(wǎng)絡(luò)必須結(jié)合CNN 或者RNN 網(wǎng)絡(luò)的固有模式,只采用了attention 機(jī)制來(lái)減少網(wǎng)絡(luò)參數(shù)的計(jì)算量,以及解決傳統(tǒng)Seq2Seq 網(wǎng)絡(luò)的并行計(jì)算效率低的弊端.并且Transformer 網(wǎng)絡(luò)在絕大多數(shù)自然語(yǔ)言處理領(lǐng)域的任務(wù)上的表現(xiàn),都有一定的提升.Transformer模型其本質(zhì)上是一個(gè)encoder-decoder 的結(jié)構(gòu).
4.1.1 Encoder
Transformer 的encoder是由多層堆疊而成.一般而言層數(shù)為6.其中,每層又可以分為兩個(gè)子層,分別是multi-head self-attention 子層和position-wise feedforward networks 子層.每個(gè)子層都經(jīng)過了殘差連接和歸一化,所以每個(gè)子層的輸出為:
Transformer 網(wǎng)絡(luò)引入了self-attention 機(jī)制,multihead attention 即定義多組的Q,K,V,讓注意力head 分別關(guān)注到不同的上下文信息,然后將這些注意力的結(jié)果拼接在一起:
其中,每個(gè)head的計(jì)算方法為:
針對(duì)PDF 這種復(fù)雜格式的文件,我們將PDF 的主體部分拆分為若干個(gè)如圖2(a)所示的obj 對(duì)象.在encoder部分,我們將obj 對(duì)象進(jìn)行序列化,以匹配Transformer模型的輸入格式.具體做法為:對(duì)于obj 對(duì)象,我們總是以obj 作為obj 序列的開頭,以endobj 作為序列的結(jié)尾.我們將這些標(biāo)簽或者關(guān)鍵詞看做是一個(gè)一個(gè)單詞,那么整個(gè)obj 對(duì)象就可以看成是一個(gè)句子.我們?cè)诰渥拥拈_頭和結(jié)尾加上BOS和EOS 特殊標(biāo)記來(lái)標(biāo)志句子的開頭和結(jié)尾,這樣我們的obj 對(duì)象就可以作為Transformer 網(wǎng)絡(luò)的合法輸入進(jìn)行正常的訓(xùn)練和預(yù)測(cè)了.
4.1.2 Decoder
Decoder 的輸入是encoder 層的輸出和前一個(gè)位置的decoder 的輸出.所以中間的attention 的K,V是來(lái)自于encoder 層.Q則是來(lái)自前一個(gè)位置的輸出.Decoder的輸出是對(duì)應(yīng)位置的輸出詞的概率分布.Decoder 層的結(jié)構(gòu)與encoder 層的結(jié)構(gòu)大致差不多,只是多了一個(gè)masked multi-head attention 層.這里的mask 指的是對(duì)未來(lái)的數(shù)據(jù)進(jìn)行mask 遮蔽,防止解碼預(yù)測(cè)該詞時(shí)已經(jīng)看到未來(lái)的詞語(yǔ)從而導(dǎo)致作弊.
在decoder 的部分,我們對(duì)obj 對(duì)象做與encoder部分中類似的處理.不同的是由于我們需要將下一個(gè)位置的單詞作為我們當(dāng)前詞的預(yù)測(cè)輸出,所以在decoder 中我們obj 序列的所有單詞都會(huì)向右移動(dòng)一個(gè)單位長(zhǎng)度來(lái)指導(dǎo)Transformer 輸出下一個(gè)單詞.還有一個(gè)特別的操作在于,decoder 部分在masked multi-head attention 層有一個(gè)mask 操作,這個(gè)操作會(huì)對(duì)未來(lái)的詞語(yǔ)進(jìn)行遮蔽防止作弊.
對(duì)于Transformer 模型而言,預(yù)測(cè)下一個(gè)字符的策略是選擇最大概率的字符,在本實(shí)驗(yàn)中即預(yù)測(cè)obj 對(duì)象序列時(shí),下一個(gè)標(biāo)簽或者特殊符號(hào)的預(yù)測(cè)值總為概率最大的那個(gè)值.但是這不適合我們的obj 對(duì)象序列生成,因?yàn)橐坏┠P陀?xùn)練完畢,各字符之間的概率分布就已經(jīng)確定了,而本文的obj 序列生成策略是給定obj 序列的開頭為字符串“obj”,讓Transformer 模型不斷貪心的預(yù)測(cè)下一個(gè)字符直到序列的句尾為止,所以結(jié)合模型的特性,一旦obj 序列的開頭給定了,那么模型總是會(huì)生成相同的obj 序列,這樣造成的后果是模型生成的obj 序列都是重復(fù)的,并且由序列組成的PDF 種子文件都是也都是重復(fù)的.雖然這樣的策略生成的obj 序列總是符合語(yǔ)法的,但是對(duì)于模糊測(cè)試而言,重復(fù)的合法種子無(wú)法給模糊測(cè)試帶來(lái)任何有效貢獻(xiàn).
因此,我們?cè)O(shè)計(jì)了兩種不同的采樣策略來(lái)對(duì)obj 對(duì)象序列生成過程中學(xué)習(xí)到的條件分布進(jìn)行采樣,以確保生成的obj 對(duì)象序列的多樣性:
Sample:每次生成下一個(gè)字符時(shí),我們都會(huì)對(duì)學(xué)習(xí)的分布進(jìn)行采樣.這確保了obj 對(duì)象序列生成的多樣性,但是過多的隨機(jī)采樣可能會(huì)增加生成不符合PDF格式檢查的obj 序列的風(fēng)險(xiǎn).
SampleFunction:僅當(dāng)我們預(yù)測(cè)的下一個(gè)字符是<ENT>時(shí),我們才對(duì)學(xué)習(xí)的分布進(jìn)行采樣.因?yàn)橛龅剑糆NT>時(shí)代表了我們的obj 對(duì)象序列當(dāng)前行已經(jīng)預(yù)測(cè)完畢.我們保留了整行的完整性,只有在下一行時(shí)才進(jìn)行采樣.這樣減少了生成的obj 對(duì)象序列無(wú)效性的風(fēng)險(xiǎn).
兩種采樣方案都在模型預(yù)測(cè)之前,對(duì)預(yù)測(cè)的結(jié)果進(jìn)行采樣,這樣做從一定程度上破壞了網(wǎng)絡(luò)學(xué)習(xí)到的語(yǔ)法規(guī)則,因?yàn)樽畲蟾怕实妮敵鍪亲罘险Z(yǔ)法規(guī)則的,而采樣之后輸出的是概率比較小的預(yù)測(cè)字符,這一定程度影響了種子的語(yǔ)法完整性,但是這也提高了生成種子的多樣性.本文需求目標(biāo)是提高種子在模糊測(cè)試中的表現(xiàn),而存在一定非法性的種子更有可能探索到目標(biāo)程序更多的執(zhí)行路徑甚至引發(fā)程序崩潰.綜上而言,兩種采樣策略都是對(duì)種子語(yǔ)法合法性以及種子多樣性的一種權(quán)衡,從而更好的提高模糊測(cè)試的效果.
我們進(jìn)行了一系列的實(shí)驗(yàn)評(píng)估了我們系統(tǒng)對(duì)于提高種子文件在目標(biāo)程序上模糊測(cè)試的代碼覆蓋率的提高程度.
我們用于模糊測(cè)試的目標(biāo)程序是mupdf 軟件(1.4.0版本).我們提取了由爬蟲在網(wǎng)上爬取的37 628 個(gè)PDF文件作為原始種子語(yǔ)料庫(kù),再提取其中所有長(zhǎng)度小于50 的obj 對(duì)象,對(duì)象的個(gè)數(shù)為878 649 個(gè).其中800 000 個(gè)obj 對(duì)象用于作為訓(xùn)練集,70 000 個(gè)obj 對(duì)象用于開發(fā)集,8649 個(gè)obj 對(duì)象用于測(cè)試集.這些obj 對(duì)象經(jīng)過格式處理后,成為obj 對(duì)象序列,作為obj 對(duì)象生成器中的Transformer 網(wǎng)絡(luò)的輸入,供網(wǎng)絡(luò)學(xué)習(xí)和輸出新的obj 對(duì)象序列.Transformer 網(wǎng)絡(luò)的訓(xùn)練和預(yù)測(cè)的實(shí)驗(yàn)環(huán)境為:Ubuntu16.04 的操作系統(tǒng),該系統(tǒng)下有NVIDIA GTX1080 GPU、i7-7700 處理器和16 GB 的RAM.網(wǎng)絡(luò)的參數(shù)為:模型的大小為256 維,multi-head attention隱藏層的層數(shù)為8 層,前饋神經(jīng)網(wǎng)絡(luò)為1024 維,batch size 取16,drop out 取0.1,序列最大長(zhǎng)度為60.Epoch=10 的模型訓(xùn)練時(shí)間為9 小時(shí).
在Transformer 網(wǎng)絡(luò)模型訓(xùn)練完畢之后,我們使用訓(xùn)練好的模型進(jìn)行預(yù)測(cè).我們將測(cè)試集中8649 個(gè)obj對(duì)象序列的開頭作為預(yù)測(cè)網(wǎng)絡(luò)的輸入,輸出經(jīng)過網(wǎng)絡(luò)預(yù)測(cè)的完整的obj 對(duì)象序列.再?gòu)臏y(cè)試集中的原始種子輸入文件隨機(jī)選取10 個(gè)完整的PDF 文件,提取他們的文件結(jié)構(gòu).最后將obj 序列和文件結(jié)構(gòu)在PDF 組裝器中組裝成新的PDF 種子文件,作為最終模糊測(cè)試的種子輸入.
我們測(cè)量種子語(yǔ)料庫(kù)的代碼覆蓋率,在本實(shí)驗(yàn)中,我們將mupdf 視為目標(biāo)程序,并比較了原始種子語(yǔ)料庫(kù)和我們框架生成的種子語(yǔ)料庫(kù)的代碼覆蓋率.
由于訓(xùn)練輪數(shù)是神經(jīng)網(wǎng)絡(luò)中的重要參數(shù),我們進(jìn)行了5 組對(duì)比實(shí)驗(yàn),分別取epoch=10,epoch=20,epoch=30,epoch=40,epoch=50.分別比較原始PDF 文件和我們生成的新的PDF 種子文件的代碼覆蓋率.以epoch=40為例,我們將原始種子語(yǔ)料庫(kù),Sample 采樣策略+Transformer 網(wǎng)絡(luò)下生成的新的種子文件,SampleFunc采樣策略+Transformer 網(wǎng)絡(luò)下生成的新的種子文件,進(jìn)行了24 小時(shí)的模糊測(cè)試,最終得到的代碼覆蓋率的比較曲線如圖4所示.
圖4 Epoch=40 下路徑覆蓋數(shù)比較
圖4中,Original 表示原始種子語(yǔ)料庫(kù);Sample+Transformer 代表Sample 采樣策略下以及利用Transformer網(wǎng)絡(luò)最后生成的新的PDF 種子文件的代碼覆蓋率.SampleFunc+Transformer 代表SampleFunc 采樣策略下以及利用Transformer 網(wǎng)絡(luò)最后生成的新的PDF 種子文件的代碼覆蓋率.
通過圖4,我們可以發(fā)現(xiàn)無(wú)論是Sample 采樣策略下還是SampleFunc 采樣策略下,由Transformer 網(wǎng)絡(luò)構(gòu)成的obj 生成器所產(chǎn)生的新的obj 對(duì)象在組裝成完整的PDF 之后,經(jīng)過模糊測(cè)試得到的代碼覆蓋率相比原始種庫(kù)都有了一定的提升,特別是SampleFunc 采樣策略下Transformer 網(wǎng)絡(luò)生成的PDF 種子文件,不僅能以更快的速度到達(dá)覆蓋率增長(zhǎng)的瓶頸,并且也表現(xiàn)出了更高的覆蓋率上限.這表明,此種方法的模糊測(cè)試效果最好.
訓(xùn)練輪數(shù)epoch=10,epoch=20,epoch=30,epoch=40,epoch=50 下的本文框架生成的PDF 種子文件在模糊測(cè)試上的表現(xiàn)情況如表1所示.
表1 不同訓(xùn)練輪數(shù)下生成的PDF 種子文件和原始種子文件的總路徑數(shù)比較
從表1中可以看出,epoch=10 時(shí),兩種采樣策略下的總路徑數(shù)都比原始種子的代碼總路徑數(shù)要低,原因可能是我們的網(wǎng)絡(luò)訓(xùn)練的不充足.epoch=20和30 時(shí),總路徑數(shù)都有了一定的提升.Epoch=40 時(shí)的效果最好,epoch=50 時(shí),雖然還是比原始種子的總路徑數(shù)高,但是較epoch=40 時(shí)已經(jīng)有了下降.結(jié)合數(shù)據(jù)進(jìn)行合理分析之后的我們的初步結(jié)論是,由于訓(xùn)練輪數(shù)過多,造成了一定的過擬合的現(xiàn)象,導(dǎo)致模型的表征能力不增反降.但總體而言,實(shí)驗(yàn)證明,在我們的框架下,總路徑數(shù)相較原始種子語(yǔ)料庫(kù)都有了一定的提升.
本文在4.2 節(jié)中從理論上分析了采樣策略的原因以及必要性,但是這還需要實(shí)驗(yàn)結(jié)果的進(jìn)一步證明.我們將不使用任何采樣策略生成的種子、采用Sample采樣策略生成的種子、SampleFunction 采樣策略生成的種子作為輸入,訓(xùn)練輪數(shù)epoch=30,對(duì)比24 小時(shí)的模糊測(cè)試對(duì)比實(shí)驗(yàn),以覆蓋路徑數(shù)作為指標(biāo),評(píng)估3 種采樣策略下種子的質(zhì)量高低.如圖5所示,NoSample即不使用任何采樣策略,它生成的種子覆蓋路徑數(shù)最少,只有3716 個(gè),而本文提出的兩種策略下生成的種子覆蓋路徑數(shù)分別為8912 個(gè)和9914 個(gè),較之不采樣方案的覆蓋路徑數(shù)多了很多.
圖5 不同采樣策略下種子覆蓋路徑數(shù)
我們以文本形式打開生成的PDF 種子文件發(fā)現(xiàn),不采樣策略下生成的種子中,obj 序列大量重復(fù),而其他兩種采樣策略下的obj 序列,沒有任何兩條是完全重復(fù)的.結(jié)合這一點(diǎn),可以說(shuō)明采樣策略增加了obj 序列的多樣性,而種子的多樣性對(duì)于模糊測(cè)試而言十分重要,因?yàn)橹貜?fù)的種子是完全冗余無(wú)用的.這也證明了本文采樣策略的有效性和必要性.
原始種子語(yǔ)料庫(kù)中的種子大小從0 KB 到2228 KB均勻分布,而我們生成的種子大小有39.05%小于3 KB,最大的種子不超過200 KB.這比原始種子語(yǔ)料庫(kù)中的種子小了很多.因?yàn)槲覀冎贿x取了長(zhǎng)度小于50 的obj 對(duì)象序列作為訓(xùn)練數(shù)據(jù),所以我們得到的obj 序列長(zhǎng)度都不會(huì)太長(zhǎng).
本文的優(yōu)化框架是選擇了PDF 文件作為模糊測(cè)試的種子文件,選擇PDF 文件的理由是因?yàn)镻DF是復(fù)雜二進(jìn)制文件格式的代表,它其中包含了文字、圖片甚至音頻、視頻等.如果本文框架可以對(duì)PDF 格式的文件有良好效果的話,可以推斷本文研究在別的簡(jiǎn)單格式文件下也具有一定的通用性.
我們進(jìn)行了實(shí)驗(yàn)來(lái)探究這一點(diǎn).針對(duì)PNG 格式,訓(xùn)練Transformer 模型來(lái)生成新的種子文件,訓(xùn)練時(shí)間為9 小時(shí),其他參數(shù)配置與5.1 節(jié)中完全相同.我們以LoadPNG 作為目標(biāo)程序,將兩種采樣策略生成的種子與初始種子作為輸入,進(jìn)行24 小時(shí)模糊測(cè)試,評(píng)估3 類種子的覆蓋路徑數(shù),實(shí)驗(yàn)結(jié)果如圖6所示,可以看到本文研究提出的兩種采樣策略結(jié)合的Transformer模型生成的PNG 種子文件,覆蓋的路徑數(shù)比原始種子文件多,這說(shuō)明本文研究對(duì)于別的格式例如PNG 格式,也能起到不錯(cuò)的效果,這也更說(shuō)明了本文研究的有效性.
圖6 不同采樣策略下的路徑覆蓋數(shù)比較
本文提出了一個(gè)利用機(jī)器學(xué)習(xí)來(lái)生成新的PDF種子文件的系統(tǒng)框架.該框架學(xué)習(xí)并發(fā)掘PDF 文件中obj 對(duì)象的格式化文本信息,并利用學(xué)到的知識(shí)智能地指導(dǎo)生成新PDF 文件,用于最后的模糊測(cè)試中.實(shí)驗(yàn)結(jié)果表明我們生成的PDF 文件,不僅尺寸更小,并且在更小的尺寸下,在模糊測(cè)試中的代碼覆蓋率也有了較為明顯的提升,說(shuō)明我們生成的種子在更小的尺寸下卻有更高的表征能力.
但是,我們的工作仍有需要改進(jìn)的地方.首先,我們所使用的神經(jīng)網(wǎng)絡(luò)模型為Transformer 模型,然而還有很多擅長(zhǎng)處理序列問題的神經(jīng)網(wǎng)絡(luò)模型如RNN 模型以及它的多種變體.我們可以將這些網(wǎng)絡(luò)作為我們框架的訓(xùn)練網(wǎng)絡(luò),作對(duì)照試驗(yàn).選取最優(yōu)秀的網(wǎng)絡(luò)模型作為obj 對(duì)象的生成網(wǎng)絡(luò).其次,本文框架只是針對(duì)模糊測(cè)試種子質(zhì)量進(jìn)行了優(yōu)化,由之前的分析知道,改變變異策略也可以提升模糊測(cè)試的代碼覆蓋率,我們可以將本文框架與改變變異策略的方案結(jié)合起來(lái),進(jìn)一步的提高對(duì)模糊測(cè)試的優(yōu)化效果,這可以作為我們未來(lái)的工作.