周子恒 李琳 趙敘 李凱
摘要:在當(dāng)今現(xiàn)代化的世界中,人工智能逐漸被應(yīng)用在各個(gè)領(lǐng)域之中,而深度學(xué)習(xí)就是人工智能的核心算法之一,近些年來也被廣泛應(yīng)用于網(wǎng)絡(luò)安全領(lǐng)域,傳統(tǒng)簡單的通過人工定義規(guī)則集的檢測(cè)方法逐漸被淘汰掉。而現(xiàn)在,如果將深度學(xué)習(xí)方法應(yīng)用在檢測(cè)Webshell中,不僅可以很好地提高準(zhǔn)確率,而且和傳統(tǒng)的機(jī)器學(xué)習(xí)方法相比,可以自動(dòng)提取特征值,完成特征工程的過程更加智能化。因此基于深度學(xué)習(xí)來研究Webshell檢測(cè)是近些年來一個(gè)得到持續(xù)關(guān)注的熱點(diǎn)課題。該文主要針對(duì)使用PHP編寫的Webshell進(jìn)行檢測(cè),將深度學(xué)習(xí)方法和PHP文件操作碼序列的特點(diǎn)進(jìn)行結(jié)合,在構(gòu)建的模型上訓(xùn)練測(cè)試數(shù)據(jù)集,最終可以獲得相當(dāng)高的準(zhǔn)確率。
關(guān)鍵詞:Webshell;操作碼;詞向量;長短記憶網(wǎng)絡(luò);深度學(xué)習(xí)
中圖分類號(hào):TP393? ? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2021)07-0180-04
Abstract: In todays modern world,artificial intelligence is gradually applied in various fields,deep learning is one of the core algorithm of artificial intelligence. And the deep learning methods have also been gradually applied in the field of network security. Therefore, the traditional simple detection method of manually defining rule sets is gradually eliminated. And now, applying the deep learning method to the detection of Webshell can not only improve the accuracy, but also, compared with the traditional machine learning method, can automatically extract features ,therefore, complete feature engineering more intelligently. As a result, it is a very hot topic to study Webshell detection based on deep learning. Then, this paper mainly tests Webshell written in PHP, We combine the deep learning method and the characteristics of PHP file opcode sequence, then train the test data set on the built models, and can obtain a high accuracy rate.
Key words:Webshell;opcode; word embedding; LSTM;deep learning
1 緒論
1.1項(xiàng)目背景及相關(guān)研究
Webshell是一種網(wǎng)絡(luò)頁面后門程序,也被稱為木馬,是一種Web管理工具,可以對(duì)web服務(wù)器進(jìn)行操作。黑客往往利用各種漏洞上傳自己編寫的Webshell到Web服務(wù)器,從而對(duì)文件、數(shù)據(jù)庫等進(jìn)行管理。黑客可以對(duì)被植入Webshell的網(wǎng)站進(jìn)行文件的上傳和下載,調(diào)用相關(guān)系統(tǒng)命令等一系列惡意操作,更有甚者可以通過各種混淆的手段繞過WAF。Webshell極具隱蔽性,很難被發(fā)現(xiàn),并且隨著時(shí)間的推移,其種類得到了大量的擴(kuò)充。根據(jù)腳本類型可以分為PHP木馬、ASP木馬、JSP木馬和CGI木馬;按照功能則可以將其分成大馬、小馬及一句話木馬。各種Webshell的破壞性、隱藏性等都不容小覷,嚴(yán)重威脅著一個(gè)網(wǎng)站的安全,甚至在一些領(lǐng)域威脅到了國家安全。但目前大多數(shù)對(duì)于Webshell的檢測(cè)都是基于規(guī)則集的檢測(cè)方法,通過人工核定特征碼、危險(xiǎn)函數(shù)等來識(shí)別一種特定的Webshell,雖然這種方法查找起來速度較快,但是存在很高的出錯(cuò)率和遺漏率,在網(wǎng)站規(guī)模日益龐大的信息化時(shí)代,人工設(shè)定規(guī)則集的方式顯然不能滿足日益變化的Webshell種類。
近些年機(jī)器學(xué)習(xí)的興起和在各個(gè)領(lǐng)域的應(yīng)用,給Webshell的檢測(cè)工作帶來了新的思路,也有相當(dāng)多的學(xué)者、科研機(jī)構(gòu)進(jìn)行了一定的研究。例如,2016年胡必偉提出基于貝葉斯的Webshell檢測(cè)技術(shù),同時(shí)還應(yīng)用統(tǒng)計(jì)學(xué)檢測(cè)方法,計(jì)算文件信息熵,并以此為依據(jù)確定文件是正常文件還是Webshell文件。同時(shí)在賈文超等人近期進(jìn)行的研究中,采用了隨機(jī)森林算法,提高決策樹分類強(qiáng)度,降低了樹間的相關(guān)度,達(dá)到了相當(dāng)好的效果,同時(shí)根據(jù)其仿真實(shí)驗(yàn)得出的結(jié)果可以證明,該算法提高了Webshell檢測(cè)的效率和準(zhǔn)確率。在2018年,張涵等人在論文《基于多層神經(jīng)網(wǎng)絡(luò)的Webshell改進(jìn)檢測(cè)方法研究》中利用深度學(xué)習(xí)的卷積神經(jīng)網(wǎng)絡(luò)對(duì)Webshell進(jìn)行了檢測(cè),利用詞向量轉(zhuǎn)換算法word2vec將經(jīng)過預(yù)編譯處理得到的中間代碼進(jìn)行轉(zhuǎn)換,得到特征向量。最后,利用多層神經(jīng)網(wǎng)絡(luò)進(jìn)行檢測(cè)。實(shí)驗(yàn)結(jié)果證明,該方法與傳統(tǒng)的機(jī)器學(xué)習(xí)算法相比,有效提高了準(zhǔn)確率,降低了丟失率,減少了人工的操作,對(duì)未知Webshell的檢測(cè)能力也得到了有效加強(qiáng)。
1.2研究內(nèi)容
本文將主要解決深度學(xué)習(xí)在Webshell檢測(cè)中的相關(guān)應(yīng)用問題,計(jì)劃利用深度學(xué)習(xí)理論智能提取惡意代碼操作碼序列特征并對(duì)分類模型進(jìn)行相關(guān)研究。本文將PHP文件編譯成操作碼序列,利用循環(huán)神經(jīng)網(wǎng)絡(luò)(RNNs-LSTM)對(duì)Webshell檢測(cè)進(jìn)行模型搭建,其中還包含word2vec詞向量轉(zhuǎn)換、多層LSTM結(jié)構(gòu)等。最后通過實(shí)驗(yàn)數(shù)據(jù),比較出不同層次結(jié)構(gòu)模型的表現(xiàn),選擇最佳的模型。
1.3論文結(jié)構(gòu)
本文首先在第一章中對(duì)Webshell的相關(guān)概念及可能造成的威脅進(jìn)行了介紹,同時(shí)也闡明了近些年來學(xué)界所做的相關(guān)研究,并表明我們做的研究方向和期望。
第二章中將介紹本文涉及的相關(guān)技術(shù),主要包括深度學(xué)習(xí)的優(yōu)勢(shì)、PHP操作碼序列獲取,詞向量等。
第三章則是介紹本文所提出的基于深度學(xué)習(xí)的Webshell檢測(cè)模型。
第四章中調(diào)整模型層數(shù),獲取實(shí)驗(yàn)結(jié)果進(jìn)行對(duì)比,找到最佳模型。
最后在第五章中,我們對(duì)全文進(jìn)行了總結(jié),對(duì)我們所提出的模型和結(jié)果進(jìn)行了分析,總結(jié)了所提出技術(shù)的優(yōu)缺點(diǎn),并對(duì)未來進(jìn)行了展望。
2相關(guān)技術(shù)及其研究
2.1深度學(xué)習(xí)自動(dòng)化特征提取
對(duì)于機(jī)器學(xué)習(xí)系統(tǒng)而言,特征提取是尤為關(guān)鍵的,將對(duì)整個(gè)模型的架構(gòu)和最終的結(jié)果產(chǎn)生相當(dāng)大的影響。但是傳統(tǒng)的機(jī)器學(xué)習(xí)又往往需要人工調(diào)整規(guī)則集,誤差較大的同時(shí)可遷移性也很差,還浪費(fèi)了大量的人力物力。而深度學(xué)習(xí)在大數(shù)據(jù)中分析自動(dòng)獲得所需的特征值,大大降低了人力的開銷,同時(shí)提高了檢測(cè)的準(zhǔn)確性。因此具有相當(dāng)好的效果,在各種領(lǐng)域中也得到了十分廣泛的應(yīng)用。
2.2 PHP操作碼序列
PHP操作碼(opcode)是一種底層的代碼,類似于匯編指令,只不過該指令在PHP的Zend虛擬機(jī)中運(yùn)行。執(zhí)行PHP高級(jí)語言的代碼時(shí)大致會(huì)經(jīng)過如下幾個(gè)步驟,如圖1所示。
(1)詞法分析,去掉注釋、空格,識(shí)別出有意義的單詞。
(2)語法分析,組合單詞成符合文法的語句。
(3)將語句編譯成一條條指令,即opcode。
(4)Zend虛擬機(jī)執(zhí)行opcode,運(yùn)行PHP腳本。
我們的樣本是由PHP高級(jí)語言寫成的,其中包含了各類關(guān)鍵字、標(biāo)識(shí)符,單詞類別繁雜,若是直接對(duì)其進(jìn)行向量化處理,將會(huì)得到一個(gè)非常大的稀疏矩陣,從而造成資源浪費(fèi)。我們可以將PHP高級(jí)語言寫成的代碼轉(zhuǎn)換為一個(gè)較小的有限指令集,即PHP操作碼,然后再對(duì)操作碼進(jìn)行向量化處理。
操作碼可以通過VLD(VulcanLogicDisassembler)擴(kuò)展獲得。例如,cmd里運(yùn)行命令“php -dvld.active=1 -dvld.execute=0 ./phpinfo.php”,可得到phpinfo.php的操作碼(圖2中的op字段)。其中,“-dvld.active=1”表示啟用擴(kuò)展,“-dvld.execute=0”表示不執(zhí)行該程序腳本。
下面對(duì)本地所有樣本執(zhí)行該命令(部分結(jié)果如圖3所示)。第一列字段值為序號(hào);第二列字段值為1表示是webshell文件,字段值為0表示是正常文件;第三列字段值為文件路徑;第四列字段值為操作碼;第五列字段值為操作碼個(gè)數(shù)。這樣就得到了所有樣本的操作碼序列,后續(xù)可以進(jìn)行向量化。
2.3詞向量
2.3.1基本概念
機(jī)器無法直接處理現(xiàn)實(shí)中的語言文字,故需要將他們數(shù)學(xué)化,而詞向量就是語言文本數(shù)學(xué)化后的數(shù)據(jù)。簡單地說,通過某種方法,將語言文本中的一個(gè)個(gè)文字單位轉(zhuǎn)化成一個(gè)個(gè)向量,這些向量就稱為詞向量。
2.3.2 one-hot表示法
最簡單的向量化方法。假如有句子“afriendinneedisafriendindeed”,對(duì)句子進(jìn)行處理,對(duì)單詞去重,形成一本字典,就有{“a”,“friend”,“in”,“need”,“is”,“indeed”},這個(gè)字典就作為輸入。經(jīng)過one-hot表示后,輸出即為每個(gè)單詞的向量表示,比如“friend”表示為[0,1,0,0,0,0],“need”表示為[0,0,0,1,0,0]。這種方法雖然簡單,但能直觀地讓人明白向量化的過程,說明了單詞是如何數(shù)學(xué)化的。
2.3.3 基于頻率的詞向量
基于頻率的詞向量表示方法主要有CountVector、TF-IDFVector、Co-OccurenceVector。
CountVector是對(duì)句子中出現(xiàn)的單詞進(jìn)行計(jì)數(shù),從而生成一張二維表來表示向量化后的結(jié)果。表頭為字典,字典對(duì)所有文檔(及整個(gè)語料庫)進(jìn)行去重;每一行代表一個(gè)文檔。比如,現(xiàn)有兩個(gè)文檔,D1=“Heishandsome”,D2=“Heishandsome,veryhandsome”。字典為{“He”,“is”,“handsome”,“very”},生成二維表如表1。
這一方法只是簡單的計(jì)數(shù),對(duì)于一些特殊的詞匯,例如“is”“and”等在日常使用中經(jīng)常出現(xiàn),使用高頻,但顯然不表示重要意義。對(duì)這些詞計(jì)數(shù)實(shí)質(zhì)上加大了它們的重要性,這并不合理。
TF-IDF方法則引入了逆文檔頻率的概念。逆文檔頻率IDF=log(N/n)。N為文檔總數(shù),n代表某個(gè)單詞在多少個(gè)文檔中出現(xiàn)過。對(duì)于常用詞匯,更可能出現(xiàn)在各種文檔中,IDF的值降低了這一類詞的權(quán)重。 TF即為某個(gè)詞在某個(gè)特定文檔里出現(xiàn)的次數(shù),TF與IDF的乘積就作為詞匯最終的權(quán)重,表示其重要性,相比純計(jì)數(shù)更加合理。
Co-OccurenceVector還將上下文內(nèi)容考慮了進(jìn)來。舉例如下,現(xiàn)有句子“Heisaveryhandsomeboy.Heisclever”。引入概念contextwindow表示上下文范圍,假定contextwindow=2,那么與very共現(xiàn)的單詞即為[“is”,“a”,“handsome”,“boy”]。取該句子的字典,下面構(gòu)建共現(xiàn)矩陣,如表2所示??纯碒e這一行是怎么得到的:He出現(xiàn)了兩次,第一次與它共現(xiàn)的單詞為[“is”,“a”],第二次與它共線的單詞為[“handsome”,“boy”,“is”,“clever”],故“is”出現(xiàn)了兩次,除“He”“very”外,其余單詞出現(xiàn)次數(shù)均為1。
共現(xiàn)矩陣的詞向量包含了上下文語義信息,相比前面兩種方法更優(yōu)秀。
2.3.4基于預(yù)測(cè)的詞向量
基于頻率的詞向量表示方法主要有連續(xù)詞袋模型(CBOW,continuesbagofwords)、跳字模型(Skip-Gram)。之前介紹的三種詞向量都有一個(gè)共同的缺點(diǎn),即一旦單詞數(shù)目非常多后,矩陣會(huì)變得龐大而稀疏,造成資源浪費(fèi),處理也更加麻煩。CBOW和Skip-Gram與上述模型有相似之處,都可以包含上下文信息;不同的是,它們通過構(gòu)建神經(jīng)網(wǎng)絡(luò)的方式對(duì)向量降維,達(dá)到了壓縮詞向量的效果,使詞向量的表示更加緊密。
2.3.5word2vec工具
word2vec是Google發(fā)布的一個(gè)工具,其中就包含了上述的跳字模型和連續(xù)詞袋模型,它使用方便,可以使我們快速地將單詞向量化,然后讓機(jī)器來讀取數(shù)據(jù)。
使用該工具只需一句話:model=gensim.models.Word2Vec(sentences,min_count=1),第一個(gè)參數(shù)是訓(xùn)練語料,第二個(gè)參數(shù)指小于該數(shù)的單詞會(huì)被剔除,第三個(gè)參數(shù)是神經(jīng)網(wǎng)絡(luò)的隱藏層單元數(shù),默認(rèn)為100。
2.4本章小結(jié)
本章首先從深度學(xué)習(xí)和傳統(tǒng)的機(jī)器學(xué)習(xí)相比,在提取特征方面的優(yōu)勢(shì)出發(fā),著重介紹了PHP操作碼的獲取和在Webshell檢測(cè)中的應(yīng)用以及詞向量的相關(guān)概念。
3基于深度學(xué)習(xí)的Webshell檢測(cè)模型的設(shè)計(jì)
3.1 RNNs-LSTM模型
長短期記憶模型LSTM(Longshort-termmemory)是一種特殊的循環(huán)神經(jīng)網(wǎng)絡(luò)。它能夠在較長序列數(shù)據(jù)中起作用,使數(shù)據(jù)有更長距離的依賴性,解決長序列的梯度消失和梯度爆炸問題。
LSTM的輸入有三個(gè),細(xì)胞狀態(tài)Ct-1、隱層狀態(tài)ht-1、輸入向量Xt;輸出有兩個(gè),細(xì)胞狀態(tài)Ct、隱層狀態(tài)ht。細(xì)胞狀態(tài)的信息會(huì)一直在上面的一條線上傳遞,隱層狀態(tài)的信息一直在下面的一條線上傳遞,它們之間會(huì)有一些交互,即隱層狀態(tài)的信息會(huì)通過門結(jié)構(gòu)傳遞到上層,從而對(duì)細(xì)胞狀態(tài)施加影響。
中間框部分即為門結(jié)構(gòu)。σ代表sigmoid函數(shù),它的輸出在0到1之間;tanh是雙曲正切函數(shù),它的輸出在-1到1之間。門結(jié)構(gòu)包括了遺忘門、更新門、輸出門。遺忘門對(duì)上一節(jié)點(diǎn)傳來的輸入進(jìn)行選擇性遺忘;更新門獲得新的輸入帶來的信息并進(jìn)行選擇性記憶,保留部分信息;輸出門決定哪些數(shù)據(jù)將作為當(dāng)前狀態(tài)的輸出。
3.2本章小結(jié)
本章簡要介紹了長短期記憶模型LSTM及其門結(jié)構(gòu)。
4實(shí)驗(yàn)結(jié)果測(cè)試及分析
4.1實(shí)驗(yàn)環(huán)境
Windows10下使用Python3.6.8運(yùn)行,使用的IDE為VisualStudioCode
4.2 實(shí)驗(yàn)?zāi)P图皽y(cè)試結(jié)果
使用LSTM模型進(jìn)行測(cè)試。
樣本操作碼利用word2vec全部向量化后就可以作為檢測(cè)模型的輸入了。我們使用keras進(jìn)行建模。keras在TensorFlow的基礎(chǔ)上又封裝了一層,使用方便,很適合用來做實(shí)驗(yàn)。
model = Sequential()
model.add(LSTM(128, dropout=0.2, recurrent_dropout=0.2))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy',
optimizer='adam',
metrics=['accuracy'])
print('now training....')
model.fit(x_train, y_train, epochs=100, batch_size=32)
Sequential用來插入神經(jīng)網(wǎng)絡(luò)層。add創(chuàng)建了一個(gè)單層的LSTM模型,其中包含128個(gè)神經(jīng)元。dropou=0.2規(guī)定了每次訓(xùn)練隨機(jī)丟失20%的權(quán)重,用于防止過擬合,從而增加模型的泛化能力。sigmoid函數(shù)用作神經(jīng)網(wǎng)絡(luò)的激活函數(shù),常用于二分類問題,它能將任何一個(gè)實(shí)數(shù)映射到(0,1)的區(qū)間里,可以用于將數(shù)據(jù)變成一個(gè)0-1分布。compile用于配置訓(xùn)練時(shí)使用的損失函數(shù)、優(yōu)化器、準(zhǔn)確率評(píng)測(cè)標(biāo)準(zhǔn)。model.fit()開始訓(xùn)練,參數(shù)epochs=100,即把所有訓(xùn)練數(shù)據(jù)完整地迭代100遍,最終得到了0.95的準(zhǔn)確率,如圖5所示。
4.3 結(jié)果比對(duì)及分析
增加模型層數(shù),使用兩層和三層的LSTM模型進(jìn)行訓(xùn)練和測(cè)試,結(jié)果如表3所示。
從上述結(jié)果中可以發(fā)現(xiàn),并不是LSTM模型的層數(shù)越多越好,兩層、三層模型的測(cè)試準(zhǔn)確率都不如單層模型理想,三層LSTM的準(zhǔn)確率不到0.90,相比單層低了約0.5。導(dǎo)致這一現(xiàn)象的原因可能是梯度消失,當(dāng)網(wǎng)絡(luò)層數(shù)加深時(shí),程序在反復(fù)學(xué)習(xí)過程中找到最佳權(quán)值以獲取最佳輸出,梯度的反向傳播導(dǎo)致權(quán)值的連乘效應(yīng)加強(qiáng),梯度效應(yīng)消失,對(duì)結(jié)果造成影響。也可能是網(wǎng)絡(luò)層數(shù)加深導(dǎo)致的過擬合。結(jié)果顯示,當(dāng)使用單層LSTM時(shí),檢測(cè)效果最好,此時(shí)準(zhǔn)確率為0.95161。
4.4 本章小結(jié)
改變LSTM模型的層數(shù)大小進(jìn)行了新的訓(xùn)練和測(cè)試,最終得出了檢測(cè)結(jié)果的準(zhǔn)確率與層數(shù)多少并不成正比的結(jié)論。較多的網(wǎng)絡(luò)層數(shù)可能導(dǎo)致過擬合,從而檢測(cè)結(jié)果不準(zhǔn)確。
5總結(jié)及展望
本文在對(duì)Webshell操作碼序列進(jìn)行分析后,在已有的相關(guān)研究的基礎(chǔ)之上,汲取了相關(guān)思想,較為創(chuàng)新性的提出了基于深度學(xué)習(xí)的神經(jīng)網(wǎng)絡(luò)模型,并將其與Webshell檢測(cè)進(jìn)行結(jié)合,最終的模型測(cè)試結(jié)果取得了不錯(cuò)的準(zhǔn)確率,是切實(shí)有效的。
當(dāng)然,本文所提出的模型和實(shí)驗(yàn)過程也存在一定的缺陷,例如測(cè)試的過程中,雖然已經(jīng)選擇了一定的實(shí)驗(yàn)數(shù)據(jù),但是在當(dāng)前龐大復(fù)雜的網(wǎng)絡(luò)環(huán)境中,Webshell變化多端,存在各種不同的變種和類型。那么不可避免的,本文所提出的模型在對(duì)某些Webshell進(jìn)行檢測(cè)時(shí)不具有普適性,或許會(huì)檢測(cè)失敗。這也是我們未來的一個(gè)進(jìn)行深入研究的方向,我們?cè)谖磥頃?huì)持續(xù)關(guān)注這個(gè)領(lǐng)域的相關(guān)研究和測(cè)試,在測(cè)試中不斷完善本文所提出的模型,爭取在更多的測(cè)試用例中都取得優(yōu)良的結(jié)果,以使得我們的模型更具有普適性。
參考文獻(xiàn):
[1] 胡必偉.基于貝葉斯理論的Webshell檢測(cè)方法研究[J].科技廣場(chǎng),2016(6):66-70.
[2] 張涵,薛質(zhì),施勇.基于多層神經(jīng)網(wǎng)絡(luò)的Webshell改進(jìn)檢測(cè)方法研究[J].通信技術(shù),2019,52(1):179-183.
[3] YoonKim.ConvolutionalNeural Networks for Sentence Classfication[R].Neural and Evolutionary Computing,2014.
[4] He K M,ZhangX Y,Ren SQ,etal.Deep residual learning for image recognition[C]//2016 IEEE Conference on Computer Vision and Pattern Recognition (CVPR).June 27-30,2016,Las Vegas,NV,USA.IEEE,2016:770-778.
[5] He KM,SunJ.Convolutional neural networks at constrained time cost[C]//2015 IEEE Conference on Computer Vision and Pattern Recognition (CVPR).June7-12,2015,Boston,MA,USA.IEEE,2015:5353-5360.
[6] Behrens S,Hagen B. Web shell detection using NeoPI[EB/OL].(2012-04-13)[2017-11-6].
[7] 賈文超,戚蘭蘭,施凡,等.采用隨機(jī)森林改進(jìn)算法的WebShell檢測(cè)方法[J].計(jì)算機(jī)應(yīng)用研究,2018,35(5):1558-1561.
【通聯(lián)編輯:代影】