黎星宇
(四川大學(xué)計(jì)算機(jī)學(xué)院,成都 610065)
隨著互聯(lián)網(wǎng)的普及與發(fā)展,越來(lái)越復(fù)雜的惡意軟件造成了絕大多數(shù)的互聯(lián)網(wǎng)安全問(wèn)題,惡意軟件的開(kāi)發(fā)人員通過(guò)改寫(xiě)手中的惡意核心代碼或使用工具可以相當(dāng)輕易地制作出大量的惡意軟件,這些源代碼的中間傳播站便是地下黑客網(wǎng)絡(luò)社區(qū)[1]。安全研究人員可以通過(guò)探索這些社區(qū)來(lái)發(fā)現(xiàn)新的安全威脅、趨勢(shì)和黑客行為,目前主流研究方向包括內(nèi)容分析、社交網(wǎng)絡(luò)分析和惡意軟件分析等。相關(guān)研究人員探索了多個(gè)地緣政治區(qū)域的黑客社區(qū),觀察到黑客共享各種網(wǎng)絡(luò)社區(qū)的惡意源代碼資源,并且互相傳播合作,各種惡意程序和腳本的源代碼在黑客之間自由分發(fā)[2]。然而,源代碼經(jīng)常伴隨著不完整的說(shuō)明文檔甚至沒(méi)有相關(guān)文檔和代碼注釋。對(duì)于跨越多個(gè)不同區(qū)域的社區(qū)研究人員會(huì)遇到使用不熟悉的編程語(yǔ)言編寫(xiě)的惡意腳本,或者由于源代碼本身過(guò)于模糊,無(wú)法解譯,代碼中常常存在復(fù)雜的代碼邏輯與不停轉(zhuǎn)換的變量名,這對(duì)惡意源代碼的研究和分析上造成了很大的限制。
針對(duì)這一問(wèn)題本文設(shè)計(jì)了一種基于TextCNN 的自動(dòng)化惡意源代碼功能分類模型,受到自然語(yǔ)言處理領(lǐng)域的啟發(fā),將惡意源代碼文件轉(zhuǎn)換為普通文本文檔,把代碼詞視為文本詞,通過(guò)Word2Vec 轉(zhuǎn)換為詞向量,將一句代碼視為一串詞向量序列,該序列能有效地保留詞特征,詞時(shí)序特征以及詞語(yǔ)義關(guān)系,再利用TextCNN建立惡意源代碼分類模型,TextCNN 能高效保留文檔的局部特征,通過(guò)卷積操作可以實(shí)現(xiàn)N-Gram 的單詞組合,自學(xué)習(xí)其中的特征含義并篩選出代表特征詞,從抽象的代碼詞中抽取出不同層次的語(yǔ)義信息。經(jīng)過(guò)實(shí)驗(yàn)認(rèn)證,本文設(shè)計(jì)的分類模型在惡意源代碼樣本數(shù)據(jù)集上結(jié)果表明,相較于傳統(tǒng)機(jī)器學(xué)習(xí)分類方法,本分類模型在分類精確度上有明顯的提升。
過(guò)去的研究發(fā)現(xiàn),黑客經(jīng)常聚集在虛擬社區(qū)中,即IRC 社區(qū)和在線論壇,黑客通過(guò)平臺(tái)與同行公開(kāi)分享惡意軟件源碼和框架,那么這些被分享出來(lái)的公用惡意資源將成為安全研究的主流對(duì)象[2]。
惡意軟件分析包括兩種傳統(tǒng)分析方法:靜態(tài)分析和動(dòng)態(tài)分析。靜態(tài)分析包括分析源代碼或其他形式的程序指令,這種分析方法不會(huì)實(shí)際執(zhí)行程序,動(dòng)態(tài)分析則相反,需要運(yùn)行程序分析其動(dòng)態(tài)行為,這兩種分析形式相輔相成[3]。近年來(lái)越來(lái)越多的研究人員將神經(jīng)網(wǎng)絡(luò)應(yīng)用到惡意軟件二進(jìn)制文件的匯編指令和API 調(diào)用序列的研究上,SAXE 等人[4]在2015 年將惡意軟件二進(jìn)制樣本直接輸入神經(jīng)網(wǎng)絡(luò)中訓(xùn)練分類器,PASCANU 等人[5]在同年將惡意代碼動(dòng)態(tài)執(zhí)行指令的API 視為特征,利用循環(huán)神經(jīng)網(wǎng)絡(luò)進(jìn)行分類,F(xiàn)AN[6]在2016 年抽取出指令序列,對(duì)其進(jìn)行模式匹配,再用神經(jīng)網(wǎng)絡(luò)完成分類。隨著NLP 方向的研究與發(fā)展,一些應(yīng)用在自然語(yǔ)言處理上的深度學(xué)習(xí)方法也被使用到惡意代碼的研究上,2017 年P(guān)OPOV 等人[7]將惡意軟件的匯編指令視為文檔的詞,指令序列視為文檔的句子,利用Word2Vec將不同的匯編指令計(jì)算出對(duì)應(yīng)的詞向量,再使用機(jī)器學(xué)習(xí)的方法進(jìn)行分類,2018 年CAKIR 等人[8]在文獻(xiàn)[7]的基礎(chǔ)上使用GBM 方法構(gòu)造分類器,2019 年張濤等人[9]基于Doc2Vec 文字嵌入方法將惡意軟件的動(dòng)態(tài)API 序列視為特征,對(duì)惡意軟件進(jìn)行家族分類,同年喬延臣等人[10]將匯編指令排序后得到的序列結(jié)合卷積神經(jīng)網(wǎng)絡(luò)對(duì)惡意代碼進(jìn)行分類,2020 年劉恒訊等人[11]則使用API 函數(shù)調(diào)用序列詞向量化來(lái)對(duì)惡意軟件家族進(jìn)行更細(xì)粒度的文本分類。
當(dāng)前惡意代碼分類的主要研究動(dòng)向大多集中在二進(jìn)制文件上,研究方向大致為檢測(cè)是否為惡意文件與惡意軟件家族分類。由于缺乏分析惡意源代碼文件的工具,跨越多種編程語(yǔ)言的源代碼沒(méi)有對(duì)應(yīng)的說(shuō)明文檔和解釋代碼,過(guò)于晦澀,缺乏可閱讀性,導(dǎo)致這類數(shù)據(jù)通常比惡意軟件二進(jìn)制文件更難檢索和分析,通過(guò)研究已經(jīng)確定了惡意源代碼現(xiàn)在可以在黑客社區(qū)中找到,在2013 年,BENJAMIN[3]利用惡意源代碼的上下文,使用支持向量機(jī)和C4.5 決策樹(shù)者兩種算法和遺傳算法配對(duì)的包裝器模型選定惡意源代碼特征,發(fā)現(xiàn)執(zhí)行不同功能的惡意源代碼中出現(xiàn)了不同的具有特征性的代碼單詞,最后利用機(jī)器學(xué)習(xí)分類器來(lái)識(shí)別惡意源代碼的功能攻擊類型,因此認(rèn)為針對(duì)大量惡意軟件源代碼進(jìn)行研究是可行的。
在自然語(yǔ)言處理領(lǐng)域,詞語(yǔ)是最常見(jiàn)的文檔切分力粒度,研究人員在做文本聚類或者分類的時(shí)候,經(jīng)常需要考慮如何表示一個(gè)詞語(yǔ)。最早被提出的方法是one-hot 編碼方法,利用一個(gè)離散的取值空間,使用一個(gè)長(zhǎng)度為詞匯表大小的向量來(lái)表示一個(gè)本文,將文本表示成了一個(gè)長(zhǎng)度為詞匯表大小的向量,接下來(lái)就可以進(jìn)行聚類或者分類了。但是獨(dú)熱編碼經(jīng)常會(huì)面對(duì)巨大的詞匯表,需要高達(dá)上百萬(wàn)長(zhǎng)度的向量,此時(shí)需要做細(xì)致的特征工程,把維度降下來(lái),而特征約簡(jiǎn)導(dǎo)致的信息損失會(huì)影響文本分類的效果。獨(dú)熱編碼的另一個(gè)重要缺陷,就是忽略了詞語(yǔ)在文本中的順序。自然語(yǔ)言文本實(shí)際上是一種序列數(shù)據(jù),相鄰的文字或者詞語(yǔ)之間有著密切的關(guān)聯(lián)。獨(dú)熱編碼的假設(shè)過(guò)于粗暴,將這種關(guān)聯(lián)省略了,導(dǎo)致了信息的丟失。2013 年,Mikolov[12]認(rèn)為利用詞的分布式表達(dá)方式,詞向量可以包含此含義,并且計(jì)算不同詞向量之間的關(guān)系形成低維且稠密的詞表達(dá)方式,這種方法經(jīng)常用在文本分類或情感分析等應(yīng)用場(chǎng)景中。
在本文中,正是使用了這種符合直覺(jué)的詞語(yǔ)表示方法來(lái)有提取惡意代碼的特征表達(dá),即Word2Vec[13]。Word2Vec 是Google 公司在2013 年開(kāi)放的用于訓(xùn)練詞向量的軟件工具,不需要額外訓(xùn)練,屬于無(wú)監(jiān)督方法,給定語(yǔ)料數(shù)據(jù)集后,自學(xué)習(xí)地將詞信息映射到語(yǔ)義空間中,最終得到一個(gè)詞向量模型,每個(gè)指定維度的數(shù)組對(duì)應(yīng)一個(gè)單詞。Word2Vec 將一個(gè)詞的上下文(前面k個(gè)詞和后面k 個(gè)詞)詞編碼輸入神經(jīng)網(wǎng)絡(luò),輸出這個(gè)詞的編號(hào),他是一個(gè)高效率進(jìn)行詞嵌套學(xué)習(xí)的預(yù)測(cè)模型。Word2Vec 常用兩種模型,一種為Skip-Gram 模型,這種模型利用中心詞預(yù)測(cè)周圍詞,對(duì)出現(xiàn)頻率較低的詞預(yù)測(cè)效果更好,另一種是連續(xù)詞袋模型(CBOW),與前者相反,CBOW 利用周圍詞預(yù)測(cè)中心詞,通過(guò)計(jì)算上下文詞向量輸出中心詞的詞向量,訓(xùn)練時(shí)間要更少。在本實(shí)驗(yàn)中,惡意源代碼樣本數(shù)據(jù)集還是偏小且代碼詞也更為離散和生僻,因此使用Skip-Gram 方法來(lái)訓(xùn)練本文的詞向量,保證代碼詞更高的準(zhǔn)確度。因此綜合實(shí)驗(yàn)表現(xiàn),本文使用Skip-Gram 方法將惡意源代碼轉(zhuǎn)化為詞向量,設(shè)置向量維度為300 維,利用詞向量包含語(yǔ)義特征的特性,能有效地表示出源代碼之間的詞義關(guān)系,可以對(duì)惡意代碼行為作出更好的描述。最后經(jīng)過(guò)Skip-Gram 模型訓(xùn)練得出部分代碼詞的詞向量如表1 所示。
表1 部分惡意代碼詞的詞向量表達(dá)
在2014 年,KIM[15]針對(duì)CNN 的輸入層做了一些變形,提出了文本卷積神經(jīng)網(wǎng)絡(luò)TextCNN。與傳統(tǒng)圖像的CNN 網(wǎng)絡(luò)相比,TextCNN 在網(wǎng)絡(luò)結(jié)構(gòu)上沒(méi)有任何變化,將文本視為圖片矩陣,文本的單詞作為矩陣的行,文本長(zhǎng)度決定矩陣的行數(shù),參考N-Gram 滑動(dòng)窗口的思想,利用多個(gè)不同大小的卷積核對(duì)若干個(gè)單詞組成進(jìn)行卷積,從而提取出句子中的關(guān)鍵信息,這樣文本詞語(yǔ)的局部相關(guān)性能被更好地捕捉。
本文通過(guò)修改KIM 提出的網(wǎng)絡(luò)參數(shù)與結(jié)構(gòu),設(shè)計(jì)適合訓(xùn)練惡意詞向量的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)。如圖1 所示網(wǎng)絡(luò)一共有四層,包含輸入層、卷積層、最大池化層以及輸出層。
圖1 TextCNN網(wǎng)絡(luò)結(jié)構(gòu)圖
(1)輸入層:
學(xué)校員工的工作地位與其在學(xué)校的分工有關(guān)。機(jī)能實(shí)驗(yàn)技術(shù)人員的地位較低,具體表現(xiàn)為缺乏參加培訓(xùn)、進(jìn)修的機(jī)會(huì),職業(yè)發(fā)展不明朗;較少有為學(xué)校政策出謀劃策的機(jī)會(huì),自身訴求得不到傾聽(tīng);工作待遇較低;工作不受教師和學(xué)生的理解。
輸入層是一個(gè)由詞向量拼成的詞矩陣,規(guī)模為1000×300,每一個(gè)行向量表示一個(gè)代碼詞的詞向量,具有300 維;一篇惡意代碼由多個(gè)代碼詞拼接而成,如圖2 所示樣本中文本長(zhǎng)度在1000 左右的占比為90%左右,因此本實(shí)驗(yàn)中文本長(zhǎng)度設(shè)定為1000。輸入層有兩個(gè)這樣的輸入矩陣,即雙通道形式,其中一個(gè)用預(yù)訓(xùn)練好的詞嵌入表達(dá),并且在訓(xùn)練過(guò)程中不再發(fā)生變化;另外一個(gè)也由同樣的方式初始化,但是會(huì)作為參數(shù),隨著網(wǎng)絡(luò)的訓(xùn)練過(guò)程發(fā)生改變。令xi為第i個(gè)代碼詞,n為惡意代碼文本長(zhǎng)度,則一篇惡意源代碼文件x1:n可以形式化表示為如下形式:
圖2 樣本集單文本長(zhǎng)度占比圖
(2)卷積層:
一共有三種規(guī)格卷積核,大小分別為3、4、5,每種規(guī)格包含100 個(gè)參數(shù)互不相同的卷積核。該層的卷積核的寬度k 和輸入層詞矩陣的寬相同,該寬度即為詞向量大小,卷積核只會(huì)在高度方向移動(dòng),移動(dòng)范圍也就是卷積核的大小h。每次卷積范圍的位置都是完整的單詞,因?yàn)樾胁粫?huì)被卷積分割,這樣不會(huì)將幾個(gè)單詞的一部分進(jìn)行卷積,這保證了代碼詞作為語(yǔ)言中最小粒度的合理性。使用卷積核ω∈Rhk與一個(gè)窗口xi:i+h-1進(jìn)行卷積操作,產(chǎn)生一個(gè)特征ci,計(jì)算方法如下公式:
其中xi:i+h-1代表輸入詞矩陣的第i行到第i+h-1行所組成的大小為k×h的窗口,W表示權(quán)重矩陣,大小也為k×h,b為偏置參數(shù),f為非線性函數(shù),本文使用ReLU 函數(shù)。卷積核掃描整個(gè)詞矩陣,每一次卷積操作相當(dāng)于一次提取該窗口的特征向量,卷積核內(nèi)不同的參數(shù)定義了不同的窗口,保證提取出互不相同且高密度的特征向量,惡意代碼文本長(zhǎng)度為n,而卷積核的高度為h,所以總共滑窗n-h+1 次拼接成特征圖,構(gòu)成卷積層的輸出c。
(3)池化層:
池化層提取出每張?zhí)卣鲌DTop-K 的值作為保留,并保留特征值的原始順序,主要目的是降低特征圖的維度,池化過(guò)程的公式如下:
卷積層的每個(gè)卷積核能生成2 張?zhí)卣鲌D,一共生成3×2×100 個(gè)特征圖,經(jīng)池化操作,得到一個(gè)長(zhǎng)度為規(guī)格為1×600 的向量,池化層的輸出z可表示為:
(4)輸出層:
輸出為維度為4 向量,向量的每一維度對(duì)應(yīng)著一個(gè)類別,該維度的數(shù)據(jù)表示預(yù)測(cè)該樣本屬于對(duì)應(yīng)功能類型的概率,池化層的向量z輸入到全連接層中,并使用Softmax 激活函數(shù)輸出每種惡意代碼類型的概率,以最大概率的標(biāo)簽作為預(yù)測(cè)結(jié)果。具體計(jì)算機(jī)公式如下:
本文所使用的惡意源代碼文件來(lái)自Exploit Data?base 官方GIT 倉(cāng)庫(kù)。Exploit Database 存儲(chǔ)了大量的惡意軟件程序和源代碼,可以幫助安全研究者和滲透測(cè)試工程師更好地進(jìn)行安全測(cè)試工作。Exploit Database將收集來(lái)的惡意源代碼分為四種功能,分別是本地內(nèi)存攻擊,遠(yuǎn)程代碼執(zhí)行攻擊,網(wǎng)絡(luò)應(yīng)用程序攻擊和拒絕服務(wù)攻擊。以下給出四種功能類型的說(shuō)明:
本地內(nèi)存攻擊(Local Memory Attacks):利用軟件安全漏洞,構(gòu)造惡意輸入導(dǎo)致軟件在處理輸入數(shù)據(jù)時(shí)出現(xiàn)非預(yù)期錯(cuò)誤,將輸入數(shù)據(jù)寫(xiě)入內(nèi)存中的某些特定敏感位置,從而劫持軟件控制流,轉(zhuǎn)而執(zhí)行外部輸入的指令代碼,造成目標(biāo)系統(tǒng)被獲取遠(yuǎn)程控制或拒絕服務(wù)。
遠(yuǎn)程代碼執(zhí)行攻擊(Remote code Execution Attacks):用戶通過(guò)瀏覽器提交執(zhí)行命令,由于服務(wù)器端沒(méi)有針對(duì)執(zhí)行函數(shù)做過(guò)濾,導(dǎo)致在沒(méi)有指定絕對(duì)路徑的情況下就執(zhí)行命令,可能會(huì)允許攻擊者通過(guò)改變PATH 或程序執(zhí)行環(huán)境的其他方面來(lái)執(zhí)行一個(gè)惡意構(gòu)造的代碼??梢宰尮粽咧苯酉蚝笈_(tái)服務(wù)器遠(yuǎn)程注入操作系統(tǒng)命令或者代碼,從而控制后臺(tái)系統(tǒng)。
網(wǎng)絡(luò)應(yīng)用程序攻擊(Web Application Exploits):包括SQL 注入,跨站點(diǎn)腳本,操作系統(tǒng)命令注入,會(huì)話劫持等方式攻擊或竊取服務(wù)器數(shù)據(jù)。
拒絕服務(wù)攻擊(Denial of Service):針對(duì)服務(wù)器漏洞,使用特殊手段消耗服務(wù)器資源,從而達(dá)到服務(wù)器無(wú)法正常為其他客戶端提供正常服務(wù)的目的。一般迫使服務(wù)器的緩沖區(qū)域溢出或者使用IP 欺騙等方法。
本文選擇以Python 語(yǔ)言所寫(xiě)的惡意源代碼為研究對(duì)象,使用爬蟲(chóng)方法收集數(shù)據(jù)后,剔除重復(fù)的源代碼文件和執(zhí)行程序文件,共計(jì)5487 個(gè)文件,為了保證四種功能分類的樣本均衡,最后篩選各類別樣本數(shù)量為1200 個(gè)左右,共計(jì)4887 個(gè)樣本文件,具體分類數(shù)量如圖3 所示。通過(guò)梳理四大分類的源代碼,將源代碼轉(zhuǎn)化為txt類型文檔,利用傳統(tǒng)文本分類方式將空格符號(hào)識(shí)別為分隔符,將代碼詞各自獨(dú)立,統(tǒng)計(jì)出Python 編程語(yǔ)言的關(guān)鍵字,和高頻出現(xiàn)的無(wú)效字使其作為停用詞,其中針對(duì)惡意源代碼中穿插的二進(jìn)制類型字節(jié)編碼(即0x56、x0A、0x24 等,其中0x 代表數(shù)字,x 代表字符,如圖4),有針對(duì)性地發(fā)現(xiàn)這類型的編碼在不同類型的源代碼中出現(xiàn)次數(shù)也各有不同,因此使用統(tǒng)一代碼抽離,化為單詞“shellcode”,最后對(duì)各類源代碼建立起不同的詞袋模型。利用Word2Vec 的CBOW 模型將詞袋訓(xùn)練為詞向量模型,輸入TextCNN 進(jìn)行訓(xùn)練。對(duì)于待檢測(cè)的源代碼樣本直接將該樣本預(yù)處理后利用詞向量模型生成矩陣輸入訓(xùn)練好的TextCNN 模型中,輸出長(zhǎng)度為4 形式的向量,每個(gè)元素代表每種分類的概率,以最大概率作為結(jié)果判定輸出。
圖3 樣本集中分類數(shù)量分布
圖4 原始樣本中頻繁出現(xiàn)的字節(jié)編碼
在本文中我們采用交叉熵?fù)p失函數(shù),將最小化損失函數(shù)作為訓(xùn)練目標(biāo),計(jì)每個(gè)分類下的惡意文檔樣本數(shù)量為n,pi表示樣本的實(shí)際分類概率,pi=1 代表該文檔屬于類別i,否則pi=0,qi則表示模型的輸出,即預(yù)測(cè)為功能i的概率交叉熵?fù)p失函數(shù)定義如下:
本惡意代碼分類實(shí)驗(yàn)采用以下4 個(gè)指標(biāo)作為評(píng)估標(biāo)準(zhǔn):
(1)準(zhǔn)確率(Accuracy):被模型正確分類的樣本數(shù)占樣本總數(shù)百分值的平均值;
(2)精確率(Precision):中,真正屬于該分類的樣本占所有被分類為某類型的樣本百分值的平均值;
(3)召回率(Recall):被模型檢測(cè)出來(lái)且分類正確被占所有待檢測(cè)總樣本的百分值的平均值;
(4)F1_score:準(zhǔn)確率與精確率的調(diào)和平均數(shù),使得兩種指標(biāo)得到綜合平衡。
本實(shí)驗(yàn)使用十折交叉驗(yàn)證法進(jìn)行性能評(píng)估,這是一種經(jīng)典可靠的模型性能評(píng)估方法,輪流將樣本集平均劃分為十份,選取兩份分別作為模型驗(yàn)證集和模型測(cè)試集,剩下八份作為模型訓(xùn)練集,本實(shí)驗(yàn)具體數(shù)量分布則是隨機(jī)抽取訓(xùn)練樣本集3900 個(gè)(80%)左右、驗(yàn)證樣本集490 個(gè)左右(10%)以及測(cè)試樣本集510 個(gè)(10%)左右。實(shí)驗(yàn)10 次后將10 次結(jié)果計(jì)算平均值作為最后的評(píng)估成果,多次進(jìn)行十折交叉驗(yàn)證可以有效提高實(shí)驗(yàn)結(jié)果的準(zhǔn)確性,消除隨機(jī)性。實(shí)驗(yàn)結(jié)果如表2所示。
表2 十折交叉驗(yàn)證實(shí)驗(yàn)結(jié)果
使用傳統(tǒng)機(jī)器學(xué)習(xí)方法,在面對(duì)離散化文本文檔提取有效特征的能力是非常有限的,特別是本文的實(shí)驗(yàn)樣本是更為抽象的代碼語(yǔ)言,與傳統(tǒng)的語(yǔ)言文本相比,可閱讀性更差,本文做了直接將文檔樣本作為學(xué)習(xí)樣本的預(yù)前實(shí)驗(yàn),分類精度一般在70%左右,因此在建立機(jī)器學(xué)習(xí)分類器之前需要使用一些特征工程篩選出更具代表性的特征詞庫(kù),利用詞庫(kù)將代碼文檔映射為矩陣再使用機(jī)器學(xué)習(xí)方法建立分類器,實(shí)驗(yàn)流程如圖5所示。
圖5 對(duì)比實(shí)驗(yàn)流程圖
利用上文收集的數(shù)據(jù)集,對(duì)其遍歷后篩選出使用詞頻、互信息、卡方校驗(yàn)這三種常用的特征詞方法所抽取的每個(gè)分類的前300 個(gè)特征詞,三者取并集,將該集合作為特征詞庫(kù)。通過(guò)這一步的工作,本文的發(fā)現(xiàn)與動(dòng)態(tài)分析研究一致,重點(diǎn)是為了觀察不同類型的惡意代碼行為與特征代碼詞的關(guān)系。特征詞集平均為給定語(yǔ)言可用的所有詞量的30%左右,這將有助于研究人員更快地對(duì)惡意源代碼進(jìn)行分析,并且需要更少的硬件作為支撐執(zhí)行分析。除此之外本文發(fā)現(xiàn)對(duì)優(yōu)化特征詞集的手動(dòng)檢查表明,導(dǎo)入編程庫(kù)和方法調(diào)用可能是最有用的分類表征,如表3 所示,Python 遠(yuǎn)程代碼執(zhí)行攻擊可能會(huì)為互聯(lián)網(wǎng)功能導(dǎo)入套接字庫(kù)(“socket”),而本地內(nèi)存攻擊則缺乏這種行為。字節(jié)碼編碼(即0x45、0x32、0x21 等代換而來(lái)的“shellcode”)也代表了這種特性,經(jīng)常用于基于內(nèi)存的攻擊。而在Web 應(yīng)用程序攻擊這類型源代碼中,頻繁使用了解析URL 的編程庫(kù)和登錄方法調(diào)用,這些分析結(jié)果都是與代碼實(shí)現(xiàn)的實(shí)際功能相匹配的。
表3 特征工程篩選出的部分特征詞
利用機(jī)器學(xué)習(xí)方法進(jìn)行功能分類。本實(shí)驗(yàn)中選用了SVM(支持向量機(jī))、C4.5 決策樹(shù)、MLP(多層感知機(jī))三種分類器。將以上三種分類模型與本文提出的TextCNN 模型進(jìn)行橫向比較,實(shí)驗(yàn)的評(píng)估指標(biāo)結(jié)果對(duì)比如表4。
表4 橫向?qū)嶒?yàn)評(píng)估對(duì)比
如表4 展示,根據(jù)實(shí)驗(yàn)結(jié)果可知,SVM、C4.5 決策樹(shù)以及MLP 這三種傳統(tǒng)的機(jī)器學(xué)習(xí)分類方法的精確度均在90%以下,這說(shuō)明傳統(tǒng)的機(jī)器學(xué)習(xí)方法在面對(duì)離散化的代碼文本中無(wú)法有效找出暗含的特征,即使加入特征工程分類效果依然不夠好,此外特征工程還需要使用人工加工,而這需要研究者對(duì)代碼數(shù)據(jù)有很強(qiáng)的敏感度,和有相當(dāng)程度的源代碼閱讀能力的背景知識(shí)。而本文提出的基于詞向量的惡意代碼分類模型在各指標(biāo)上均有明顯提高;證明了加入惡意代碼詞向量語(yǔ)義特征,能更好地表述惡意源代碼。與BENJA?MIN[3]的分類實(shí)驗(yàn)相比,本文使用的數(shù)據(jù)集大小更具備規(guī)模,在分類精度上有明顯提升。相對(duì)其他機(jī)器學(xué)習(xí)而言,文本神經(jīng)網(wǎng)絡(luò)降低了對(duì)抽取源代碼詞特征工程能力的要求,無(wú)需額外的特征加工工作,同時(shí)利用文本神經(jīng)網(wǎng)絡(luò)抓取離散文本語(yǔ)義特性和代碼詞時(shí)序之間的關(guān)聯(lián)性,才使得惡意源代碼分類的準(zhǔn)確率有了提升。
本文的主要研究工作集中在如何利用惡意源代碼樣本訓(xùn)練文本神經(jīng)網(wǎng)絡(luò)建立對(duì)惡意源代碼屬于哪種攻擊類型的分類器,并且相比傳統(tǒng)的文本分類的機(jī)器學(xué)習(xí)方法引入詞向量能更好地抽析出惡意源代碼在某些代碼詞的高特征性,設(shè)計(jì)了基于TextCNN 對(duì)惡意源代碼的詞頻、詞序列、詞向量進(jìn)行分類的神經(jīng)網(wǎng)絡(luò)。本文的模型在Exploit Database 收集的惡意源代碼樣本集上的交叉驗(yàn)證效果表明了該方法相較于傳統(tǒng)的機(jī)器學(xué)習(xí)方法或者特征分類方法的準(zhǔn)確率有更有優(yōu)勢(shì)。
基于以上所述,利用TextCNN 建立惡意源代碼功能分類模型,將源代碼映射為文本文檔,把代碼分類轉(zhuǎn)化為文本分類,提取了包涵詞頻特征、詞序列特征、詞語(yǔ)義特征的詞向量,提高了針對(duì)晦澀難懂的源代碼分類的準(zhǔn)確性,對(duì)于處理大規(guī)?;蛘唛L(zhǎng)片段式惡意源代碼片段的分類任務(wù)提出了一種有效的解決方案。但是基于神經(jīng)網(wǎng)絡(luò)的分類方法無(wú)法對(duì)于類似for、while 循環(huán)類型的結(jié)構(gòu)化條件循環(huán)表達(dá)出明確的分類含義,除此之外,如果源代碼中包含多種類型的惡意攻擊功能,分類器只能將其中代碼量占比最大的結(jié)果作為分類結(jié)果輸出,接下來(lái)的研究方向?qū)⑹沁M(jìn)一步提高源代碼的循環(huán)結(jié)構(gòu)或條件結(jié)構(gòu)的特征提取技術(shù)或者更細(xì)粒度劃分的功能模型構(gòu)建。