周子恒 李琳 趙敘 李凱



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