周子恒 李琳 趙敘 李凱
摘要:在當(dāng)今現(xiàn)代化的世界中,人工智能逐漸被應(yīng)用在各個領(lǐng)域之中,而深度學(xué)習(xí)就是人工智能的核心算法之一,近些年來也被廣泛應(yīng)用于網(wǎng)絡(luò)安全領(lǐng)域,傳統(tǒng)簡單的通過人工定義規(guī)則集的檢測方法逐漸被淘汰掉。而現(xiàn)在,如果將深度學(xué)習(xí)方法應(yīng)用在檢測Webshell中,不僅可以很好地提高準確率,而且和傳統(tǒng)的機器學(xué)習(xí)方法相比,可以自動提取特征值,完成特征工程的過程更加智能化。因此基于深度學(xué)習(xí)來研究Webshell檢測是近些年來一個得到持續(xù)關(guān)注的熱點課題。該文主要針對使用PHP編寫的Webshell進行檢測,將深度學(xué)習(xí)方法和PHP文件操作碼序列的特點進行結(jié)合,在構(gòu)建的模型上訓(xùn)練測試數(shù)據(jù)集,最終可以獲得相當(dāng)高的準確率。
關(guān)鍵詞:Webshell;操作碼;詞向量;長短記憶網(wǎng)絡(luò);深度學(xué)習(xí)
中圖分類號:TP393? ? ? ? 文獻標識碼:A
文章編號: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項目背景及相關(guān)研究
Webshell是一種網(wǎng)絡(luò)頁面后門程序,也被稱為木馬,是一種Web管理工具,可以對web服務(wù)器進行操作。黑客往往利用各種漏洞上傳自己編寫的Webshell到Web服務(wù)器,從而對文件、數(shù)據(jù)庫等進行管理。黑客可以對被植入Webshell的網(wǎng)站進行文件的上傳和下載,調(diào)用相關(guān)系統(tǒng)命令等一系列惡意操作,更有甚者可以通過各種混淆的手段繞過WAF。Webshell極具隱蔽性,很難被發(fā)現(xiàn),并且隨著時間的推移,其種類得到了大量的擴充。根據(jù)腳本類型可以分為PHP木馬、ASP木馬、JSP木馬和CGI木馬;按照功能則可以將其分成大馬、小馬及一句話木馬。各種Webshell的破壞性、隱藏性等都不容小覷,嚴重威脅著一個網(wǎng)站的安全,甚至在一些領(lǐng)域威脅到了國家安全。但目前大多數(shù)對于Webshell的檢測都是基于規(guī)則集的檢測方法,通過人工核定特征碼、危險函數(shù)等來識別一種特定的Webshell,雖然這種方法查找起來速度較快,但是存在很高的出錯率和遺漏率,在網(wǎng)站規(guī)模日益龐大的信息化時代,人工設(shè)定規(guī)則集的方式顯然不能滿足日益變化的Webshell種類。
近些年機器學(xué)習(xí)的興起和在各個領(lǐng)域的應(yīng)用,給Webshell的檢測工作帶來了新的思路,也有相當(dāng)多的學(xué)者、科研機構(gòu)進行了一定的研究。例如,2016年胡必偉提出基于貝葉斯的Webshell檢測技術(shù),同時還應(yīng)用統(tǒng)計學(xué)檢測方法,計算文件信息熵,并以此為依據(jù)確定文件是正常文件還是Webshell文件。同時在賈文超等人近期進行的研究中,采用了隨機森林算法,提高決策樹分類強度,降低了樹間的相關(guān)度,達到了相當(dāng)好的效果,同時根據(jù)其仿真實驗得出的結(jié)果可以證明,該算法提高了Webshell檢測的效率和準確率。在2018年,張涵等人在論文《基于多層神經(jīng)網(wǎng)絡(luò)的Webshell改進檢測方法研究》中利用深度學(xué)習(xí)的卷積神經(jīng)網(wǎng)絡(luò)對Webshell進行了檢測,利用詞向量轉(zhuǎn)換算法word2vec將經(jīng)過預(yù)編譯處理得到的中間代碼進行轉(zhuǎn)換,得到特征向量。最后,利用多層神經(jīng)網(wǎng)絡(luò)進行檢測。實驗結(jié)果證明,該方法與傳統(tǒng)的機器學(xué)習(xí)算法相比,有效提高了準確率,降低了丟失率,減少了人工的操作,對未知Webshell的檢測能力也得到了有效加強。
1.2研究內(nèi)容
本文將主要解決深度學(xué)習(xí)在Webshell檢測中的相關(guān)應(yīng)用問題,計劃利用深度學(xué)習(xí)理論智能提取惡意代碼操作碼序列特征并對分類模型進行相關(guān)研究。本文將PHP文件編譯成操作碼序列,利用循環(huán)神經(jīng)網(wǎng)絡(luò)(RNNs-LSTM)對Webshell檢測進行模型搭建,其中還包含word2vec詞向量轉(zhuǎn)換、多層LSTM結(jié)構(gòu)等。最后通過實驗數(shù)據(jù),比較出不同層次結(jié)構(gòu)模型的表現(xiàn),選擇最佳的模型。
1.3論文結(jié)構(gòu)
本文首先在第一章中對Webshell的相關(guān)概念及可能造成的威脅進行了介紹,同時也闡明了近些年來學(xué)界所做的相關(guān)研究,并表明我們做的研究方向和期望。
第二章中將介紹本文涉及的相關(guān)技術(shù),主要包括深度學(xué)習(xí)的優(yōu)勢、PHP操作碼序列獲取,詞向量等。
第三章則是介紹本文所提出的基于深度學(xué)習(xí)的Webshell檢測模型。
第四章中調(diào)整模型層數(shù),獲取實驗結(jié)果進行對比,找到最佳模型。
最后在第五章中,我們對全文進行了總結(jié),對我們所提出的模型和結(jié)果進行了分析,總結(jié)了所提出技術(shù)的優(yōu)缺點,并對未來進行了展望。
2相關(guān)技術(shù)及其研究
2.1深度學(xué)習(xí)自動化特征提取
對于機器學(xué)習(xí)系統(tǒng)而言,特征提取是尤為關(guān)鍵的,將對整個模型的架構(gòu)和最終的結(jié)果產(chǎn)生相當(dāng)大的影響。但是傳統(tǒng)的機器學(xué)習(xí)又往往需要人工調(diào)整規(guī)則集,誤差較大的同時可遷移性也很差,還浪費了大量的人力物力。而深度學(xué)習(xí)在大數(shù)據(jù)中分析自動獲得所需的特征值,大大降低了人力的開銷,同時提高了檢測的準確性。因此具有相當(dāng)好的效果,在各種領(lǐng)域中也得到了十分廣泛的應(yīng)用。
2.2 PHP操作碼序列
PHP操作碼(opcode)是一種底層的代碼,類似于匯編指令,只不過該指令在PHP的Zend虛擬機中運行。執(zhí)行PHP高級語言的代碼時大致會經(jīng)過如下幾個步驟,如圖1所示。
(1)詞法分析,去掉注釋、空格,識別出有意義的單詞。
(2)語法分析,組合單詞成符合文法的語句。
(3)將語句編譯成一條條指令,即opcode。
(4)Zend虛擬機執(zhí)行opcode,運行PHP腳本。
我們的樣本是由PHP高級語言寫成的,其中包含了各類關(guān)鍵字、標識符,單詞類別繁雜,若是直接對其進行向量化處理,將會得到一個非常大的稀疏矩陣,從而造成資源浪費。我們可以將PHP高級語言寫成的代碼轉(zhuǎn)換為一個較小的有限指令集,即PHP操作碼,然后再對操作碼進行向量化處理。
操作碼可以通過VLD(VulcanLogicDisassembler)擴展獲得。例如,cmd里運行命令“php -dvld.active=1 -dvld.execute=0 ./phpinfo.php”,可得到phpinfo.php的操作碼(圖2中的op字段)。其中,“-dvld.active=1”表示啟用擴展,“-dvld.execute=0”表示不執(zhí)行該程序腳本。
下面對本地所有樣本執(zhí)行該命令(部分結(jié)果如圖3所示)。第一列字段值為序號;第二列字段值為1表示是webshell文件,字段值為0表示是正常文件;第三列字段值為文件路徑;第四列字段值為操作碼;第五列字段值為操作碼個數(shù)。這樣就得到了所有樣本的操作碼序列,后續(xù)可以進行向量化。
2.3詞向量
2.3.1基本概念
機器無法直接處理現(xiàn)實中的語言文字,故需要將他們數(shù)學(xué)化,而詞向量就是語言文本數(shù)學(xué)化后的數(shù)據(jù)。簡單地說,通過某種方法,將語言文本中的一個個文字單位轉(zhuǎn)化成一個個向量,這些向量就稱為詞向量。
2.3.2 one-hot表示法
最簡單的向量化方法。假如有句子“afriendinneedisafriendindeed”,對句子進行處理,對單詞去重,形成一本字典,就有{“a”,“friend”,“in”,“need”,“is”,“indeed”},這個字典就作為輸入。經(jīng)過one-hot表示后,輸出即為每個單詞的向量表示,比如“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是對句子中出現(xiàn)的單詞進行計數(shù),從而生成一張二維表來表示向量化后的結(jié)果。表頭為字典,字典對所有文檔(及整個語料庫)進行去重;每一行代表一個文檔。比如,現(xiàn)有兩個文檔,D1=“Heishandsome”,D2=“Heishandsome,veryhandsome”。字典為{“He”,“is”,“handsome”,“very”},生成二維表如表1。
這一方法只是簡單的計數(shù),對于一些特殊的詞匯,例如“is”“and”等在日常使用中經(jīng)常出現(xiàn),使用高頻,但顯然不表示重要意義。對這些詞計數(shù)實質(zhì)上加大了它們的重要性,這并不合理。
TF-IDF方法則引入了逆文檔頻率的概念。逆文檔頻率IDF=log(N/n)。N為文檔總數(shù),n代表某個單詞在多少個文檔中出現(xiàn)過。對于常用詞匯,更可能出現(xiàn)在各種文檔中,IDF的值降低了這一類詞的權(quán)重。 TF即為某個詞在某個特定文檔里出現(xiàn)的次數(shù),TF與IDF的乘積就作為詞匯最終的權(quán)重,表示其重要性,相比純計數(shù)更加合理。
Co-OccurenceVector還將上下文內(nèi)容考慮了進來。舉例如下,現(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ù)測的詞向量
基于頻率的詞向量表示方法主要有連續(xù)詞袋模型(CBOW,continuesbagofwords)、跳字模型(Skip-Gram)。之前介紹的三種詞向量都有一個共同的缺點,即一旦單詞數(shù)目非常多后,矩陣會變得龐大而稀疏,造成資源浪費,處理也更加麻煩。CBOW和Skip-Gram與上述模型有相似之處,都可以包含上下文信息;不同的是,它們通過構(gòu)建神經(jīng)網(wǎng)絡(luò)的方式對向量降維,達到了壓縮詞向量的效果,使詞向量的表示更加緊密。
2.3.5word2vec工具
word2vec是Google發(fā)布的一個工具,其中就包含了上述的跳字模型和連續(xù)詞袋模型,它使用方便,可以使我們快速地將單詞向量化,然后讓機器來讀取數(shù)據(jù)。
使用該工具只需一句話:model=gensim.models.Word2Vec(sentences,min_count=1),第一個參數(shù)是訓(xùn)練語料,第二個參數(shù)指小于該數(shù)的單詞會被剔除,第三個參數(shù)是神經(jīng)網(wǎng)絡(luò)的隱藏層單元數(shù),默認為100。
2.4本章小結(jié)
本章首先從深度學(xué)習(xí)和傳統(tǒng)的機器學(xué)習(xí)相比,在提取特征方面的優(yōu)勢出發(fā),著重介紹了PHP操作碼的獲取和在Webshell檢測中的應(yīng)用以及詞向量的相關(guān)概念。
3基于深度學(xué)習(xí)的Webshell檢測模型的設(shè)計
3.1 RNNs-LSTM模型
長短期記憶模型LSTM(Longshort-termmemory)是一種特殊的循環(huán)神經(jīng)網(wǎng)絡(luò)。它能夠在較長序列數(shù)據(jù)中起作用,使數(shù)據(jù)有更長距離的依賴性,解決長序列的梯度消失和梯度爆炸問題。
LSTM的輸入有三個,細胞狀態(tài)Ct-1、隱層狀態(tài)ht-1、輸入向量Xt;輸出有兩個,細胞狀態(tài)Ct、隱層狀態(tài)ht。細胞狀態(tài)的信息會一直在上面的一條線上傳遞,隱層狀態(tài)的信息一直在下面的一條線上傳遞,它們之間會有一些交互,即隱層狀態(tài)的信息會通過門結(jié)構(gòu)傳遞到上層,從而對細胞狀態(tài)施加影響。
中間框部分即為門結(jié)構(gòu)。σ代表sigmoid函數(shù),它的輸出在0到1之間;tanh是雙曲正切函數(shù),它的輸出在-1到1之間。門結(jié)構(gòu)包括了遺忘門、更新門、輸出門。遺忘門對上一節(jié)點傳來的輸入進行選擇性遺忘;更新門獲得新的輸入帶來的信息并進行選擇性記憶,保留部分信息;輸出門決定哪些數(shù)據(jù)將作為當(dāng)前狀態(tài)的輸出。
3.2本章小結(jié)
本章簡要介紹了長短期記憶模型LSTM及其門結(jié)構(gòu)。
4實驗結(jié)果測試及分析
4.1實驗環(huán)境
Windows10下使用Python3.6.8運行,使用的IDE為VisualStudioCode
4.2 實驗?zāi)P图皽y試結(jié)果
使用LSTM模型進行測試。
樣本操作碼利用word2vec全部向量化后就可以作為檢測模型的輸入了。我們使用keras進行建模。keras在TensorFlow的基礎(chǔ)上又封裝了一層,使用方便,很適合用來做實驗。
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)建了一個單層的LSTM模型,其中包含128個神經(jīng)元。dropou=0.2規(guī)定了每次訓(xùn)練隨機丟失20%的權(quán)重,用于防止過擬合,從而增加模型的泛化能力。sigmoid函數(shù)用作神經(jīng)網(wǎng)絡(luò)的激活函數(shù),常用于二分類問題,它能將任何一個實數(shù)映射到(0,1)的區(qū)間里,可以用于將數(shù)據(jù)變成一個0-1分布。compile用于配置訓(xùn)練時使用的損失函數(shù)、優(yōu)化器、準確率評測標準。model.fit()開始訓(xùn)練,參數(shù)epochs=100,即把所有訓(xùn)練數(shù)據(jù)完整地迭代100遍,最終得到了0.95的準確率,如圖5所示。
4.3 結(jié)果比對及分析
增加模型層數(shù),使用兩層和三層的LSTM模型進行訓(xùn)練和測試,結(jié)果如表3所示。
從上述結(jié)果中可以發(fā)現(xiàn),并不是LSTM模型的層數(shù)越多越好,兩層、三層模型的測試準確率都不如單層模型理想,三層LSTM的準確率不到0.90,相比單層低了約0.5。導(dǎo)致這一現(xiàn)象的原因可能是梯度消失,當(dāng)網(wǎng)絡(luò)層數(shù)加深時,程序在反復(fù)學(xué)習(xí)過程中找到最佳權(quán)值以獲取最佳輸出,梯度的反向傳播導(dǎo)致權(quán)值的連乘效應(yīng)加強,梯度效應(yīng)消失,對結(jié)果造成影響。也可能是網(wǎng)絡(luò)層數(shù)加深導(dǎo)致的過擬合。結(jié)果顯示,當(dāng)使用單層LSTM時,檢測效果最好,此時準確率為0.95161。
4.4 本章小結(jié)
改變LSTM模型的層數(shù)大小進行了新的訓(xùn)練和測試,最終得出了檢測結(jié)果的準確率與層數(shù)多少并不成正比的結(jié)論。較多的網(wǎng)絡(luò)層數(shù)可能導(dǎo)致過擬合,從而檢測結(jié)果不準確。
5總結(jié)及展望
本文在對Webshell操作碼序列進行分析后,在已有的相關(guān)研究的基礎(chǔ)之上,汲取了相關(guān)思想,較為創(chuàng)新性的提出了基于深度學(xué)習(xí)的神經(jīng)網(wǎng)絡(luò)模型,并將其與Webshell檢測進行結(jié)合,最終的模型測試結(jié)果取得了不錯的準確率,是切實有效的。
當(dāng)然,本文所提出的模型和實驗過程也存在一定的缺陷,例如測試的過程中,雖然已經(jīng)選擇了一定的實驗數(shù)據(jù),但是在當(dāng)前龐大復(fù)雜的網(wǎng)絡(luò)環(huán)境中,Webshell變化多端,存在各種不同的變種和類型。那么不可避免的,本文所提出的模型在對某些Webshell進行檢測時不具有普適性,或許會檢測失敗。這也是我們未來的一個進行深入研究的方向,我們在未來會持續(xù)關(guān)注這個領(lǐng)域的相關(guān)研究和測試,在測試中不斷完善本文所提出的模型,爭取在更多的測試用例中都取得優(yōu)良的結(jié)果,以使得我們的模型更具有普適性。
參考文獻:
[1] 胡必偉.基于貝葉斯理論的Webshell檢測方法研究[J].科技廣場,2016(6):66-70.
[2] 張涵,薛質(zhì),施勇.基于多層神經(jīng)網(wǎng)絡(luò)的Webshell改進檢測方法研究[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] 賈文超,戚蘭蘭,施凡,等.采用隨機森林改進算法的WebShell檢測方法[J].計算機應(yīng)用研究,2018,35(5):1558-1561.
【通聯(lián)編輯:代影】