俞遠哲,王金雙,鄒 霞
(陸軍工程大學 指揮控制工程學院,江蘇 南京210007)
PDF (Portable Document Format) 文檔的使用非常廣泛。隨著版本的更新換代,PDF 文檔包含的功能也變得多種多樣,但其中一些鮮為人知的功能(如文件嵌入、JavaScript 代碼執行、動態表單等) 越來越多地被不法分子利用,來實施惡意網絡攻擊行為[1]。APT(Advanced Persistent Threat) 攻擊[2]常常構造巧妙偽裝的惡意PDF 文檔,通過釣魚郵件攻擊等手段誘騙受害者下載,從而侵入或破壞計算機系統。相比傳統的惡意可執行程序,惡意文檔具有更強的迷惑性。
基于機器學習的檢測方法被研究人員廣為使用,主要可以分為靜態檢測、動態檢測和動靜結合檢測方法[3]。而現有的惡意文檔特征選擇方法大多依賴于專家的知識驅動,在惡意文檔的手動分析期間進行觀察來選擇特征集(如調用類對象的數量、文檔頁數或版本號等),或是通過數學統計分析將特征細化(如某類對象在所有對象中的占比)。由于特征可選取的范圍很大,如果僅僅根據經驗選取了一部分作為特征集,就會喪失文檔的部分信息,無法全面地表達文檔特性。
由于PDF 文檔格式的復雜性,其邏輯結構包含了大量的文檔語義。文獻[4]認為通過對結構屬性的綜合分析能夠解釋惡意和良性PDF 文檔之間的顯著結構差異。因此本文設計通過綜合分析文檔的邏輯結構,以文檔的結構圖為特征進行檢測,而不是獨立的結構路徑。即使攻擊者知道哪些對象是成功檢測的關鍵,并可能針對性地修改某一特定路徑,但這樣就會破壞文檔的整體結構,因此逃避檢測的成本很高。
本文的主要工作和創新點如下:
(1) 以靜態檢測技術和圖論為基礎,根據文檔的邏輯結構構造出文檔結構圖,得到包含圖信息的鄰接矩陣和度矩陣,并計算得到拉普拉斯矩陣作為特征。這種特征表達的優點在于不僅包含了相鄰節點的鄰接關系,還包含了節點本身的出入度,包含圖的信息更多,對文檔的表征能力更強。
(2) 在構造文檔的圖結構時,通過TF -IDF 算法對節點進行精簡合并: 統計了PDF 文檔中的對象對于分類的貢獻度排名,前73 類對象的總貢獻度達到了99%,將剩下的140 類對象合并為一類。通過圖精簡生成了74 類對象,實現了特征降維,在提升模型效率的同時,緩解了特征維度過高導致可能出現的過擬合問題。
(3) 基于特征加法攻擊生成訓練樣本,對模型進行對抗訓練。使用Metasploit 工具生成了2000個惡意對抗樣本,與VirusTotal 的檢測結果對比分析表明,本模型的檢測性能高于VirusTotal 的檢測引擎。
前期研究所選定的特征主要依賴專家知識驅動[5],部分選定特征不是惡意文檔所特有的,而且無論是單一特征還是混合特征,均是從龐大的特征集中選取的一小部分特征,以特征在樣本中的頻數作為特征值。這類選取的特征容易被攻擊者篡改。攻擊者只需要找到影響模型判定的關鍵特征,增大其他特征的頻數,便能稀釋文檔中的關鍵特征,從而使分類器產生錯誤的判定。已有基于機器學習算法的惡意PDF 文檔檢測器之間的比較如表1 所示。

