劉 岳 ,劉寶旭 ,趙子豪 ,劉潮歌 ,王曉茜 ,吳賢達
1 中國科學(xué)院信息工程研究所 北京 中國 100093
2 中國科學(xué)院大學(xué)網(wǎng)絡(luò)空間安全學(xué)院 北京 中國 100049
隨著互聯(lián)網(wǎng)技術(shù)的發(fā)展,人們的生產(chǎn)和生活方式發(fā)生了巨大的改變[1],網(wǎng)絡(luò)安全問題也愈發(fā)嚴峻。據(jù)賽門鐵克發(fā)布的互聯(lián)網(wǎng)安全威脅報告顯示[2],2019 年其在全球超過157 個國家和地區(qū)的1.23 億個監(jiān)測終端,平均每天報告攔截的網(wǎng)絡(luò)攻擊次數(shù)達1.42 億次。
在網(wǎng)絡(luò)攻擊中,APT(高級可持續(xù)威脅,Advanced Persisten Threat)攻擊是指對特定目標進行長期持續(xù)性網(wǎng)絡(luò)攻擊的一種攻擊方式。APT 攻擊的全鏈路[3-4]如圖1 所示。
由于APT 攻擊過程中的隱蔽性需要,無文件惡意代碼[5]越來越多地被應(yīng)用在了APT 攻擊鏈路中。具有代表性的有,2012 年最早出現(xiàn)的無文件惡意代碼Lurk[6],2015 年的Duqu2.0[7],2017 年的poshspy[8],2020 年 Donoff 系列的TrojanDownloader[9]。在無文件惡意代碼的攻擊過程中,存在于Windows 操作系統(tǒng)中的Powershell 是攻擊者常使用的攻擊方式。據(jù)安全公司Macfee 2020 年7 月發(fā)布的網(wǎng)絡(luò)安全威脅報告[9]數(shù)據(jù)顯示,與上一季度相比,2020 年第一季度的新Powershell 惡意軟件數(shù)量增長了689%。Powershell是一種命令行shell 程序,微軟默認將其安裝于Windows 系統(tǒng)中。由于Powershell 可以直接調(diào)用.NET和Windows API,并且允許使用者可以從其他系統(tǒng)登錄下載代碼并遠程執(zhí)行的特性,Powershell 被廣泛應(yīng)用于配置管理和任務(wù)自動化,但其便捷性使其成為了大量開源滲透工具的利用對象。通過利用Powershell 下載shellcode、內(nèi)存運行、修改注冊表以及WMI(Windows 管理規(guī)范,Windows Management Instrumentation)等方式,攻擊者可以實現(xiàn)無本地文件駐留并持久化,從而達到攻擊利用的目的。以GorgonAPT 為例,攻擊者誘導(dǎo)受害者點擊Word 文件,通過宏代碼解密執(zhí)行Powershell 下載,隨后執(zhí)行vbs腳本,再通過新釋放的Powershell 腳本執(zhí)行payload加載njrat 遠控木馬。在該過程中,通過宏執(zhí)行解密的Powershell 代碼如下:
"$T='*EX'.replace('*','I');sal M $T;'(&(GCM'+'*W-O*)'+'Net.'+'Web'+'Cli'+'ent)'+'.Dow'+'nl'+'oad'+'Stri'+'ng(''http://19*.***.***.***/doc umento/cdt.jpg'')'|M|M"。
該段Powershell 代碼的作用是從遠程服務(wù)器上下載cdt.jpg 文件到本地解析并執(zhí)行,從而為后續(xù)攻擊行為做鋪墊。
為了在Windows 系統(tǒng)上防御以Powershell 為代表的腳本攻擊,Microsoft 發(fā)布了用于檢測惡意代碼的掃描接口(Antimalware Scan Interface,AMSI)[10],該接口通過檢查腳本引擎執(zhí)行的代碼為Windows 系統(tǒng)提供防御,但AMSI 本身未提供Powershell 惡意代碼的檢測方案。在傳統(tǒng)的惡意代碼檢測技術(shù)中,根據(jù)指紋、特征庫、黑白名單等的檢測方式難以達到高準確率、高召回率、低誤報率的效果。這也使得可以從大量數(shù)據(jù)中自主學(xué)習(xí)的機器學(xué)習(xí)技術(shù)被越來越多地應(yīng)用在了惡意代碼檢測領(lǐng)域,但目前在Powershell 惡意代碼檢測領(lǐng)域仍應(yīng)用較少。在惡意代碼檢測問題中,安全研究人員常常依據(jù)手動抽取的特征建立原始特征數(shù)據(jù)集,利用貝葉斯、支持向量機、決策樹等算法訓(xùn)練模型,以此用于惡意代碼分類識別[11-12]。在上述方法的研究實驗中,依賴人工的特征選取是使用機器學(xué)習(xí)進行惡意代碼檢測方法中普遍存在的問題,在特征較多的情況下,研究人員很難根據(jù)經(jīng)驗決定哪種特征是對于惡意代碼檢測更有效的特征,而目前對于優(yōu)化原始特征表達的方式主要以降維、壓縮和特征選擇為主,多存在信息損耗和丟失的問題,此時便需要一種有效方法對原始數(shù)據(jù)進行更有效的特征表達。
本文為解決上述Powershell 惡意代碼檢測中存在的特征選取困難和檢測效果差的問題,提出一種基于隨機森林特征組合和深度學(xué)習(xí)的Powershell 惡意代碼檢測方法,稱為多特征組合Powershell惡意代碼檢測方法(Features Combination Powershell Malware Detection System,FC-PSDS)。具體的,FC-PSDS采用集成學(xué)習(xí)思想,利用隨機森林對原始特征進行非線性變化和特征組合得到更好表征原始數(shù)據(jù)的新特征組合,再利用深度學(xué)習(xí)算法進行檢測識別。本文的三個主要貢獻如下:
1) 提出一種 Powershell 惡意代碼檢測方法FC-PSDS,該方法首先利用隨機森林,通過集成多個決策樹來自動化生成對于原始數(shù)據(jù)更好特征表達的組合,再應(yīng)用深度神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)特征并分類,實現(xiàn)了在測試數(shù)據(jù)中99%以上的檢測準確率。
2) 提出一種基于隨機森林特征組合的重表達原始數(shù)據(jù)的方法,驗證了隨機森林在特征組合表達上的有效性。該方法根據(jù)輸入特征的不同維度,使用隨機森林將其組合生成更能表征原始數(shù)據(jù)的新特征組合,而非傳統(tǒng)的簡單線性選擇方式,再將其傳入深度神經(jīng)網(wǎng)絡(luò)中訓(xùn)練,實現(xiàn)了對原始數(shù)據(jù)的更優(yōu)表達。
3) 實現(xiàn)了基于Powershell 惡意代碼檢測方法FC-PSDS 的檢測系統(tǒng),實驗結(jié)果表明該系統(tǒng)擁有高召回、低誤報,時間性能良好的特點,能夠用于Powershell 惡意代碼檢測。
本文余下內(nèi)容,第2 節(jié)介紹了Powershell 惡意代碼檢測研究的現(xiàn)狀,第3 節(jié)介紹了FC-PSDS 的方法框架,第4 節(jié)介紹了FC-PSDS 在真實數(shù)據(jù)中的檢測效果和與其他方法的對比,第5 節(jié)為討論,第6 節(jié)為總結(jié)。
意代碼檢測領(lǐng)域,具有代表性的科研工作總結(jié)如表1所示。
Powershell 惡意代碼的研究可以根據(jù)檢測方式主要分為利用自然語言處理技術(shù)的檢測識別方法、基于異常調(diào)用的異常檢測方法、基于特征識別的檢測識別方法。
表1 Powershell 檢測相關(guān)技術(shù)研究Table 1 Research on Powershell malware detection
目前,以Powershell惡意代碼為代表的無文件惡
基于自然語言處理技術(shù)的檢測方法主要利用基于自然語言處理的文本識別方法對Powershell 惡意代碼進行分類檢測。自然語言處理技術(shù)已經(jīng)被大量的應(yīng)用到了情感分析[13-14]、惡意代碼檢測問題[15-17],但使用自然語言處理技術(shù)檢測Powershell 惡意代碼仍存在較大的研究空間。文獻[18]對Powershell 代碼的命令語法構(gòu)建了基于前綴樹的詞干分析器,將詞干內(nèi)容向量化后,使用支持向量機、深度神經(jīng)網(wǎng)絡(luò)等監(jiān)督學(xué)習(xí)分類器進行Powershell 惡意代碼分類。文獻[19]將Powershell 命令作為文本進行頭部固定長度的one-hot 編碼處理,然后將其傳入卷積神經(jīng)網(wǎng)絡(luò)進行特征學(xué)習(xí)和分類,該方法在66388 個樣本的數(shù)據(jù)集中精確率達到 95%以上,該數(shù)據(jù)集擁有 6290 個惡意樣本和 60098 個良性樣本。文獻[20]將Powershell 惡意代碼進行文本處理,采用自然語言處理技術(shù),分別將經(jīng)one-hot 編碼的字符級數(shù)據(jù)和使用FastText預(yù)訓(xùn)練的令牌級表示作為輸入,使用卷積神經(jīng)網(wǎng)絡(luò)和長短期記憶網(wǎng)絡(luò)進行特征學(xué)習(xí)和分類,該方法在測試集中的召回為89.4%?;谏疃葘W(xué)習(xí)自然語言處理方式的檢測方法在目前的研究中大多通過分詞的方式將處理后的數(shù)據(jù)直接傳入神經(jīng)網(wǎng)絡(luò),該種方式僅采用Powershell 惡意代碼本身的程序語言特征,容易在訓(xùn)練過程中產(chǎn)生過擬合的現(xiàn)象,從而影響測試的召回和泛化效果。
在基于異常調(diào)用的檢測方法上,文獻[21]利用系統(tǒng)日志、系統(tǒng)計劃任務(wù)列表、啟動項的調(diào)用信息,通過檢測是否包含敏感調(diào)用來判斷是否存在Powershell 攻擊。文獻[22-24]提出了檢測 Powershell惡意代碼的方法,一種方式為在Powershell代碼執(zhí)行時進行調(diào)用函數(shù)和進程的監(jiān)聽,檢測隱藏的Powershell 窗口行為、代碼加密行為,將其與預(yù)設(shè)特征庫進行匹配進行惡意性的識別;另一種檢測方式為,在執(zhí)行中檢測 Powershell 的進程鏈,將其調(diào)用關(guān)系與預(yù)設(shè)的黑白名單做比對,從而實現(xiàn)對于Powershell 代碼惡意性的決策。此種檢測方法針對執(zhí)行中的 Powershell 惡意代碼,優(yōu)點是可不考慮基于字符串等基礎(chǔ)混淆方式的影響,但基于執(zhí)行中特征碼掃描的方式存在容易被繞過和無法實現(xiàn)離線檢測的問題。
在基于特征分類的檢測方法上,機器學(xué)習(xí)和深度學(xué)習(xí)技術(shù)被廣泛應(yīng)用在惡意代碼檢測領(lǐng)域[25-27]。在Powershell 惡意代碼檢測中,文獻[28]利用機器學(xué)習(xí)方法對 4100 個Powershell 惡意代碼家族分類,研究人員利用Powershell 代碼的抽象語法樹的深度和節(jié)點個數(shù)特征,使用機器學(xué)習(xí)中的隨機森林算法,抽取特征學(xué)習(xí)訓(xùn)練分類檢測模型,獲得 85%的分類精確度。文獻[29]利用決策樹、隨機森林等機器學(xué)習(xí)方法,對經(jīng)專家系統(tǒng)提取的特征通過機器學(xué)習(xí)分類器進行識別。文獻[30]通過使用卷積神經(jīng)網(wǎng)絡(luò)從Powershell 代碼中提取命令的特征,并將經(jīng)其提取的特征傳遞給遞歸神經(jīng)網(wǎng)絡(luò)做分類識別,在實驗數(shù)據(jù)集上達到召回率97%,誤報率1%的效果。基于純特征檢測方法的檢測效果受特征提取的有效性影響較大,且不同特征對于分類結(jié)果的權(quán)重不同,對于不同特征的有效性缺少評價的體系,手動提取特征的冗余性和有效性直接決定了模型的效果。
與上述現(xiàn)有的工作成果不同,相比于純動態(tài)檢測的高耗時、無法離線檢測,純自然語言處理、特征分類的易過擬合和純手動提取特征耗時、繁瑣且存在冗余的問題。本文提出的FC-PSDS 方法結(jié)合隨機森林和深度神經(jīng)網(wǎng)絡(luò),通過隨機森林特征組合生成對原始數(shù)據(jù)更優(yōu)的特征表達,并通過深層神經(jīng)網(wǎng)絡(luò)抽象并自動學(xué)習(xí)經(jīng)特征組合生成的新特征,從而實現(xiàn)對Powershell惡意代碼的有效識別,同時該方法可用于離線檢測。
FC-PSDS 方法設(shè)計的目標是使用隨機森林和深度神經(jīng)網(wǎng)絡(luò)檢測惡意Powershell 代碼。具體的,通過混淆去除和標準化從Powershell 代碼中抽取特征組成原始特征集,根據(jù)集成學(xué)習(xí)思想使用原始特征集生成對原始數(shù)據(jù)表達更有效的新特征組合,并據(jù)此訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)分類器模型,以此解決傳統(tǒng)方法對于Powershell惡意代碼的檢測困難,以及冗余特征導(dǎo)致的模型檢測能力較差的問題。本文提出的FC-PSDS 總體框架圖如圖2 所示。其中,FC-PSDS的檢測過程如下所示:
1) 原始數(shù)據(jù)處理。FC-PSDS 首先對數(shù)據(jù)進行處理,通過混淆檢測框架和混淆去除對數(shù)據(jù)進行標準化操作,然后對標準化后的Powershell代碼抽取初始特征,再對數(shù)據(jù)進行切分。
2) 特征組合。由于手動抽取的初始特征均為離散型,且不同特征的量級存在差異,因此為保證分類模型可以有更好的擬合和泛化效果,FC-PSDS 利用集成學(xué)習(xí)的思想,使用多決策樹分類器組合的隨機森林對初始特征進行特征組合生成可以更好表達原始數(shù)據(jù)的新特征。
3) 模型訓(xùn)練與分類識別。FC-PSDS 將經(jīng)過特征組合后生成的新特征數(shù)據(jù)作為模型的輸入,并使用深度神經(jīng)網(wǎng)絡(luò)作為攻擊檢測的模型。再通過預(yù)設(shè)的效果評估指標衡量FC-PSDS 的檢測效果。
FC-PSDS 的數(shù)據(jù)處理部分包括對原始Powershell 代碼的去混淆和標準化,對原始特征的提取和數(shù)據(jù)切分。
3.1.1 去混淆和標準化
混淆去除。本文方法采用的數(shù)據(jù)原始格式為文本格式,由于Powershell 代碼中存在大量的混淆,需要在特征提取前對樣本進行混淆去除,否則會對提取特征的有效性產(chǎn)生干擾。Powershell 代碼中常見的混淆類型包括字符操作、編碼、加密和壓縮。以獲取并終止Notepad 進程的Powershell 代碼為例,經(jīng)過混淆后的部分效果如表2 所示。
對于本文使用的數(shù)據(jù),首先使用混淆檢測框架Revoke-Ofuscation[31]對樣本進行混淆檢測,該框架可以對Powershell代碼進行混淆識別,包括基于字符串、編碼、加密、壓縮的混淆等。對于經(jīng)Revoke-Ofuscation 檢測存在混淆的樣本,根據(jù)論文[29]的方法,通過執(zhí)行該代碼并記錄其日志調(diào)用記錄、基于正則的靜態(tài)混淆去除等方式來實現(xiàn)對于混淆的去除。具體的,該方法通過動靜結(jié)合的混淆去除方式,先執(zhí)行該Powershell 代碼,收集其運行的腳本日志信息,該方式可以繞過除字符類編碼之外的混淆,若檢測到字符類編碼的混淆,則將執(zhí)行后日志中收集到的中間碼,利用正則表達式去混淆。若為非字符類混淆的其他方式混淆的代碼,在經(jīng)動態(tài)執(zhí)行后,首先利用正則表達式對于獲得腳本日志進行重排、換行、字符切割等方式的混淆去除,對于該步混淆去除后的得到的內(nèi)容,若檢測存在invoke-Expression 命令,則去除該命令后再執(zhí)行,以此獲得執(zhí)行后的結(jié)果。通過上述方式便可以獲得混淆去除后的代碼,該方式優(yōu)勢在于,這種動靜結(jié)合的方式可以解決部分混淆難以通過正則等靜態(tài)方式去除的問題,從而提高了去混淆的效果。
標準化。由于Powershell 允許使用者使用參數(shù)補全和命令別名,用戶在Powershell中設(shè)置的參數(shù)具有隨機性,這會導(dǎo)致從代碼文本的角度提取特征存在困難,在提取Powershell 代碼的語法樹結(jié)構(gòu)前,需要將參數(shù)標準化,以降低提取難度,提高檢測召回效率。本文采用論文[29]的標準化方法:面向Powershell的Cmdlet 參數(shù)對Powershell 構(gòu)建每條命令的參數(shù)前綴樹(Trie)。構(gòu)建的前綴樹中的節(jié)點內(nèi)容為參數(shù)的所包含字符,同時為記錄當前字符是否為命令的最后一個字符,在節(jié)點中設(shè)置了布爾值用于表示當前位置。使用字典結(jié)構(gòu),key 為當前所在位置字符,value為子節(jié)點。在進行對樣本數(shù)據(jù)進行特征提取時,對Powershell 的抽象語法樹使用Findall 函數(shù)抽取代碼中的命令和參數(shù),根據(jù)創(chuàng)建好的命令參數(shù)前綴樹,在前綴樹中搜索以當前參數(shù)為前綴的標準參數(shù),以此達到Powershell 代碼標準化的目的。
表2 Powershell 代碼混淆示意Table 2 Powershell code obfuscation
3.1.2 原始特征提取
在經(jīng)過對原始數(shù)據(jù)的混淆去除和標準化后,對處理后的樣本進行原始特征的提取,本文結(jié)合現(xiàn)有的Powershell 惡意代碼中常見的提取的特征基礎(chǔ)上[29],在Powershell 5.0 版本的背景下,從Powershell 語法樹節(jié)點數(shù)、語法樹寬度、語法樹深度,Powershell 語句長度、語句個數(shù)、變量數(shù)量、Powershell cmdlet 命令、cmdlet 參數(shù)等8 個維度提取共計1657 個離散型特征。對原始文本格式的Powershell 惡意代碼樣本,經(jīng)特征提取后映射為1657 維的原始特征向量。表3 所示為1個經(jīng)特征提取后的Powershell 樣本的部分特征向量。
表3 經(jīng)特征提取后的Powershell 樣本Table 3 Powershell sample after feature extraction
3.1.3 交叉驗證
為了使FC-PSDS 方法具有更好的泛化能力和更有效的評估方法效果,本文對FC-PSDS 方法進行了交叉驗證,FC-PSDS 對數(shù)據(jù)采用 k-折交叉驗證(k-fold cross validation),以此構(gòu)造實驗使用的數(shù)據(jù)集。k-折交叉驗證在實驗過程中將原始數(shù)據(jù)分為k 組,在訓(xùn)練的過程中每個子集分別成為一次驗證集,其余k-1 組子集作為模型訓(xùn)練集。
本文FC-PSDS 方法采用的方法為10-折交叉驗證,該方法將數(shù)據(jù)集均分為10 份,即9 份用作訓(xùn)練,1 份用作測試,訓(xùn)練時根據(jù)測試的結(jié)果優(yōu)化下一輪的迭代。
對于經(jīng)過預(yù)處理得到的原始特征數(shù)據(jù),由于經(jīng)人工提取的不同特征對模型的分類效果影響不同,維度較高的原始特征數(shù)據(jù)若直接傳入分類模型中會導(dǎo)致其存在大量無關(guān)和冗余特征。直接使用其訓(xùn)練分類器模型會導(dǎo)致檢測效果、泛化能力差。為了使分類模型可以更好更快收斂,此時便需要對原始的經(jīng)特征工程提取的特征數(shù)據(jù)進行更優(yōu)化的表達。
常用降維方法。當前研究中應(yīng)用較多的方式比如通過主成分分析(Principal Component Analysis,PCA)、自編碼器(Auto-Encoder,AE)等對高維數(shù)據(jù)進行降維,以自編碼器為例,基于自編碼器的降維方式屬于基于深度學(xué)習(xí)的降維方法,可以從原始數(shù)據(jù)中通過壓縮和還原的操作,從中間層得到經(jīng)非線性計算的壓縮后的數(shù)據(jù)。自編碼器包含編碼器(Encoder)和解碼器(Decoder),若用β和γ 表示對應(yīng)的映射,則自編碼器降維的原理如公式(1)所示。
除該種方法外,對原始特征數(shù)據(jù)的表示優(yōu)化還可以通過特征選擇和特征組合的方式進行。
特征選擇方法。特征選擇方法的思想為在原始的所有M 個特征的特征集合中,選取由N 個特征組成的子集,從而使得該子集在評價指標中的效果最優(yōu)[32]。該方式通過選取最優(yōu)特征子集的方式可以減少原始特征數(shù)據(jù)中冗余特征對于分類效果的影響,從而減少訓(xùn)練所需的時間。但不論是降維還是特征選擇的方式,對原始數(shù)據(jù)的壓縮和特征減少會對原始數(shù)據(jù)的表示存在損耗。
特征組合方法。對原始特征數(shù)據(jù)進行重表示的另一種方式是特征組合,特征組合是廣告系統(tǒng)中進行點擊率預(yù)估的常用方法[33],在廣告系統(tǒng)的點擊率預(yù)估(Click-Through-Rate,CTR)問題中,由于預(yù)估模型的輸入樣本量非常大,為了能夠使模型更快速的訓(xùn)練,在輸入模型前需要對數(shù)據(jù)進行更有效的特征工程,好的特征工程不但可以減少訓(xùn)練的時間也可以提高后續(xù)檢測模型的分類效果。CTR 預(yù)估問題中常用到的梯度提升樹(Gradient Boosting Decison Tree,GBDT)便是用于特征組合的常用方法,除此之外隨機森林、XGBoost 也可用于特征組合。使用梯度提升樹或者隨機森林進行特征組合的原理為,當利用其構(gòu)建新的訓(xùn)練數(shù)據(jù)時,樹的每個弱分類器有且只有一個葉子節(jié)點可以輸出分類預(yù)測的結(jié)果,對于一個有f 個葉子節(jié)點的決策樹,便可以將一個進入決策樹的數(shù)據(jù)變換為一個f 維向量的新數(shù)據(jù),也就是原始特征經(jīng)決策樹處理后的新特征組合數(shù)據(jù)。當有k 棵決策樹構(gòu)成隨機森林時,輸入的原始數(shù)據(jù)便可以變換成k×f 維度的新特征組合。通過上述集成學(xué)習(xí)思想的特征組合方式,隨機森林特征組合的方法能夠得到對于原始數(shù)據(jù)的最優(yōu)表示,并可以增加檢測模型的魯棒性和有效性。相比于傳統(tǒng)的特征選擇方式,本文采用基于隨機森林的特征組合可以得到更有助于分類器逼近全局最優(yōu)解的特征組合。
隨機森林特征組合。本文采用了多決策樹集成的隨機森林作為特征組合的方法。集成學(xué)習(xí)是一種有監(jiān)督的機器學(xué)習(xí)技術(shù),通過組合多個監(jiān)督模型得到一個更全面的強監(jiān)督模型[34],以此解決單分類器性能不穩(wěn)定、易過擬合的問題。隨機森林算法[35]是一種基于決策樹的集成學(xué)習(xí)方法,其由多個決策樹組成,決策樹是一種用于解決分類問題的二叉樹,樹中的每一個節(jié)點表示一個數(shù)據(jù)集和對這個數(shù)據(jù)集的一次決策,樹的每條邊表示一種選擇,隨機森林的結(jié)構(gòu)如圖3 所示。通過決策樹可以將原本的N 維特征轉(zhuǎn)換為節(jié)點數(shù)量M 維的新特征。在從N 維擴增到M 維新特征組合的建立過程中,由于即使一個葉子節(jié)點只有一條數(shù)據(jù),從以一個根節(jié)點到該葉子節(jié)點的路徑也會被決策樹認為構(gòu)成一種決策方式,該種決策方式會導(dǎo)致決策樹在分類過程中易發(fā)生過擬合,從而影響后續(xù)訓(xùn)練分類模型的精度。通過集成多個決策樹形成隨機森林,根據(jù)投票的結(jié)果作為分類結(jié)果,就可以很好的避免過擬合的發(fā)生。
本文提出的基于隨機森林的集成學(xué)習(xí)方式,使用不同數(shù)量的決策樹進行投票選取最優(yōu)特征組合。同時,這種自動發(fā)現(xiàn)有效特征、特征組合的方式也可以彌補對于原始數(shù)據(jù)特征提取的人工經(jīng)驗不足,達到縮短實驗周期的目的。本文使用的特征組合算法如算法1 所示。
3.3.1 基于深度神經(jīng)網(wǎng)絡(luò)的模型訓(xùn)練方法
為了更好的提高模型檢測和泛化效果,本文提出的FC-PSDS 利用神經(jīng)網(wǎng)絡(luò)對重新組合后的特征進行檢測識別。目前在惡意代碼檢測領(lǐng)域中常用到的深度學(xué)習(xí)技術(shù)有卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Networks,CNN)、循環(huán)神經(jīng)網(wǎng)絡(luò)(Recurrent Neural Network,RNN)、長短期記憶網(wǎng)絡(luò)(Long Short-Term Memory,LSTM)等,但每種神經(jīng)網(wǎng)絡(luò)都有自己更適用的領(lǐng)域。本文提出的FC-PSDS 在經(jīng)隨機森林訓(xùn)練得到組合的新特征X′后,采用深層神經(jīng)網(wǎng)絡(luò)(Deep Nerual Network,DNN)進行入侵檢測。DNN 屬于第三代人工神經(jīng)網(wǎng)絡(luò),在結(jié)構(gòu)上擁有輸入層、中間隱藏層、輸出層,其結(jié)構(gòu)如圖4 所示。DNN 對輸入數(shù)據(jù)沒有要求,相比選用RNN、CNN 作為判別網(wǎng)絡(luò),可以較好地從輸入數(shù)據(jù)中檢測惡意性。
FC-PSDS 采用方法。FC-PSDS 在使用DNN 對其進行特征學(xué)習(xí)和分類時,使用He_Normal 對神經(jīng)網(wǎng)絡(luò)權(quán)值進行初始化,在隱藏層使用規(guī)范化層BatchNormalization 和Mini-batch,使用L2 正則避免過擬合,在訓(xùn)練過程中使用學(xué)習(xí)率衰減和提前結(jié)束縮短訓(xùn)練時間。
FC-PSDS 使用He_Normal 進行網(wǎng)絡(luò)權(quán)值初始化。傳統(tǒng)神經(jīng)網(wǎng)絡(luò)權(quán)值的初始化方式包括全0 初始化、全1 初始化、隨機初始化等,其中權(quán)值初始化為0 或1 會使神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)能力有限,隨機初始化則會在隨著神經(jīng)網(wǎng)絡(luò)的隱藏層增加后出現(xiàn)梯度消失問題。He_Normal 初始化的基本思想是在網(wǎng)絡(luò)正向傳播時,狀態(tài)值的方差保持不變;網(wǎng)絡(luò)反向傳播時,激活值梯度的方差不發(fā)生改變。He_Normal 初始化對于ReLU 和LeakyReLU 不同,對于ReLU 的方法如公式(2)所示:
對于LeakyReLU 的方法如公式(3)所示:
為避免梯度消失問題和增加訓(xùn)練速度,FC-PSDS在DNN 的隱藏層激活函數(shù)前添加批量規(guī)范化層BatchNormalization。添加后的DNN 網(wǎng)絡(luò)在每次使用Mini_batch 進行訓(xùn)練時,對網(wǎng)絡(luò)中隱藏層的規(guī)范化操作會使得網(wǎng)絡(luò)每層輸入的方差為1,均值為0。
同時,FC-PSDS 模型使用了學(xué)習(xí)率衰減和提前結(jié)束,訓(xùn)練過程中的學(xué)習(xí)率由初始學(xué)習(xí)率和學(xué)習(xí)率衰減系數(shù)決定,在訓(xùn)練初始時,為快速達到最優(yōu)解附近,設(shè)置較大的學(xué)習(xí)率。隨后,為避免因較大的學(xué)習(xí)率導(dǎo)致模型在訓(xùn)練的過程中震蕩,將學(xué)習(xí)率逐步降低。學(xué)習(xí)率指數(shù)衰減更新原理如公式(4)所示。其中,lr為學(xué)習(xí)率,lr0為初始化學(xué)習(xí)率,dr學(xué)習(xí)率衰減系數(shù),gs為當前已迭代輪數(shù),ds為衰減步長、即多少輪衰減一次學(xué)習(xí)率。當模型的訓(xùn)練損失在一定輪數(shù)內(nèi)不變時,便及早停止訓(xùn)練,減少訓(xùn)練損耗。
3.3.2 檢測分類
為根據(jù)模型輸出的數(shù)據(jù)進行預(yù)測分類合評估,FC-PSDS 方法采用了Adam 優(yōu)化器,使用Sigmoid 激活函數(shù)來對輸出的結(jié)果做分類預(yù)測,Sigmoid 函數(shù)的計算公式如公式(5)所示,t 為輸入,δ(t)為對應(yīng)輸出的概率值。當預(yù)測的概率小于0.5 時為正常Powershell樣本,反之為惡意Powershell 樣本。
FC-PSDS 的損失值計算選用交叉熵(cross-entropy loss),原理如公式(6)所示,xi為第i 個樣本,n 為分類的類別數(shù)目,q(xi)代表第i 個樣本的模型預(yù)測值,p(xi)代表第i 個樣本的真實值,J(p,q)代表交叉熵的計算結(jié)果值。
為了驗證本文所提出的 FC-PSDS 方法在Powershell 惡意代碼檢測過程中的實際效果,本文在收集的Powershell 惡意樣本和正常樣本數(shù)據(jù)集上進行了實驗,分析了本文提出方法的效果,并根據(jù)分類準確率、召回率、假陽率等多個指標評估了FC-PSDS 在實際應(yīng)用中的性能。
在實驗設(shè)計上,本文首先驗證了基于隨機森林的特征組合方法相比于使用原始手動提取的特征對于后續(xù)檢測模型效果提升的有效性。同時,本文使用FC-PSDS 與常見機器學(xué)習(xí)方法、深度學(xué)習(xí)方法和當前研究中的代表性Powershell 惡意代碼檢測模型的效果進行了橫向的對比,驗證了基于隨機森林的特征組合和深度學(xué)習(xí)的Powershell 惡意代碼檢測方法的有效性。
本文方法的實驗環(huán)境為Intel(R) Xeon(R) Silver 4114 CPU @ 2.20GHz,內(nèi)存500G,采用Python 語言、Keras、Sklearn、imblearn 等對本文方法進行實現(xiàn)及檢測測試。
為評估本文方法的普適性,本文實驗所用的數(shù)據(jù)集由Powershell 正常代碼、Powershell 惡意代碼組成,共計12610 個樣本。其中正常樣本由Github[36],Powershell Gallery[37],Daniel 等[19]的公開數(shù)據(jù)組成,共計8521 個樣本;惡意樣本由Github、Jeff White 等[38]的公開惡意樣本組成,樣本包括包括APT 攻擊過程中常見的下載器類、嵌入型載荷類、本地持久化類等,共計4089 個樣本。數(shù)據(jù)集中的樣本分布如圖5 所示。
本文首先使用隨機森林算法對數(shù)據(jù)進行特征的重新組合,為了能夠使經(jīng)隨機森林計算得到的新特征可以最好的表征原始數(shù)據(jù),使神經(jīng)網(wǎng)絡(luò)模型可以更好對數(shù)據(jù)進行擬合和分類,本文在測試隨機森林、深度神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)時使用了網(wǎng)格搜索進行參數(shù)優(yōu)化,對不同的結(jié)構(gòu)進行了測試實驗,以此獲得一個最佳的檢測模型。經(jīng)實驗后,本文采用的最佳結(jié)構(gòu)如下。隨機森林的結(jié)構(gòu)為決策樹數(shù)量為99,隨機森林最大深度為16,葉子節(jié)點最少數(shù)據(jù)數(shù)量為10,隨機森林在該結(jié)構(gòu)時對于原始數(shù)據(jù)的重表達效果最好。深度神經(jīng)網(wǎng)絡(luò)輸入層大小為128,隱藏層大小為64,batch_size 為256。
本文提出的FC-PSDS 方法是分類模型,為評估本文所采用檢測方法的效果,效果評估采用分類算法常用的用于度量有效性的指標,包括如下。
1) 真陽性(True Positive,TP),在分類結(jié)果中被預(yù)測為惡意樣本,實際為惡意樣本的樣本數(shù)量。
2) 假陽性(False Positive,FP),在分類結(jié)果中被預(yù)測為惡意樣本,實際為正常樣本的樣本數(shù)量。
3) 真陰性(True Negative,TN),在分類結(jié)果中被預(yù)測為正常樣本,實際為正常樣本的樣本數(shù)量。
4) 假陰性(False Negative,FN),在分類結(jié)果中被預(yù)測為正常樣本,實際為惡意樣本的樣本數(shù)量。
在使用上述數(shù)據(jù)根據(jù)分類結(jié)果得到的混淆矩陣中,采用準確率,假陽率,召回率三個指標來評價FC-PSDS 方法,同時對比其他方法的分類性能。具體如下。
1) 準確率(Accuracy,ACC):分類結(jié)果中,被正確分類的樣本數(shù)占總樣本數(shù)的百分比,是用于評估惡意代碼檢測方法整體性能的評價指標。
2) 精確率(Precision,PRE):分類結(jié)果中,被正確分類為惡意樣本的惡意樣本數(shù)量占被分類為惡意樣本總數(shù)的占比。
3) 假陽率(False Positive Rate,FPR):分類結(jié)果中,被錯誤分類為惡意樣本的正常樣本占正常樣本總數(shù)的比例。
4) 召回率(True Positive Rate,TPR):分類結(jié)果中,被正確分類為惡意樣本的惡意樣本數(shù)占惡意樣本總數(shù)的比例。
現(xiàn)階段的Powershell惡意代碼檢測領(lǐng)域,已有利用決策樹、隨機森林等一般機器學(xué)習(xí)方法和CNN、LSTM 等深度神經(jīng)網(wǎng)絡(luò)技術(shù)的案例。本文提出的FC-PSDS 方法沒有采用單一檢測方法,而是利用隨機森林和深度學(xué)習(xí)組合的方式進行分類識別。為了對FC-PSDS 方法的效果進行評估,以及證明隨機森林和深度神經(jīng)網(wǎng)絡(luò)進行模型組合的效果,本文首先利用實驗數(shù)據(jù)對隨機森林特征組合的效果進行了評估,以此驗證基于隨機森林的特征組合方法對于原始數(shù)據(jù)可以進行更好的表達,從而在傳入神經(jīng)網(wǎng)絡(luò)后可以實現(xiàn)更優(yōu)的分類效果。在對FC-PSDS 整體效果的評估上,選用了目前已有的Powershell惡意代碼檢測方法,使用常見機器學(xué)習(xí)、深度學(xué)習(xí)技術(shù)對實驗數(shù)據(jù)進行了多輪訓(xùn)練來觀察評估指標的效果,以此驗證FC-PSDS 方法的整體分類效果優(yōu)于當前其他的方法。
4.4.1 特征組合效果分析
本文首先評估了基于隨機森林的特征組合對于算法檢測準確率的提升效果。本文實驗中首先進行了原始特征數(shù)據(jù)在不經(jīng)隨機森林做特征提取時,直接使用樸素貝葉斯中的高斯樸素貝葉斯(Gaussian Naive Bayes,GNB)和深度學(xué)習(xí)中DNN的分類效果實驗,與使用隨機森林做特征組合后傳入相同的GNB和DNN 模型的分類效果進行對比。
經(jīng)實驗表明,隨機森林的特征組合對于FCPSDS 方法檢測效果的影響如圖6 和表4 所示,圖表中的ACC、TPR、FPR、PRE 分別代表4.3 評估指標中的準確率、召回率、假陽率、精確率,由于假陽率的值相比其他的值過小,在圖6 中僅顯示ACC、TPR、PRE,圖表中的RF 代表經(jīng)過隨機森林特征組合。實驗結(jié)果顯示,基于隨機森林的特征組合方法對于模型檢測的效果有正向影響。與未使用隨機森林做特征組合的對照實驗的結(jié)果數(shù)據(jù)說明,本文利用特征組合方法獲得的新特征組合相比原始特征可以更好的還原對原始數(shù)據(jù)的表達。原因在于,在原始數(shù)據(jù)集上使用簡單機器學(xué)習(xí)算法難以捕捉到原始數(shù)據(jù)的有效信息,同時淺層的機器學(xué)習(xí)算法在數(shù)據(jù)規(guī)模和復(fù)雜度較大時,對數(shù)據(jù)的學(xué)習(xí)能力有限。因此,通過隨機森林特征組合自動從原始數(shù)據(jù)中發(fā)現(xiàn)有效的特征組合,可以彌補原始數(shù)據(jù)的人工提取特征經(jīng)驗不足問題,同時隨機森林的多棵樹相比單決策樹的表達能力更強,可以更好地生成表征原始數(shù)據(jù)的特征組合,再通過分類算法進行學(xué)習(xí)和分類,相較未經(jīng)處理直接使用分類網(wǎng)絡(luò)的方式可以更好地擬合原始數(shù)據(jù)并學(xué)習(xí)其內(nèi)在規(guī)律。
表4 特征組合對于分類的效果影響Table 4 Effect of feature combination on classification
4.4.2 FC-PSDS 檢測效果分析
在訓(xùn)練輪次效果分析上,深度學(xué)習(xí)模型訓(xùn)練時,一個輪次(epoch)意味著將訓(xùn)練數(shù)據(jù)集完整訓(xùn)練一次,模型分類效果受訓(xùn)練輪次的次數(shù)影響,FC-PSDS 的深度學(xué)習(xí)模型檢測效果隨訓(xùn)練輪次的增加效果如圖所示。由圖7 所示結(jié)果可知,FC-PSDS 的分類準確率隨訓(xùn)練的過程逐漸升高,并穩(wěn)定在99%。
在對比實驗效果上,本文選取了Rubin 研究方法[20]中提出的CNN-LSTM 模型、Danny 研究方法[19]中的CNN 模型以及決策樹、樸素貝葉斯等常見機器學(xué)習(xí)算法和DNN 神經(jīng)網(wǎng)絡(luò)與FC-PSDS 在同一數(shù)據(jù)上進行二分類檢測效果的對比比較。圖8 和表5 顯示了不同模型在相同訓(xùn)練環(huán)境下測試得到的ACC、FPR、TPR 指標。
可以看出,FC-PSDS 方法的ACC、FPR、TPR、PRE 分別達到了0.9934,0.0136,0.9996,0.9976。這說明本文所用到的批量規(guī)范化深度神經(jīng)網(wǎng)絡(luò)的方法比傳統(tǒng)機器學(xué)習(xí)、深度學(xué)習(xí)技術(shù)可以取得更好的檢測準確率和更低的假陽率,明顯優(yōu)于一般方法。效果更優(yōu)的原因在于,在本文的實驗結(jié)果中,由于深度神經(jīng)網(wǎng)絡(luò)可以更有效的擬合復(fù)雜的原始數(shù)據(jù),因此相比Decision Tree、LogisticRegression、LinearSVC 等機器學(xué)習(xí)方法,深度學(xué)習(xí)模型的檢測效果更佳。相比Rubin 等人提出的CNN-LSTM 模型和Danny 等人提出的CNN 模型,本文提出的FC-PSDS 通過隨機森林集成組合的方式,生成了更好表征原始數(shù)據(jù)的特征組合,能夠使后續(xù)的深度神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)到更好擬合原始數(shù)據(jù)的信息,從而檢測效果更佳,模型效果也可以達到實際使用要求
表5 FC-PSDS 與不同檢測方法的效果對比Table 5 Comparison of FC-PSDS with different detection methods
4.4.3 系統(tǒng)時間性能分析
圖9 展示了本文所采用的FC-PSDS 方法與Rubin 研究方法[20]中提出的CNN-LSTM 模型、Danny研究方法[19]中的CNN 模型和決策樹、隨機森林算法構(gòu)建的Powershell檢測模型,在同一實驗環(huán)境訓(xùn)練時的時間性能對比,圖中DT 和RF 分別代表決策樹和隨機森林模型。從圖中可以看出,FC-PSDS 在時間成本上,由于采用多模型連接的結(jié)構(gòu),導(dǎo)致模型訓(xùn)練時間高于一般機器學(xué)習(xí)模型,但相比兩種已有方法的時間性能損耗更小。實驗表明,FC-PSDS 模型相對已有方法,在提高召回和降低誤報的同時,可以降低模型訓(xùn)練的時間。
4.4.4 案例分析
為了評估FC-PSDS 的實際效果,本文以常見于APT 攻擊中的Powershell 利用代碼為例,測試其在實際使用過程中的效果。圖 10 所示為該段Powershell 代碼的利用流程。該Powershell 攻擊代碼利用Powershell 框架Empire 下載遠程服務(wù)器中的利用腳本,使用XOR 秘鑰解密,在獲取待滲透系統(tǒng)的詳細信息后提交到遠程命令服務(wù)器,下載對應(yīng)的利用載荷。
對于該段Powershell 攻擊代碼的未經(jīng)特征組合的數(shù)據(jù),本文在上述實驗中對比使用的 GNB、DNN、CNN[19]等均無法檢測到該段代碼的惡意性。在原始數(shù)據(jù)經(jīng)FC-PSDS 特征組合后,將數(shù)據(jù)傳入FC-PSDS 的DNN 網(wǎng)絡(luò)中則可以檢測到該樣本的惡意性。FC-PSDS 的效果優(yōu)越性原因在于其基于隨機森林特征組合的過程,使用非線性的計算重表示了原始數(shù)據(jù),相比僅提取1657 維特征后直接傳入判別網(wǎng)絡(luò),FC-PSDS 的判別網(wǎng)絡(luò)DNN 可以比單一判別器獲得更好表征原始樣本的數(shù)據(jù),從而實現(xiàn)更好的檢測效果。
本文提出的FC-PSDS 方法相比傳統(tǒng)的基于機器學(xué)習(xí)的惡意代碼檢測方法可以更好的表征原始數(shù)據(jù)和學(xué)習(xí)原有數(shù)據(jù)特征,FC-PSDS 的復(fù)雜性主要體現(xiàn)在:對于原始特征組合需經(jīng)過隨機森林算法訓(xùn)練得到新特征,該過程相比將特征直接輸入機器學(xué)習(xí)算法需額外進行模型訓(xùn)練。
FC-PSDS 雖然在檢測的準確率、召回率、誤報率擁有較好的表現(xiàn),但由于雙層模型連接以及特征組合的額外訓(xùn)練導(dǎo)致整體復(fù)雜性增加,從而實際運行過程耗時較長。FC-PSDS 的時間消耗主要體現(xiàn)在新特征組合的生成上,當輸入數(shù)據(jù)維度更高后,生成新特征組合的時間也會相應(yīng)增加。特征組合計算和模型訓(xùn)練所需的時間受實驗硬件環(huán)境影響,使用GPU 等高性能硬件計算會顯著減少計算時間??紤]到特征組合和深度學(xué)習(xí)模型的計算時間成本,文本提出的FC-PSDS 方法更適合離線場景。
除本文討論方法外,本文使用的特征提取方法和特征組合所用的集成學(xué)習(xí)方法可以使用其他深度學(xué)習(xí)算法嘗試,或可對不同特征進行特征融合,從而實現(xiàn)對不同Powershell代碼的泛化能力。除此之外,對于更多混淆方式的Powershell 代碼的有效特征提取和表示也是接下來的工作重點。
由于網(wǎng)絡(luò)攻擊的多樣性發(fā)展,以Powershell 惡意代碼攻擊為代表的無文件惡意代碼攻擊因其隱蔽性的特點層出不窮,本文針對在Powershell 惡意代碼檢測過程中存在的特征提取困難、檢測泛化和效果差問題展開討論,提出了一種基于隨機森林特征組合和深度神經(jīng)網(wǎng)絡(luò)檢測識別的Powershell 惡意代碼檢測方法FC-PSDS。該方法使用隨機森林和批量規(guī)范化的神經(jīng)網(wǎng)絡(luò)的組合方法,先通過隨機森林對原始Powershell 代碼生成更有效的特征組合,隨后利用批量規(guī)范化的深度神經(jīng)網(wǎng)絡(luò)對特征組合進行訓(xùn)練和學(xué)習(xí)。
通過隨機森林特征組合的方式,FC-PSDS 無需參與不同特征的選取,實驗證明,基于FC-PSDS 方法的Powershell惡意代碼檢測系統(tǒng)性能良好,相比當前僅使用機器學(xué)習(xí)或簡單神經(jīng)網(wǎng)絡(luò)的方法,FC-PSDS的準確率更高、假陽率更低,可以滿足使用需求。
致 謝感謝中國科學(xué)院網(wǎng)絡(luò)測評技術(shù)重點實驗室、網(wǎng)絡(luò)安全防護技術(shù)北京市重點實驗室的各位老師和同學(xué)在實驗過程中的幫助和支持,感謝審稿專家和編輯老師的指導(dǎo)建議。