雷靖瑋,伊 鵬,陳 祥,王 亮,毛 明
(中國人民解放軍戰略支援部隊信息工程大學,鄭州 450001)
長期以來,安全人員傾向于認為相比電子郵件和網絡鏈接,PDF 文檔作為靜態文件難以更改,對圍繞其展開的各類攻擊疏于防范。事實上,隨著時間推移,PDF 規范已產生巨大變化,新增的PDF 腳本功能使其可像可執行文件一樣用于開展網絡活動、或與其他文件或程序進行交互等,從而給攻擊者預留了更多可利用空間,攻擊者可以更加方便地將惡意負載隱藏為圖像、字體和Flash 內容。與此同時,PDF 規范的變化也增加了與其相適應的文檔解釋器的復雜性,變相導致各種漏洞的產生。僅Adobe Acrobat Reader(AAR)就在2015年、2016 年相繼發布了137 和227 個通用漏洞披露(Common Vulnerabilities and Exposures,CVE)漏 洞。圖1 為Adobe Reader 中典型的CVE-2010-2883 漏洞的利用示意圖。
圖1 CVE-2010-2883漏洞利用示意圖Fig.1 Schematic diagram of exploiting CVE-2010-2883 vulnerability
Adobe Reader 的CopyType.dll 文件中strcat 函數未檢查參數src 是否會超過est 定義的數組長度,由此形成棧溢出漏洞。目前遭曝光的Adobe 產品漏洞大多可造成較嚴重的危害,如任意代碼執行和內存泄漏等。
表1 給出了近年來AAR 被曝光的一些典型漏洞信息。AAR 除本身存在大量漏洞易被攻擊者利用外,還是目前使用率非常高的PDF 文檔解釋器,因此已成為攻擊者的首要目標之一[1]。根據近年來的數據統計,它受攻擊者青睞程度僅次于瀏覽器和操作系統內核,必須承認,當前惡意文檔檢測形勢嚴峻。近年來研究者已提出多種解決方案用于檢測文檔攜帶的惡意負載,這些技術大致可分為靜態分析與動態分析兩類。靜態分析,即基于簽名的檢測[2-9]主要是靜態解析文檔并搜索惡意負載標志,如是否存在惡意代碼或與已知惡意軟件相似性是否超過閾值。動態分析,即基于執行[10-11]的檢測技術,通過運行部分或整個文檔尋找可能的惡意行為,如是否存在易受攻擊的應用程序編程接口(Application Programming Interface,API)調用或返 回導向編程(Return Oriented Programming,ROP)。Carmony 等[12]的研究表明,這些解決方案中使用的PDF 解析工具可能在設計時過度簡化了PDF 規范,即未能充分考慮目前PDF 規范的復雜性,可能導致惡意負載提取不完整或分析失敗。另有研究[13-15]表明,基于機器學習的檢測可能會被遵照某種規則設計的行為成功規避。此外,許多解決方案只關注PDF 文檔中的JavaScript 部分,而忽略了其與其他PDF 組件在發起攻擊時的協同作用。部分方案則采用類似于黑名單的方式,即使用已知的惡意行為模式對JavaScript 腳本進行匹配,泛化性較弱,即使是對已知惡意模式進行細微修改都可能逃避檢測,更無法有效應對0day 攻擊等威脅。
表1 近年AAR漏洞信息列表Tab.1 List of AAR vulnerabilities in recent years
本文提出了一種惡意文檔的檢測模型NtProvenancer。不同于以往的靜態檢測和動態檢測,該模型未以JavaScript腳本或PDF 元數據作為重點研究對象,而是借鑒基于系統調用的主機異常檢測技術,并以數據溯源思想構建系統調用級的數據溯源圖,利用溯源圖結構特征提取特征序列,而后將它與良性特征庫中調用片段進行比對以完成檢測。該模型設計主要基于以下的觀點:
1)針對惡意軟件攻擊的異常檢測也應能夠對目前新規范下的PDF 文檔進行檢測。
2)數據溯源圖的結構特征可用于提取系統調用序列中的特征部分。
對于觀點1),可利用系統調用追蹤工具生成系統調用日志,并利用調用數據構建檢測模型進行檢測,通過模型最終的檢測結果驗證其可行性;對于觀點2),可在建立系統調用級的數據溯源圖的基礎上對提取出的特征序列進行分析和驗證。事實上,要使模型真正發揮作用,需要解決兩個關鍵問題:一是怎樣有效提取特征,文檔運行時產生的系統調用數據量過于巨大,并且惡意行為所對應的系統調用往往僅占其中一小部分;二是怎樣進行特征部分的提取和比較,以檢測文檔的惡意負載。需注意,本文模型與當前惡意軟件分析工具有本質區別:一是當前分析工具主要采用黑白名單的方法進行檢測,黑名單方法適用于檢測已知的惡意行為,但難以應對利用0day 漏洞的PDF 攻擊,白名單方法則可能導致較高的誤報率;二是本文模型基于攻擊者無法修改或刪除系統調用數據的客觀事實,因此這部分數據可為PDF 文檔檢測提供可靠信息。實驗過程使用394 個良性樣本進行特征提取,相關樣本覆蓋了PDF 規范中的各種特征,然后使用134 個良性測試樣本進行評估,產生7 例誤報;而對于320 個惡意樣本,模型能夠實現正確檢測。
本文主要工作為:使用基于系統調用的異常檢測技術,結合數據溯源思想,提出了新的特征提取算法,并且以較低的性能開銷完成文檔檢測。評估證明,NtProvenancer 有著較低的誤報率和漏報率,能夠有效檢測出惡意文檔中的行為異常。
目前常見的惡意文檔檢測方法主要是靜態分析檢測和動態分析檢測,本章將圍繞這兩種檢測方案介紹目前常見的一些檢測手段與不足之處,同時陳述本文的寫作動機。
靜態分析檢測大致可以分為兩類。
第一類注重分析PDF 文檔中的JavaScript 腳本,原因有二:首先,JavaScript 能夠完成許多PDF 高級功能;其次,根據文獻[11],超過90%的惡意文檔使用JavaScript 完成攻擊。PJScan 分析器[3]從詞法編碼風格出發,利用變量名、括號和運算符的數量來區分良性和惡意的JavaScript 代碼。Lux0r[2]分別構建了在良性和惡意文檔的API 引用模式,并使用這些模式對惡意文檔進行分類。MPScan 分析器[4]與其他JavaScript 靜態分析器有著顯著不同,它關聯AAR 并動態提取JavaScript 代碼;然而,因為其代碼分析仍然是靜態執行的,仍將它視為一種靜態分析技術。以上所有方法的一個共同缺點是可以通過大量混淆技術和動態代碼加載來規避檢測(除了MPScan 分析器[4],因為它在運行時與AAR 進行關聯),因為靜態解析器根據預定義的規則提取JavaScript,攻擊者可以利用這些規則決定JavaScript 代碼可以放置或隱藏的位置。鑒于PDF 規范的靈活性,能否成功隱藏代碼實際上取決于攻擊者的創造力。文獻[16-17]中提出了針對JavaScript 代碼的反混淆檢測方法,但這種方法還需手工才能完成,沒有實現自動化檢測,并且存在著誤報率較高的問題。
另一類檢測則是側重于檢查PDF 文件的元數據,而不是其實際內容。這是因為混淆技術傾向于惡意利用PDF 規范的靈活性,并通過改變正常的PDF 結構來隱藏惡意代碼。PDF Malware Slayer[5]使用特定PDF 元素(例如,/JS,/Page 等)的線性 化路徑 來構建 惡意文 檔分類 器。?rndi? 等[9]和Maiorca 等[13]更進一步,也使用分級結構進行分類。PDFrate[8]則囊括了另一組檢測指標,如字體數量、流的平均長度等,以提高檢測能力。Liu 等[7]利用文件的熵序列并結合機器學習進行文檔檢測。Maiorca 等[6]則同時利用JavaScript 代碼和PDF 元數據,將上述許多啟發式方法融合到一個檢測過程中,以提高文檔檢測的規避難度。
大多數的動態分析技術只關注嵌入的JavaScript 代碼,而不是整個文檔。MDScan[11]在定制的SpiderMonkey 解釋器上執行提取的JavaScript 代碼,解釋器在其內存空間上不斷掃描已知形式的惡意代碼或惡意操作碼序列。Jiang 等[18]提出了一種新型字典檢測模型NFDD,該模型引入一種基于詞嵌入的神經網絡,同時與動態分析技術相結合。ShellOS[10]是一個輕量級操作系統,旨在運行JavaScript 代碼并記錄其內存訪問模式。在執行過程中,如果內存訪問序列匹配已知的惡意模式(例如返回導向編程(Return-oriented Programming,ROP)、關鍵系統調用或函數調用等),則該腳本被視為惡意的。雖然這些技術檢測惡意負載較為準確,但其共性問題在于腳本環境不兼容。此外,惡意負載可以被編碼為文檔中的字體或圖像等對象[19],既不會被提取也不會被檢測到。文獻[20]中提出了一種基于JavaScript 的動態污點跟蹤技術,但此技術建立在能夠獲取源代碼的基礎上,獲取難度較大。某些攻擊還可能利用內存布局知識,例如在AAR 及其相關庫中存在某些函數和ROP gadget 工具,這部分情況很難通過外部手段進行模擬和分析。Liu 等[21]沒有模擬JavaScript 執行環境,而是用上下文監控代碼來檢測PDF 文檔,并使用AAR 自己的執行環境來執行JavaScript 代碼,因此不受兼容性問題的影響;然而,該方法只會監控較為常見且已知的惡意行為模式,如網絡訪問、堆噴和動態鏈接庫(Dynamic Link Library,DLL)注入等,這些模式不是完全通用的,當出現新的反惡意代碼檢測手段時,必須對檢測模型進行擴展。
鑒于以上兩類檢測方法的不足,試圖找到滿足以下三點要求的檢測方法。
1)能夠在不需要惡意行為的先驗知識的基礎上有效應對未知攻擊。
2)使用不依賴于機器學習的檢測方法。
3)對惡意文檔檢測技術進行進一步補充,提高攻擊者的攻擊難度。
本文提出了一種新的解決策略,即利用主機異常檢測中的檢測技術對惡意文檔進行檢測。目前來說,主機異常檢測的一個熱點研究方向是利用系統調用數據進行檢測。系統調用數據之所以會是主機異常檢測研究的重點選擇,是因為它是操作系統內核級活動的主要產物。換言之,系統調用數據是沒有經過過濾、解釋或處理的,攻擊者無法進行修改或刪除等操作,由此可確保所收集數據的完整性。通常來說,基于系統調用的檢測方法有不同的研究方向,包括利用系統調用的順序特征、頻率特征等進行建模從而完成異常檢測。本文試圖在保證檢測的準確性同時盡量降低檢測的性能開銷,綜合利用系統調用的順序和頻率特征。另外,鑒于依靠機器學習的檢測可能會被攻擊者按某些規則進行規避[13-15],且檢測開銷巨大,所以本文使用不依賴于機器學習的檢測方法。
根據以上需求,受Wang 等[22]研究的啟發,本文提出了NtProvenancer 模型。該模型使用了基于系統調用的異常檢測技術。文獻[22]中,數據溯源圖是用于表示進程間交互行為的一種有向圖,目的是檢測隱藏的惡意軟件攻擊。NtProvenancer 模型將此溯源圖的結構用于內核級的系統調用,用于描述系統調用間的行為特征,以檢測惡意文檔的攻擊行為。
本章主要介紹本文模型的有關定義及設計思路。
首先,本文模型利用文檔執行時產生的系統調用進行惡意文檔檢測,故不考慮使用隱式流(側信道)執行的攻擊手段。這類攻擊繞過了系統調用接口,無法被系統調用追蹤工具捕獲進而生成有效的系統調用日志。
此外,由于本文檢測模型需要部署在主機上,實驗中認定執行PDF 程序的Adobe Reader 以及收集系統調用信息NtTracer 均為良性且可信的,且攻擊者無法對系統調用日志進行操作,收集的系統調用數據具備良好的完整性。
2.2.1 系統調用
系統調用v∈A,其中A是系統調用的集合。
2.2.2 調用事件
調用事件e=(src,dst,time)是由源調用號(src)、目的調用號(dst)、目的調用產生時間(time)所組成的三元組,并且src,dst∈A,源調用及目的調用用于表明相鄰兩個系統調用的前后文關系,time則記錄此次事件的時間。需要注意的是,由于系統調用可能會出現重復情況,源、目的調用所組成的二元組也會產生大量重復,故需加入時間屬性對不同事件進行區分。
2.2.3 線程調用序列
對系統調用日志中的數據按照線程進行劃分,提取各線程相對應的系統調用序列。對于某線程,其線程調用序列l=(v1,v2,…,vn),其中vi表示該線程的第i個系統調用;并且l∈T_Entity_Seq,其中T_Entity_Seq表示l所屬文檔下各線程調用序列的集合。
2.2.4 線程事件序列
線程調用序列中,相鄰兩系統調用間的調用事件組成線程事件序列。對于某線程調用序列l=(v1,v2,…,vn),其對應線程事 件序列H=(e1,2,e2,3,…,en,n+1),其中ei,i+1=表示由vi,vi+1以及vi+1所發生的時刻組成的調用事件;并且H∈T_Event_Seq,其中T_Event_Seq表示H所屬文檔下各線程事件序列的集合。
2.2.5 調用溯源圖
在Wang 等[22]的溯源模型PROVDETECTOR 中,溯源數據以溯源圖的形式用以標識不同進程間的交互信息,通過分析進程與交互信息組成的序列以完成檢測。受此啟發,針對每一個需要分析的PDF 樣本生成其相應的系統調用溯源圖。對于某個樣本p,其對應的調用溯源圖定義為其中V={v1,v2,…,vm}是系統調用的集合,E={e1,e2,…,em}是調用事件的集合。對于調用溯源圖而言,V表示圖中節點的集合,集合E表示圖中有向邊的集合。
2.2.6 特征序列
根據溯源圖結構特征,結合特征提取算法從某線程調用序列l中提取出特征序列{SpSeq1,SpSeq2,…,SpSeqn},對于任意特征序列SpSeqi均有SpSeqi?l。特征序列在訓練階段用以構造良性特征庫,在檢測階段用以完成文檔檢測。
結合以上定義,本文將對文檔的檢測轉化為對其相應調用溯源圖的檢測,即檢測文檔p所對應的溯源圖G(p)是否包含惡意特征序列。為便于后文論述,本文將不含惡意特征序列的調用溯源圖稱為良性溯源圖,把包含惡意特征序列的調用溯源圖稱為惡意溯源圖。
本文模型如圖2 所示,主要包含3 個部分。
圖2 本文檢測模型架構Fig.2 Framework of the proposed detection model
1)系統調用追蹤模塊:完成系統調用的追蹤與收集工作。包括收集系統調用名稱、產生時間以及對應的線程號等信息。
2)符號化模塊:負責將收集的系統調用數據進行符號化處理。這一步主要是便于核心部分進行溯源圖構造與特征片段提取等處理工作。
3)模型核心部分:將符號化的系統調用數據進行溯源圖的構造和特征片段提取,并完成良性特征庫的構造與異常檢測。
本文模型的特征如下:
1)采用基于異常檢測的技術,即只學習良性樣本特征。
2)利用調用溯源圖中的特征序列進行檢測。
分別解釋對模型進行以上設計的原因:首先,本文模型基于異常檢測技術,通過收集良性文檔執行時的系統調用特征構建特征庫,能較為有效地應對利用未知技術的惡意文檔攻擊。其次,僅使用溯源圖中的特征序列完成檢測,這是因為惡意文檔在執行過程中各線程產生的調用序列并非都是惡意的,且對于某個產生惡意行為的線程,其相應的線程調用序列也并非完全惡意的;因此需要找到其中的特征部分,用以區分良性文檔和惡意文檔。再者,僅使用長度較短的特征序列進行學習和檢測能夠有效提高模型的檢測性能,避免因粒度過細影響模型的檢測效果。
檢測工作的主要流程如圖3 所示。流程主要包括5 個部分:數據收集與預處理、線程調用序列提取、圖構建、特征序列提取、異常檢測。
圖3 文檔檢測流程Fig.3 Flow chart of document detection
數據收集過程中使用爬蟲程序爬取良性PDF 文檔,這部分文檔均上傳至VirusTotal 經由各家反病毒軟件進行檢測篩查,確定為良性文檔。而后從VirusTotal 中下載惡意PDF 文檔作為實驗使用的惡意樣本,同時從PDF 學習網站選擇一些使用PDF 高級功能的樣本作為良性樣本的補充,使收集的樣本足以覆蓋PDF 規范中的各項功能。完成收集工作后在Adobe Reader 閱讀器上運行并使用NtTracer 追蹤系統調用并記錄,而后編寫數據符號化的處理程序結束預處理工作。
對于每一個文檔來說,其運行時每分鐘都會產生數十萬次的系統調用記錄,且其中產生的系統調用存在大量重復的情況。另外需要注意的是,使用Adobe Reader 運行文檔時會創建多個線程,分別負責字體加載、渲染等各項工作。如果不按照線程將這些系統調用進行劃分,則可能會出現因線程間的并行導致記錄中前后系統調用的行為特征不一致的情況,所以應當對這些系統調用按線程進行區分。由于NtTracer 在收集系統調用數據時能夠根據輸入選項標識出每一系統調用所對應的線程號,通過將收集到的系統調用數據根據線程號進行整理,可生成各線程相應的調用序列。
對于文檔p,通過利用其線程調用序列集合T_Entity_Seq中的數據,可以構建文檔相應的調用溯源圖其中集合V是系統調用的集合,集合E是調用事件集合。調用事件e=(src,dst,time)用以表示相鄰兩次系統調用的前后關系及產生后一調用的時刻。調用溯源圖G(p)=構建的算法設計如下。
算法1 溯源圖構造算法。
通過算法1 將同一文檔下的多個線程調用序列進行整合,生成調用溯源圖,為后文尋找線程調用序列中的特征片段,即特征序列做準備。
Wang 等[22]從操作系統原生的事件跟蹤日志中收集系統事件序列用以構建溯源圖,而后結合其提出的路徑稀有度算法選取稀有度較高的系統事件序列作為圖的特征部分。參考其思路,本文對系統調用序列構建溯源圖,并給出圖中節點的稀有度定義。對于某文檔運行時生成的線程調用序列中的系統調用v,其稀有度定義為:
其中:N(v)表示該文檔下所有包含系統調用v的線程調用序列的集合,N則是該文檔下所有線程調用序列的集合,因此|N(v)|/|N|表示包含系統調用v的線程調用序列占該文檔全部線程調用序列的比例。
而TF(v)定義為:
其中:n(v)表示系統調用v在此線程調用序列中出現的次數,L表示此線程調用序列的長度,其值等于該線程調用序列包含的系統調用數。TF(v)的實際含義是系統調用v在此線程調用序列內出現的頻率。
進一步地,OUT(v)定義為:
其中FROM(v)定義為:
FROM(v)表示對于任意以系統調用v為源調用的調用事件中,目的調用的集合。對于調用溯源圖|FROM(v)|即為圖中節點v的出度。K表示該文檔下所有線程調用序列中包含的系統調用的集合。
類似地,給出IN(v)的定義:
其中TO(v)定義為:
IN(v)表示對于任意以系統調用v為目的調用的調用事件中,源調用的集合。對于調用溯源圖|IN(v)|即為圖中節點v的入度。
與文獻[22]中提出的稀有度定義相比,本文的定義中額外引入了系統調用的局部頻率TF(v)。本文認為,頻率本身作為一項能夠直觀反映稀有性的指標符合本文稀有度的定義要求,并且TF(v)的計算不依賴于圖結構,能夠為溯源圖中節點本身賦予一定的稀有度權重;另一方面,系統調用頻率在傳統入侵檢測領域中發揮的作用已得到充分驗證,研究表明,目前已提出的諸多基于系統調用頻率設計的檢測模型均有良好的檢測效果。
通過以上定義完成系統調用v的稀有度的計算,之后根據線程調用序列中各系統調用的稀有度進行排序,尋找稀有度數值最大的系統調用。根據Bridges 等[23]的研究,傳統入侵檢測領域中使用由6~8 個系統調用組成的短序列進行訓練和檢測的N-Gram 模型往往能取得較優的檢測結果。受此啟發,本文實驗中選擇各個線程調用序列中稀有度值最大的K個系統調用及其前后文組成長度為7 的K條短序列作為特征序列,用以后續的檢測。由于各線程調用序列長度不同,K的取值根據記錄線程調用序列的文件大小Size進行設定,對應關系如表2 所示。
表2 K值選取方法Tab.2 Selection method of K-value
在完成對線程調用序列的特征片段提取后,利用特征片段中各系統調用的稀有度值進行檢測。定義P(SpSeqtest)為特征序列SpSeqtest的測試結果,計算方式為:
其中:S是所有良性特征庫中特征序列的集合,Y(SpSeqtest,SpSeqbenign)表示計算待測序列SpSeqtest與良性特征序列SpSeqbenign的余弦相似度。計算方法為:
具體地,使用待測樣本的特征片段的稀有度值依次與所有良性特征庫中的特征片段稀有度值計算余弦相似度(實驗中n=7),并將計算的最大值作為檢測指標值。選取最大值作為檢測指標值,是因為只需待測樣本與某一良性特征序列有較高相似度,即可認為其為良性的。最終通過設置閾值,最終判斷待測樣本是否為惡意文檔。
實驗機器搭載了Intel Core i7-2.30 GHz 的CPU 與16 GB RAM 存儲器,系統為Windows 7 專業版SP1。每個樣本在執行2 min 后關閉。所有樣本均使用版本號為11.0.0 的Adobe Reader XI 閱讀器運行,同時使用NtTracer 追蹤并收集系統調用數據。
4.2.1 良性樣本
良性樣本收集方面首先利用Bing 搜索引擎,通過指定文件類型為PDF 格式,使用爬蟲程序爬取了511 個良性樣本。然而這類并沒有常見惡意樣本的特性,比如包含JavaScript腳本和在文檔中嵌入字體等;因此從PDF 學習網站上收集了17 個使用了PDF 高級功能的樣本,所有樣本都提交VirusTotal 并經過掃描,均被識別為良性文檔。
4.2.2 惡意樣本
從VirusTotal 收集了320 個PDF 文檔并放進沙箱執行,確定其均有惡意行為產生。
首先,在Adobe Reader 閱讀器上執行文檔,同時運行NtTracer 追蹤系統調用,將數據存入SQL Server 2008 數據庫中。然后,編寫符號化程序提取系統調用相關信息,并按所屬線程進行劃分,生成線程調用序列。進一步地,使用線程調用序列完成調用溯源圖的構建,并依據所提稀有度算法提取特征片段。最后,通過特征片段相應的稀有度值進行余弦相似度計算,并采用設置閾值的方法判斷文檔性質。實驗中的爬蟲程序、符號化程序、溯源圖構建程序以及實現稀有度計算與異常檢測的檢測程序均使用Python 編寫,代碼量約為12 000 行。在性能方面,記錄了從數據采集到完成異常檢測各部分的用時,并進行了性能評估。
對于基于系統調用頻率的異常檢測而言,一種較為常見的特征提取方法是使用詞頻-逆文檔頻率(Term Frequency-Inverse Document Frequency,TF-IDF)算法,即將每個系統調用視為一個單詞,統計各個系統調用的詞頻和逆文本頻率來篩選特征片段用于檢測。在實驗的第4 步,即特征序列的提取過程中,使用TF-IDF 以及PROVDETECTOR 中的稀有度算法作為本文算法的代替算法來進行對照實驗。
此外,本文實驗采用精確率(precision,pre)、召回率(recall,rec)和F1 分數(F1)這3 個指標衡量模型的檢測效果。F1 分數是精確率和召回率的調和平均值,即:
其中:TP(True Positives)表示樣本標簽為真,模型預測也為真的樣本數,這里表示樣本標簽為惡意,模型預測也為惡意的樣本數量。FP(False Positives)表示樣本標簽為假,模型預測為真的樣本數,即被錯誤預測為惡意的樣本數量。TN(True Negetives)表示樣本標簽為假,模型預測也為假的樣本數,這里表示樣本標簽為良性,模型預測也為良性的樣本數量。FN(False Negetives)表示樣本標簽為真,模型預測為假的樣本數,即被錯誤預測為良性的樣本數量。表3 為這4 個評價指標的直觀具體含義。
表3 評價指標具體含義Tab.3 Specific meanings of evaluation indicators
4.4.1 TF-IDF算法檢測結果
1)良性樣本檢測結果。實驗中使用Adobe Reader 執行待測的良性樣本,并使用TF-IDF 算法作為模型第4 步中稀有度算法的代替策略進行實驗。在閾值設定為0.98 時F1 分數最高,此時134 個良性待測樣本(其中17 個為利用了PDF 高級功能的樣本)里有42 個被認定為惡意樣本(包括10 個利用了PDF 高級功能的樣本)。
2)惡意樣本檢測結果。實驗共有320 個惡意樣本,在閾值為0.98 時F1 分數最高,此時311 個惡意文檔被認定為惡意樣本。
4.4.2 PROVDETECTOR 中稀有度算法檢測結果
1)良性樣本檢測結果。使用Wang 等[22]模型中的稀有度算法作為模型第4 步中稀有度算法的代替策略進行實驗。在閾值設定為0.96 時F1 分數最高,此時134 個良性待測樣本(其中17 個為利用了PDF 高級功能的樣本)里有15 個被認定為惡意樣本(包括6 個利用了PDF 高級功能的樣本)。
2)惡意樣本檢測結果。實驗共有320 個惡意樣本,在F1分數最高即閾值設定為0.96 時,此時318 個惡意文檔被認定為惡意樣本。
4.4.3 NtProvenancer模型檢測結果
1)良性樣本檢測結果。使用Adobe Reader 執行待測樣本,在模型的第4 步中使用本文所提出的稀有度算法進行實驗。在閾值設定為0.96 時F1 分數最高,此時134 個良性待測樣本里有7 個被認定為惡意樣本(包括5 個利用了PDF 高級功能的樣本)。
2)惡意樣本檢測結果。當閾值設定為0.96 時F1 分數最高,為0.989,此時320 個惡意文檔均被識別為惡意樣本。詳細的檢測結果如圖4 所示。
圖4 三種算法的模型檢測結果比較Fig.4 Model detection result comparison of three algorithms
實驗中三種方式下測試結果的精確率、召回率和F1 分數詳細結果如表4 所示。為便于描述,表中PROVDETECTOR 及NtProvenancer 代表各自模型的路徑篩選算法。
由表4 可以看到,NtProvenancer 模型在閾值為0.96 時取得最大F1 分數0.989,而TF-IDF 算法置換后的模型在閾值為0.98 時取得最大值0.924,PROVDETECTOR 中的稀有度算法置換后的模型在閾值為0.96 時取得最大值0.974。從結果來看本文模型明的檢測結果明顯優于TF-IDF 算法置換后的模型,略優于PROVDETECTOR 中算法置換后的模型。取得這一結果的原因是TF-IDF 算法在進行特征提取時,只是基于系統調用的頻率來挑選更加具有類別區分能力的系統調用;而本文模型的特征提取算法則綜合考慮了系統調用的頻率、出現類別所占比例,并加入了圖論領域的入度與出度等概念對特征提取算法進行了進一步優化,引入了系統調用的上下文信息。這一方式同時結合了系統調用的頻率特征和順序特征,所以能夠取得更好的檢測效果。相較于本文所提出的稀有度定義而言,PROVDETECTOR 中的定義由于缺少了系統調用在同一線程中出現的頻率,對系統調用序列中頻率特征提取不夠完備,由此導致檢測效果上略有不足。
表4 三種評價指標的對比結果Tab.4 Comparison results of three evaluation indicators
實驗過程中發現,可考慮直接使用稀有度的值作為評判標準,通過識別包含較低稀有度的系統調用序列,進而完成惡意文檔檢測。為此展開進一步實驗。
在根據稀有度提取特征序列后,計算序列中各系統調用稀有度的均值,并設定閾值用以判斷序列惡意與否。此時惡意序列判斷標準為:稀有度均值低于設定閾值的特征序列視為惡意的,生成惡意序列的對應文檔也同樣認定為惡意的。同樣在320 例惡意樣本和134 例良性樣本上進行實驗,并計算不同閾值下該方法的精確率、召回率和F1 分數,生成如圖5 所示的曲線圖。
圖5 稀有度均值法下模型的檢測結果Fig.5 Model detection results under rarity mean method
從圖5 中可以看到,閾值在0.001 5 之后的測試中,召回率不斷提高,但是精確率卻降低了。后經分析發現隨著閾值的不斷增大,產生誤報的良性樣本數在模型識別出的惡意樣本中所占比例也不斷提高,導致檢測效果并不理想。
為探究誤報數量增多的原因,對實驗所使用的所有良性樣本和惡意樣本線程調用序列中的系統調用的稀有度值進行了調查,結果如圖6 所示。
圖6 線程調用序列中的系統調用稀有度分布Fig.6 System call rarity distribution in sequences of thread calls
通過將各線程調用序列中系統調用的最大稀有度值和最小稀有度值組成二元組繪制出圖6 所示的散點圖。從圖6中點的分布情況可以看出,無論是對于良性測試文檔還是惡意測試文檔的線程調用序列,其序列中系統調用的最大稀有度和最小稀有度的分布情況均較為相似;雖然總體上惡意序列中的系統調用在低稀有度處的分布會更加集中,當然這里只是用最大值-最小值近似表示各線程調用序列中稀有度數據的分布,近似地認為各序列稀有度在極值相近時其序列中的稀有度值分布情況也應是相近的。由圖6 可知,無法根據稀有度均值設定閾值將圖6 中兩類點進行有效分離,即無法根據特征序列的稀有度值有效區分惡意序列和良性序列。實際上,無論是惡意文檔還是良性文檔,都會存在稀有度很低的系統調用,也都會存在稀有度較高的系統調用。換言之,單純使用稀有度值無法有效地進行惡意文檔檢測,所以必須考慮結合上下文特征進行改進,這與本文模型的設計思想是一致的。
為說明進行特征片段提取的必要性,選擇了兩組良性與惡意的線程調用序列進行比較實驗。利用滑動窗口,將每個系統調用及其后6 個調用組成長度為7 的系統調用片段,而后對每一片段計算其與良性特征庫中特征片段的相似度。圖7 是兩組序列中的片段與良性特征庫中片段的相似度情況。
從圖7 中可以發現,惡意線程調用序列相較于良性線程會出現更多的低相似度片段;但即使是惡意線程,其大部分的短序列與良性特征庫中的特征序列都有較高的相似度。這說明對于文檔攻擊而言,大部分惡意行為都是隱藏在大量良性行為活動中;同時也說明了挑選具有代表性的短序列片段,即特征片段進行檢測的合理性。通過檢測特征序列可以有效減少惡意良性行為被掩蓋導致無法正確檢測的情況出現,并且能夠降低性能開銷。值得注意的是,部分良性線程也會出現一些相似度較低的片段,這可能是因為用以采集良性特征的良性樣本數量稍有不足,沒有完全覆蓋所有的良性行為特征,需要進一步地增加用以采集良性特征的良性樣本數量。
圖7 兩例惡意線程與良性線程的系統調用片段相似度比較Fig.7 Two examples of similarity among system call fragments between malicious thread and benign one
在最佳參數設置下進行性能測試,此時系統調用短序列長度設置為7,模型閾值設置為0.96。分別測試了模型在訓練和檢測兩種模式下的用時情況。
4.5.1 訓練用時
訓練用時主要包括以下幾部分:提取線程調用序列用時、構建調用溯源圖用時、提取特征序列用時、構建良性的特征序列庫用時。在實驗中,對于394 個文檔共計45 733 138條系統調用記錄進行線程調用序列的提取,共提取線程調用序列6 880 條,提取特征序列15 493 條,提取單個線程調用序列的平均用時為19.11 ms;對每一個訓練樣本而言構建調用溯源圖的平均用時為7.93 ms,平均每個調用溯源圖包含17.46 條線程調用序列的信息;對于一個線程調用序列,提取其特征序列的平均用時為26.50 ms,最終構建良性特征庫并存入15 493 條特征序列信息總用時104 s。
4.5.2 檢測用時
檢測用時主要包括以下幾部分:提取線程調用序列用時、構建調用溯源圖用時、提取特征序列用時、異常檢測用時。在檢測時,對于454 個文檔(包含134 個良性文檔與320個惡意文檔)共計50 776 144 條系統調用記錄進行線程調用序列的提取,共提取線程調用序列7 778 條,提取單個線程調用序列的平均用時為17.83 ms。對每一個待測樣本而言構建調用溯源圖的平均用時為5.84 ms,平均每個系統調用溯源圖包含17.13 條線程調用序列的信息。在第4 步的提取特征序列階段中,提取單個線程調用序列的特征序列的平均用時為23.57 ms。最終文檔的異常檢測平均用時為13.31 ms。訓練與檢測用時具體情況如表5 所示。
表5 訓練與檢測階段的用時情況 單位:msTab.5 Time cost of training and detection stages unit:ms
此外,由于本模型只需要單線程的執行方式即可完成全部工作,后續可以采取多核并行的方式進一步減少檢測用時。
本文設計了一種基于系統調用與數據溯源技術的惡意文檔檢測模型。該模型結合基于系統調用頻率與順序特征的異常檢測技術特點,同時利用溯源技術完成系統調用級溯源圖的構造,并提出一種基于圖的特征提取算法用于篩選特征片段完成檢測。與其他檢測系統相比,本文提出的檢測模型漏報率、誤報率較低,能夠有效全面地完成惡意文檔檢測。但該模型也存在著一定的提升空間,如攻擊者可能會根據稀有度算法設計出稀有度很高的攻擊序列來規避檢測,后續還應在此方面進行改進。
未來可能會考慮利用異構技術對模型檢測效果進行進一步完善,如利用不同文檔閱讀器下堆棧、庫依賴項、文件系統語義以及系統調用及其參數的差異性來進一步完善模型的檢測機制,提高系統的檢測性能。