表1 惡意PDF 機器學習檢測器對比分析
逃避攻擊是指攻擊者試圖修改惡意樣本的特征,在不影響惡意行為的前提下來逃避模型檢測。逃避攻擊生成對抗樣本的方式主要有梯度下降攻擊和特征加法攻擊[15]。梯度下降攻擊通過修改惡意樣本的特征,使得惡意樣本無法被正確分類。它最早是在圖像識別領域提出的,其原理是在圖像上通過修改像素點生成微小的擾動,但并不會影響圖像自身的格式。但是由于PDF 文檔自身格式的規范性,隨意地修改某一特征可能會使得文檔格式無法正常解析以致損壞。因此基于梯度下降攻擊生成可執行的對抗文檔更難。
特征加法攻擊通過將惡意負載附加到正常文檔之中,或是向惡意文檔中添加正常的內容來規避檢測。由于PDF 文檔自身格式和內容易于增添而難于刪除[17],特征加法攻擊更易于生成可執行的對抗文檔。
已有研究的檢測模型絕大部分性能指標關注于檢測率、準確率和誤報率,而對于模型的魯棒性考慮較少,模型對于對抗樣本檢測的效果也較差。高度健壯的模型[13]對于一個已知惡意文檔,在不影響其惡意行為的前提下,無論對其增添或是刪除其中一個或多個元素,都不會影響分類器的判定結論。
圖1 展示了使用VirusTotal 病毒檢測引擎檢測一組惡意樣本和對抗樣本的結果。VirusTotal 系統中有39個殺毒引擎檢測出了惡意樣本,而只有8個殺毒引擎檢測出了對抗樣本。說明即使是目前先進的在線檢測系統,也易遭受對抗樣本的影響。

圖1 惡意樣本和對抗樣本VirusTotal 檢測結果
提升模型魯棒性的方法主要有: 一是利用特征工程[2,16],通過數學變換對特征進行組合,以增加各特征之間的相關性,使得即使攻擊者對樣本中的某一特征進行了修改,模型仍然可以通過相關特征檢測到惡意文檔;二是利用對抗訓練[18-19],生成對抗樣本對模型進行預訓練,降低模型對未知對抗樣本的誤報率;三是利用集成學習[15],通過多個分類器進行決策,來減少對抗樣本對單個模型產生的影響。
構成PDF 格式的語法主要包括四個元素[20]:
(1) 對 象: 構成PDF 的 基本元 素,如/ Catalog,/Page 等。
(2) 文件結構(也稱物理結構): 指定了對象在PDF 文檔中的布局和修改方式。
(3) 文檔結構(也稱邏輯結構): 決定了對象在邏輯上是如何組織起來,以呈現文檔的內容。
(4) 內容流: 提供了一種高效存儲文件內容各部分的方法。
PDF 文檔的部分原始內容如圖2 所示。

圖2 PDF 文檔的原始內容
PDF 文檔結構常以/Catalog標簽為根節點,根據引用對象號指向子對象節點,以此層層遞進直到沒有引用對象號,即到達葉子節點,最后形成的樹或森林結構如圖3 所示。PDF各對象之間通過引用關系相互聯系,因此其邏輯結構較文檔的原始內容更為復雜,但同時也表達了大量的文檔語義,如是否存在某些對象,以及對象間的引用關系等。這些語義信息對于綜合判斷文檔的行為具有重要的作用。

圖3 PDF 結構樹
文檔的圖結構特征包含了大量的文檔語義,通過結構路徑能反映出該部分的功能。相比起孤立的詞袋模型特征,作為特征輸入的圖的拉普拉斯矩陣,每個元素之間都是相互聯系的,不容易被篡改?;谏鲜鏊枷耄疚奶岢鲆环N基于文檔圖結構的惡意PDF 文檔檢測方法,解決了特征間孤立的問題,提高了攻擊者的成本,提升了檢測模型的魯棒性。
CNN-FGS 檢測方法的整體框架如圖4 所示。

圖4 CNN-FGS 檢測方法的整體框架
結構路徑生成模塊使用PeePDF[21]對PDF 文件進行結構解析得到各對象的調用關系。PDF 文檔的數據集可以表示為F={(f1,l1),(f2,l2),…,(fN,lN)};fi表示單個文件的拉普拉斯矩陣;li∈{0,1} 表示樣本標簽,0 表示良性文件,1 表示惡意文件。根據各對象的調用關系,通過深度優先搜索(Depth First Search,DFS) 算法得到文檔的所有結構路徑,并得到圖的多條邊。
圖精簡模塊使用TF-IDF 算法對所有節點進行分類重要性排序,保留總重要性影響超過99% 的節點,對剩下1% 的節點進行合并,以實現圖精簡。
特征提取模塊使用Python 的networkx 庫構造文檔的圖結構,計算圖的鄰接矩陣和度矩陣,并求得拉普拉斯矩陣作為訓練特征。
學習檢測模塊基于CNN 模型對特征學習檢測,并進行模型評價。
對抗訓練模塊采用基于特征加法的攻擊方式生成對抗樣本,對模型效果進行檢驗,并對模型進行再訓練,提升模型的魯棒性。
2.2.1 結構路徑生成模塊
本方法通過PeePDF 工具分析提取文檔對象的引用關系,如圖5 所示。它的每一行按照引用的先后順序排列,不同的縮進表示不同的父子關系。

