雷天翔,萬 良,于 淼,褚 堃
1(貴州大學 計算機科學與技術(shù)學院,貴陽 550025)
2(貴州大學 計算機軟件與理論研究所,貴陽 550025)
近年來,隨著Web 應用程序以瀏覽器/服務器(B/S)架構(gòu)占據(jù)主流市場,Web 服務已經(jīng)被廣泛的應用,瀏覽器和網(wǎng)頁已然成為傳播惡意代碼的重要途徑.攻擊者使用網(wǎng)站代碼漏洞,第三方應用程序漏洞,瀏覽器漏洞和操作系統(tǒng)漏洞對網(wǎng)站執(zhí)行跨站點腳本攻擊,注入Web 木馬,篡改網(wǎng)頁,網(wǎng)絡釣魚和竊取個人信息,造成用戶個人信息泄露和財產(chǎn)損失.根據(jù)《2019中國網(wǎng)絡安全報告》,瑞星“云安全”在2019年全球共截獲惡意網(wǎng)址(URL)總量1.45 億個,其中掛馬類網(wǎng)站1.2 億個,釣魚類網(wǎng)站2454 萬個[1].中國的惡意URL 總數(shù)為471.63 萬,位列全球第五.惡意內(nèi)容包含在惡意網(wǎng)頁中,這些惡意網(wǎng)頁很容易使訪問者不知不覺地受到網(wǎng)絡攻擊,例如病毒傳播,特洛伊木馬植入,信息泄漏等.他們的惡意代碼主要是腳本語言,例如JavaScript.為了避免檢測,這些惡意腳本還以不同的編碼方法進行了混淆[2].經(jīng)過混淆后的JavaScript 惡意代碼更是成為提高檢測性能的一大難點.
當前,靜態(tài)檢測方法為大多數(shù)研究人員在對Java-Script 惡意代碼檢測過程中使用的方法.此方法通過對JavaScript 源碼的語法、過程、結(jié)構(gòu)等進行分析從而提取特征達到對惡意代碼的檢測的目的.隨后使用機器學習[3-5]的檢測方法被提出.Likarish 等[6]從每個代碼文件中選擇65 個統(tǒng)計特征作為輸入,包括可讀序列的數(shù)量,每個JavaScript 關鍵字的頻率,腳本的長度,每行平均字符數(shù)和Unicode 符號.數(shù)量等.評估代碼的可讀性,然后利用機器學習來檢測模糊的惡意JavaScript 代碼,取得了很好的分類效果.Wang[7]采用機器學習技術(shù)抽取和分析惡意腳本特征,使用SVM 分類模型進行分類,結(jié)果表明具有較高的檢測率低誤報率.Li 等[8]使用自編碼器將高維數(shù)據(jù)轉(zhuǎn)換為低維數(shù)據(jù),緊接著采用深度自編碼網(wǎng)絡自動學習JavaScript 惡意代碼的特征,從而對其進行檢測和分類.通過研究發(fā)現(xiàn)現(xiàn)有的檢測技術(shù)存在著手工提出特征,工作量大主觀性太強和對混淆的惡意代碼檢測難度大等不足,針對上述不足之處,一些研究人員開始使用深度學習的方法來檢測JavaScript 惡意代碼,深度學習神經(jīng)網(wǎng)絡可以自動學習特征,因此避免了手動提取特征的復雜性和主觀性.Cui[9]將深度學習中的卷積神經(jīng)網(wǎng)絡(Convolutional Neural Networks,CNN)運用到JavaScript 惡意代碼檢測.Wu 等[10]使用卷積神經(jīng)網(wǎng)絡、LSTM、CNNLSTM 模型進行漏洞檢測.上述實驗結(jié)果顯示,相比于傳統(tǒng)的方法,上述方法的優(yōu)勢盡顯無疑.Fang 等[11]使用LSTM 來對JavaScript 惡意代碼.LSTM 能有效地檢測JavaScript 惡意代碼,但對于混淆的JavaScript 惡意代碼的檢測還不夠準確.Choi 等[12]和Visaggio 等[13]使用3 個衡量標準來對混淆進行檢測,衡量指標分別是字符串的最大長度、無序狀態(tài)的熵、在忽略大小寫后,非數(shù)字字母在字符串中所占的比例.Lu 等[14]從代碼的語義方面對代碼進行反混淆.馬洪亮等[15]將靜態(tài)分析和動態(tài)分析相結(jié)合起來,以此來達到惡意代碼反混淆的目的.
基于上訴文獻,為了獲取惡意代碼深層本質(zhì)特征,提出了一種基于雙向長短時記憶網(wǎng)絡的JavaScript 檢測方法.LSTM是帶有記憶細胞單元的循環(huán)神經(jīng)網(wǎng)絡,常用于處理長序列數(shù)據(jù),能解決長序列數(shù)據(jù)依賴的問題.但是單向的LSTM 只能解決上文對下文的依賴而無法解決下文對上文的依賴,使得對JavaScript 代碼特征提取不夠充分.在此基礎上本文選擇雙向長短時記憶網(wǎng)絡來學習JavaScript 代碼,獲得更加全面的代碼特征,提高檢測的準確度.實驗結(jié)果分析,該方法具有較優(yōu)的分類效果,強魯棒性和較強的泛化能力.
本文檢測方法的整體框架如圖1所示,首先通過爬蟲工具從Alexa和PhishTank 網(wǎng)站收集大量數(shù)據(jù),隨后經(jīng)過數(shù)據(jù)清洗、數(shù)據(jù)分詞和數(shù)據(jù)向量化后得到能輸入到神經(jīng)網(wǎng)絡中的標準化數(shù)據(jù)集,最后使用雙向長短時神經(jīng)網(wǎng)絡對標準數(shù)據(jù)集進行訓練和分類,得到最終的結(jié)果.
圖1 JavaScript 檢測整體框架
在1991年,研究人員提出了一種改進的RNN 網(wǎng)絡,也就是長短時神經(jīng)網(wǎng)絡(Long Short term Memory Networks,LSTM).這一網(wǎng)絡的出現(xiàn)成功的解決了RNN的長期依賴問題和梯度消失問題.
LSTM 網(wǎng)絡結(jié)構(gòu)如圖2所示,其有4 個重要組成部分為遺忘門、輸入門、輸出門、用于更新細胞狀態(tài)的部分[16];遺忘門決定保留和遺忘上一時刻狀態(tài)ct-1的哪些信息;輸入門負責決定在t時刻的輸入xt有多少信息被保留到ct;輸出門選擇ct有多少輸送到了LSTM在t時刻的輸出值ht;數(shù)學表達式如下:
圖2 長短時記憶網(wǎng)絡結(jié)構(gòu)
更新遺忘門輸出ft:
式(1)中,遺忘門的權(quán)重矩陣為wf,ht-1和xt拼接成的一個新向量 [ht-1,xt],偏置為bf,σ1(x)為激活函數(shù)使用Sigmoid.
更新輸入門的輸出it,同時計算候選狀態(tài),計算公式如下:
其中,wi為輸入門的權(quán)重,bi為偏置向量,激活函數(shù)σ2(x)同樣使用Sigmoid 函數(shù),wc為權(quán)重矩陣,bc為偏置向量,激活函數(shù)為t anh(x).
更新當前時刻細胞狀態(tài)ct:
更新輸出門輸出ht:
式(5)中,輸出門的權(quán)重矩陣為wo,激活函數(shù)使用tanh(x),bo是輸出門的偏置.
LSTM 解決了RNN的梯度消失問題,但單向的LSTM 只能從前向后傳遞依賴,無法充分利用上下文信息,在面對預測問題時,需要上下文信息來共同決定當前預測結(jié)果,使得預測結(jié)果更加準確.因此,雙向LSTM 被提出來解決此問題,其結(jié)構(gòu)如圖3所示.
圖3 BiLSTM 網(wǎng)絡結(jié)構(gòu)
2.4.1 模型構(gòu)建
為了充分利用上下文的依賴關系,本文提出一種基于BiLSTM的檢測模型.如圖4所示.
圖4 基于BiLSTM的檢測模型
Input layer:輸入層.數(shù)據(jù)以向量的形式進行輸入,同時還要設置相關參數(shù)(batchsize).
BiLSTM layer:雙向長短時記憶網(wǎng)絡層.BiLSTM具有能解決數(shù)據(jù)長期依賴并且能保留上下文語義信息的優(yōu)點,讓其自動學習JavaScript 惡意代碼的特征.其中包括了兩部分,從前向后傳遞的LSTM 層和從后向前傳遞的LSTM 層,在某一時刻,將兩個方向不同的層的結(jié)果結(jié)合起來,得到最終的輸出結(jié)果傳遞給下一層.
Dropout layer:為了使檢測模型具有較強的泛化能力,防止過擬合問題的產(chǎn)生.
Output layer:輸出層.輸出分類器分類后的結(jié)果.
本文的JavaScript 惡意代碼檢測模型步驟如下,具體分為兩步,第1 步為提取代碼的抽象特征,第2 步對其進行分類檢測.輸入:Xi={x1,x2,…,x49,x50}
步驟1:
(1)將Xi作為輸入,經(jīng)過輸入層得到輸出向量Ii={i1,i2,…,i49,i50}.
(2)Ii作為BiLSTM 層的輸入向量,經(jīng)過這一層的前向LSTM 得到前向的隱向量hLi={hL1,hL2,···,hL63,hL64}.經(jīng)過后向的LSTM 得到后向的隱向量hRi={hR1,hR2,···,hR63,hR64}.
(3)最后將(2)中的兩個向量拼接成為一個新的向量{[hL1,hR1],[hL2,hR2],···,[hL63,hR63],[hL64,hR64]},即hi={h0,h1,···,h63,h64}.
步驟2:
(1)為了防止過擬合問題的產(chǎn)生,在dropout 層,隨機的使若干個神經(jīng)元失活,這一層的輸入為hi,這一層的輸出為d={d1,d2,…,d63,d64}.
(2)將dropout 層的輸出向量d輸入到Output 層的Softmax 函數(shù)中進行分類,得到最終的二維輸出y.
2.4.2 算法設計
為了檢測出惡意代碼,設計了算法1.
算法1.BiLSTM 訓練算法1) 構(gòu)建BiLSTM 神經(jīng)網(wǎng)絡并對網(wǎng)絡的權(quán)重和偏置進行初始化操作;2) 構(gòu)建Softmax 并初始化其參數(shù);3) for iin epoch,進行迭代循環(huán)訓練,epoch為訓練迭代次數(shù);4) 將預處理后的訓練集Xi 作為輸入層的輸入,得到輸出Ii;5)將Ii 作為BiLSTM的輸入,經(jīng)過前向LSTM和后向LSTM 分別得到前向隱向量hL和后向隱向量hR,將hL和hR 拼接得到抽象特征h;6) 經(jīng)過dropout 層避免模型出現(xiàn)過擬合;7) 將抽象特征向量輸入到Softmax 分類其中得到分類結(jié)果;8) 根據(jù)最后的輸出結(jié)果和真實結(jié)果之間的差距,通過反向傳播算法依次調(diào)整各個參數(shù);9) 更新Softmax的參數(shù);10)對BiLSTM 神經(jīng)網(wǎng)絡的權(quán)重和偏置進行更新;11) end for 12) 將Ti={t1,t2,…,t49,t50}作為測試集輸入到訓練好的模型中,得到測試結(jié)果.
本文實驗的硬件條件為:處理器Intel(R) Core(TM)i7-9750H CPU@2.60 GHz,內(nèi)存8 GB,圖像處理器NIVDIA GeForce GTX 1650,顯存4 GB.實驗環(huán)境為Python3.6.2、Tensorflow-gpu1.15.0.
本文的數(shù)據(jù)集中,良性的數(shù)據(jù)來自于Alexa 排名靠前的網(wǎng)站所抓取的數(shù)據(jù),惡意的數(shù)據(jù)來源于知名網(wǎng)站PhishTank的數(shù)據(jù)庫,經(jīng)過數(shù)據(jù)預處理后,獲得良性的代碼數(shù)據(jù)84 208 條和惡意代碼數(shù)據(jù)26 216 條.為良性的數(shù)據(jù)打上標記為1,惡意的數(shù)據(jù)打上標記為0.實驗中,從樣本中以7:3的比例隨機選取訓練集和測試集數(shù)據(jù).表1展示了數(shù)據(jù)集分布情況.
表1 數(shù)據(jù)集分布
為了提高輸入數(shù)據(jù)的質(zhì)量以此來提高整個模型性能,在此基礎上,本文對收集的所有數(shù)據(jù)進行了數(shù)據(jù)預處理.
(1)代碼反混淆:利用解碼技術(shù)對于惡意的Java-Script 混淆代碼進行了反混淆處理.本文采用動態(tài)分析的技術(shù)進行反混淆.首先生成混淆代碼的抽象語法樹AST,遍歷AST的所有節(jié)點,若該節(jié)點為變量,數(shù)組,方法等,則將該節(jié)點進行保留,其余的節(jié)點則刪除,對保留的節(jié)點使用變量值讀取器[17]讀取終值.經(jīng)過上述反混淆過程,隱藏在變量終值中的初始JavaScript 惡意代碼會被還原出來.如圖5所示為混淆代碼還原為原始代碼.
圖5 混淆代碼經(jīng)過反混淆還原為初始代碼
(2)分詞:對數(shù)據(jù)進行代碼反混淆的工作后,由于神經(jīng)網(wǎng)絡的輸入為向量,因此先進行分詞處理,使用分詞工具NLTK對代碼數(shù)據(jù)進行分詞,去除停用詞,為后續(xù)訓練詞向量做準備.圖6展示了分詞結(jié)果.
圖6 分詞后的結(jié)果
(3)向量化:首先根據(jù)詞頻-逆文件頻率(TF-IDF)算法建立詞匯庫,選擇那些對識別惡意代碼具有關鍵作用的詞.根據(jù)詞匯庫將代碼數(shù)據(jù)轉(zhuǎn)化為數(shù)值型數(shù)據(jù),使用Gensim 工具包中的Word2Vec 模型對分詞的數(shù)據(jù)訓練,將分詞的數(shù)據(jù)轉(zhuǎn)化為向量,表2展示了一個向量化的樣例.由于神經(jīng)網(wǎng)絡輸入長度固定,而向量化后的代碼長度不固定.因此選擇合適的向量維度對于模型精度極其重要,于是在訓練詞向量的過程中根據(jù)最后的向量維度,如果數(shù)據(jù)的長度超過向量維度,則對其進行截斷,如果數(shù)據(jù)的長度沒有超過向量維度,后面的數(shù)據(jù)用-1 進行填充.使得所有輸入數(shù)據(jù)都保持在合適的向量維度.
表2 向量化結(jié)果
表3展示了BiLSTM的實驗結(jié)果.此結(jié)果為代碼數(shù)據(jù)經(jīng)過BiLSTM 神經(jīng)網(wǎng)絡的訓練和分類后得到的.
表3 BiLSTM 實驗結(jié)果混淆矩陣
3.3.1 評價指標
為了驗證本文方法的性能,本文方法的評判標準為準確率(Accuracy)、誤報率(False Positive Rate,FPR)和召回率(Recall,RE),評價分類模型的3 個重要指標如下:
準確率:被正確檢測出的數(shù)據(jù)占所有樣本的比例,即:
召回率:正確分類為惡意的代碼占所有惡意代碼的比例,即:
誤報率:良性的數(shù)據(jù)被誤判為惡意代碼占樣本總數(shù)的比例,即:
具體參數(shù)見表4.
表4 模型參數(shù)設置
3.3.2 檢測方法分析
(1)向量維度
在數(shù)據(jù)預處理時,不同的向量維度對模型的訓練和檢測的效率具有不同的影響,一個合適的向量維度才能使模型充分利用數(shù)據(jù)的信息.向量維度過長會使得模型的收斂速度變慢,向量維度過短會遺失大量的有效信息,因此為了選擇合適的向量維度,本文對比了30、50、100、150 這4 個向量維度,以此來觀察向量維度與準確率和訓練時間的變化關系.實驗結(jié)果如圖7所示.由圖中的結(jié)果可以得出,向量維度超過50 后,模型的檢測效果相差不明顯,但是模型訓練所用的時間卻相差很大.模型在向量維度為50和100 時,其檢測效果是最好的,然而選擇100 維向量時,模型的訓練時間幾乎是50 維向量的2 倍,因此,本文在數(shù)據(jù)預處理時選擇了向量維度為50 維,對不足50 維的向量進行填充,對超過50 維的向量進行截斷.
圖7 向量維度
(2)優(yōu)化器
神經(jīng)網(wǎng)絡中的優(yōu)化器是在利用損失函數(shù)計算出模型的損失值后,再利用損失值對模型的各個參數(shù)進行優(yōu)化,使其達到最優(yōu)的值.最終使得模型的預測值和真實值的誤差越來越小.不同的優(yōu)化器會導致模型性能的差異,模型的收斂速度的不同.本文對幾種常見的優(yōu)化器進行了對比試驗,損失函數(shù)的變化曲線如圖8所示.可以看出,優(yōu)化器SDG的效果最差,并且收斂的速度不如其余幾個優(yōu)化器,Adam 優(yōu)化器的收斂速度略微高于其余幾種優(yōu)化器而它的損失函數(shù)值更小.故本文的模型選擇了Adam 優(yōu)化器,使模型更加快速的收斂到一定的值.
圖8 優(yōu)化器
(3)分類器
分類器是根據(jù)數(shù)據(jù)的真實標簽來學習分類的規(guī)則,隨后在訓練完畢后對未知的數(shù)據(jù)進行分類.常用的兩種分類器為LR 分類器和Softmax 分類器,LR 分類器主要用于二分類問題,Softmax 常用于互斥的多分類問題,在分類數(shù)為2的時候,會退化為邏輯回歸分類.本文對兩種分類器進行了對比實驗.從表5中的實驗結(jié)果可以看出使用了Softmax 分類器的模型的性能要優(yōu)于使用LR 分類器的檢測模型,因此這里選擇Softmax 作為分類器.
表5 分類器
在實驗環(huán)節(jié),本文對各種參數(shù)的設置進行了對比實驗,選擇了能使模型達到最優(yōu)效果的參數(shù),所得的檢測模型的參數(shù)設置如表6所示.
表6 模型參數(shù)設置
本文提出的實驗方法結(jié)果如圖9~圖11所示,隨著訓練次數(shù)的增加,準確率和損失函數(shù)曲線會逐漸收斂.通過預測值和真實值之間的誤差反向傳播調(diào)節(jié)各個參數(shù)的值,直到模型的效果達到最優(yōu),在5 個epoch 后,此時準確率和損失函數(shù)的值會收斂到一定值.模型訓練完畢后,使用測試集數(shù)據(jù)對模型進行測試,實驗發(fā)現(xiàn),本文提出的方法對于一條script 標簽的代碼進行檢測的時間約為0.33 s,并且數(shù)據(jù)隨來隨檢測,可以對網(wǎng)頁中的JavaScript 惡意代碼實現(xiàn)實時的檢測.
圖9 損失函數(shù)曲線
圖10 準確率變化曲線
圖11 ROC 曲線
3.3.3 對比分析
本文通過兩組對比實驗來評估模型的效果.其中一組對比實驗是將本文的方法和文獻[7]的SVM,AD Tree 等檢測方法進行對比.另一組對比試驗是將本文中的方法與其他深度學習算法如TextCNN,RCNN 等進行對比.
(1)機器學習對比實驗
從表7和圖12可以看出,傳統(tǒng)的機器學習方法對JavaScript 惡意代碼實現(xiàn)了較好的檢測,但與本文的BiLSTM 相比,對惡意代碼檢測的準確率沒有本文方法的高,并且誤報率相對而言較高,而本文方法的準確率為99.52%而誤報率僅為1.4%,并且不需要手動提取惡意代碼特征,節(jié)省了大量的人力.
表7 BiLSTM與機器學習算法對比結(jié)果
圖12 BiLSTM與機器學習算法對比
(2)深度學習對比實驗
為了驗證本文提出的方法效果更優(yōu),將本文的方法與TextCNN,RCNN和LSTM 進行對比實驗,結(jié)果如表8和圖13所示,TextCNN 常用于文本分類,其將一個句子中的每個詞當作一個一維向量,使用卷積的方式去獲取句子的特征,但是其網(wǎng)絡結(jié)構(gòu)忽略了句子之間的結(jié)構(gòu)信息,沒有考慮到惡意代碼中的函數(shù)、數(shù)組、變量的調(diào)用關系,分類效果沒有本文方法中的效果好.RCNN 則是在經(jīng)過一個雙向RNN 后再經(jīng)過一個最大池化層,試圖找到最重要的潛在語義因素,然而在惡意代碼檢測領域,無論是最重要的因素還是次重要的因素都可能對我們的安全造成威脅,因此,在本實驗中,RCNN的準確率不及本文方法.LSTM 沒有充分的獲取到上下文的相關信息,因此它的誤報率明顯高于本文方法.
表8 BiLSTM與深度學習方法對比結(jié)果
圖13 不同深度學習方法對比
綜上所述,與其他機器學習方法和深度學習方法相比,使用本文提出的BiLSTM 更適合對JavaScript 惡意代碼進行檢測,BiLSTM 模型明顯優(yōu)于其他方法.
本文在現(xiàn)有檢測技術(shù)的基礎上,提出一種使用雙向長短時記憶網(wǎng)絡檢測JavaScript 惡意代碼攻擊的方法.為了提高檢測的精度,首先使用解碼技術(shù)對JavaScript進行反混淆的處理,并利用深度學習工具Word2Vec將代碼向量化作為神經(jīng)網(wǎng)絡的輸入.最后,使用深度學習算法BiLSTM對JavaScript 惡意代碼進行分類,提高檢測的性能.和機器學習算法相比,BiLSTM 檢測模型無需人工提取代碼特征,其會自動的提取出跟惡意代碼檢測相關的特征.和深度學習其他算法相比,BiLSTM檢測模型更加充分的獲取到代碼的上下文相關信息,模型的檢測性能更加的優(yōu)異,通過測試檢測模型并與機器學習和深度學習分類算法進行比較,驗證了本文提出的基于BiLSTM的JavaScript惡意代碼檢測模型的可行性和有效性.結(jié)合上述實驗結(jié)果,本文方法可以應用到實踐中去,將本文的提出方法以插件的形式嵌入到瀏覽器中,如谷歌瀏覽器,用戶在不經(jīng)意點開某些惡意站點如色情網(wǎng)站,虛假的購物網(wǎng)站,賭博網(wǎng)站時會發(fā)出警告來提醒用戶有潛在的安全威脅.