圖5 PDF 文檔對象的引用關系
為了更好地分析對象間引用關系來得到文檔的邏輯結構,本文作如下規定: 以縮進數判斷父子關系,相鄰兩行節點的縮進差為上一行縮進數減去下一行的縮進數;將第一行縮進數小的對象視作父節點,將縮進數大的節點視作子節點。即縮進數最小的對象為根節點,縮進數最大的對象為葉節點;若相鄰兩行縮進差為-1,則兩節點存在父子關系,上一行的節點是下一行節點的父親。若相鄰兩行縮進差為0,則兩節點共享父節點;若相鄰兩行縮進差為1,則上一行節點的父親節點是下一行的兄弟節點,即上一行節點的父節點的父節點是下一行節點的父節點。根據以上規則,使用DFS 算法遍歷得到文檔的結構路徑的集合,如圖6 所示。

圖6 PDF 文檔的結構路徑
2.2.2 圖精簡模塊
在結構路徑生成模塊已得到各文檔的結構路徑集合,首先對所有文檔中出現的對象進行統計,使用十六進制編號表示,并對冗余對象合并以精簡圖。例如/Bullet 元對象在文檔中出現了9 種不同的近似對象(如/Bullet_1,/Bullet_2,/Bullet_Last,/Bullet v2等),這些近似對象都起到了與元對象相同的功能,對這些對象進行冗余合并,不會對分析文檔結構具有太大的影響。經遍歷統計數據集中所有文檔中的結構路徑共提取得到672個對象,冗余合并后得到213個元對象。
使用TF-IDF 算法計算213個元對象對分類的貢獻度。計算公式如下:


其中ni,j表示對象oi在PDF 文檔fj中出現的次數,表示所有對象出現的總次數,|D |表示樣本集的數量,|j:oi∈fj| 表示包含對象oi的文檔數量。
計算各對象的貢獻度并作圖7 如下,可以看出有超過一半的對象對分類的貢獻度不足0.01 。經統計如圖8 所示,貢獻度排名前73 類對象的總貢獻占比達到了99%,說明前73 類對象對分類判定的重要性更大。雖然剩下的140 類對象只占了1%,但是對分類還是有一定的影響,因此不能直接將其拋棄,考慮將剩下140 類對象合并為一類。圖精簡模塊最后生成了74 類對象,實現了特征降維,有助于提升模型效率,并緩解特征維度過高導致可能出現的過擬合問題。

圖7 各對象的TF-IDF 貢獻度

圖8 對象貢獻度占比變化曲線圖
2.2.3 特征提取模塊
以精簡后的74 類對象為字典,將先前得到的結構路徑集合一一對應得到文檔圖結構的邊集。然后,利用networkx 模塊生成文檔的圖結構,如圖9所示。

圖9 文檔圖結構
將圖轉化為鄰接矩陣的形式,鄰接矩陣反映了圖中各節點之間的相鄰關系,記作A 。

將圖轉化為度矩陣的形式,度矩陣對角線上的元素是各個頂點的度,表示和該頂點相關聯的邊的數量。度矩陣記作D :

拉普拉斯矩陣L 定義為:

拉普拉斯矩陣中的第i 行反映了第i個節點對其他節點的累積影響,相比圖的鄰接矩陣包含了更多的信息,也更能表征文檔的特征。
2.2.4 學習檢測模塊
本文提取的圖的拉普拉斯矩陣特征與傳統的PDF 檢測模型提取的詞袋特征有很大的不同。詞袋模型的每個特征都是經過人工挑選且相對獨立,而作為描述圖的信息的拉普拉斯矩陣,其每一個元素都是相關聯的,每一部分都影響了圖的信息表達,特征的表征能力更強。將圖像分類的深度學習方法遷移到PDF 文檔分類中,通過CNN 模型能夠更好地捕捉PDF 文檔的圖結構中相鄰特征之間的局部關系。
本文使用的CNN 模型結構: 輸入層是樣本中提取得到的74×74 的拉普拉斯矩陣,然后使用1個二維卷積層對特征向量矩陣進行卷積操作。卷積層由8 ×4 的卷積核組成來挖掘特征空間里不同范圍的特征向量所包含的隱藏信息,并選擇最大值池化的方法將特征值整合,最后通過三層神經元分別為256 、64 、2 的全連接層輸出得到結果。選取效果更好的ReLU 作為激活函數,減輕了參數之間的相互依賴關系。同時在池化層與全連接層之間加入了Dropout 層,起到減少特征冗余避免過擬合的發生。
2.2.5 對抗訓練模塊
本文通過比較嵌入正常文檔后的惡意文檔特征值發生的改變,發現所選取的第74 類特征在數值上發生了顯著的變化。分析其中的原因,主要是因為圖精簡時,第74 類特征合并了其余大量TFIDF值較低的特征,這些特征在正常文檔中大量存在。
針對模型的此類特點,定義本文中的特征加法攻擊的攻擊強度S 為: 在原有惡意文檔的特征基礎上,對抗樣本的第74 類特征值與之前樣本的倍數。本模塊按照不同的特征強度S 參數,生成多組對抗樣本特征以對模型進行對抗訓練。
本文實驗環境為CPU Intel ? i7 - 9750H,32 GB內 存,GPU 為GTX2060,硬 盤 為120 GB SSD,使用Ubuntu16.04 操作系統。實驗數據集中惡意PDF 文檔來自于VirusTotal 病毒數據庫以及Contagio 數據集[22],良性樣本來源于Contagio 數據集。使用的良性樣本數為9093個,惡意樣本數為14570個,特征加法攻擊樣本2000個,統計樣本數為25663個。
本文的分類模型使用了準確率Precision 、召回率Recall 和F - score 三個指標進行綜合衡量,其計算方法如下:

式中TP 為真正例,FP 為假正例,TN 為真反例,FN為假反例。
本文以9:1 的比例隨機地將樣本集劃分為訓練樣本和測試樣本。其中,良性樣本的標簽記為0,惡意樣本的標簽記為1 。
為測試CNN 分類模型的性能,選擇了適用于圖分類的機器學習分類方法KNN 、SVM 與CNN 進行比較,并作表2 如下,可以觀察到CNN 分類模型在各指標上都較其他兩類方法更好。

表2 三類分類器性能指標比較
為進一步評估本模型的性能,將結果與近年來所提出的其他模型進行對比,結果如表3 所示。因為PDFRate 和PJScan 作為在線訓練模型已停止服務,所以只引用其結果作為參考。對比分析表明,本文提出的分類模型較其他方法在準確率和召回率等指標上都有所提升。

表3 各研究性能指標比較
為了研究本文分類模型的魯棒性,實驗選取基于特征加法攻擊的對抗樣本進行對抗訓練及性能評估。
首先,本文按照特征強度參數S=2,3,4,5,10,15,20,30 分別生成了250個對抗樣本特征,將其送入模型對抗訓練,訓練前后的檢測結果如表4 所示。

表4 對抗訓練前后性能指標比較
訓練前的模型對對抗樣本的召回率較低,說明模型對惡意文檔的識別能力不夠,誤將其分類為良性樣本。對抗訓練后,模型的召回率有了顯著的提高。說明模型經過再訓練,具備了一定的識別惡意對抗樣本的能力,模型的F-score 指標也有所提高。
為了進一步研究對抗樣本對模型性能的影響,本文通過Metasploit 制作了2000個嵌入正常文檔的惡意對抗樣本作為測試集來評估模型對抗訓練后的性能(其攻擊強度參數S 均大于20,文檔的md5已上傳github,可直接從VirusTotal 上檢索到)。同時,將這批惡意對抗樣本上傳至VirusTotal 進行檢測,統計所有殺毒引擎的檢測結果及本文模型的檢測率,如圖10 所示。實驗結果表明,對抗樣本對VirusTotal 中的殺毒引擎影響較大,大部分殺毒引擎無法成功檢測。而本文提出的模型對這批惡意對抗樣本達到了98.86% 的檢測率。

圖10 本文模型與各殺毒引擎檢測率比較
針對基于機器學習的PDF 惡意文檔檢測方法存在依賴專家經驗遴選特征、表征能力差等問題,本文提出了一種基于文檔圖結構和CNN 的惡意PDF文檔檢測方法,通過分析文檔的邏輯結構,生成文檔的圖結構,以圖結構的拉普拉斯矩陣作為特征送入分類器進行訓練。圖結構特征較前人研究特征表征能力更強,經過對抗訓練后,模型的魯棒性更強。生成基于特征加法攻擊的對抗樣本,通過比較本模型和VirusTotal 對該樣本集的檢測性能,結果表明本模型性能超過了VirusTotal 上的67 款殺毒引擎。