陳典超,王 晨
(1.武漢郵電科學研究院,湖北武漢 430000;2.南京烽火天地通信科技有限公司,江蘇 南京 210000)
隨著互聯網的快速發展,Web 應用技術不斷推陳出新。其中,JavaScript 因跨平臺、動態執行等特性而嶄露頭角,成為Web 開發中必不可少的腳本語言。而根據騰訊反病毒實驗室《2018 年度安全報告》顯示:非PE 病毒中JavaScript 病毒排名第二,占所有病毒的23.21%。因此,惡意JavaScript 代碼檢測不容忽視。為了識別惡意的JavaScript 代碼,網絡安全研究者提出了三種檢測方式:靜態檢測、動態檢測和動靜態檢測技術。文中采用的是基于語義分析的惡意代碼靜態檢測方法。首先,通過將JavaScript 代碼解析為AST 的方式來防止代碼混淆,然后,將解析好的JavaScript 語法單元序列放入FastText 和深度LSTM,以轉換成動態詞向量。最后,通過DPCNN 模型來提取惡意代碼的特征,形成惡意JavaScript 代碼檢測模型。通過與傳統的檢測模型進行比較分析,最終表明該模型具有較高的準確性。
惡意JavaScript 代碼給Web 應用用戶帶來的巨大損失引起了網絡安全研究者的廣泛關注。為此,研究者將惡意JavaScript 代碼檢測技術劃分為三類:基于代碼結構的靜態分析方法、基于動態執行結果的動態分析方法以及實時提取特征的動靜態結合的組合分析法。
靜態分析方法主要是通過分析收集到的惡意JavaScript 數據集來提取惡意代碼的特征。傳統靜態分析方法使用的是機器學習算法[1],如SVM[2](支持向量機)、樸素貝葉斯等。隨后,深度學習開始應用于惡意代碼檢測。最初,文獻[3]利用語義信息和隨機森林的方式來檢測惡意代碼。靜態分析方法推陳出新,文獻[4]利用注意力機制通過雙向長短期記憶神經網絡來檢測惡意代碼,文獻[5-6]也提出了基于語義信息的深度學習的監測模型。
動態分析方法利用執行過程和執行結果來判斷檢測樣本的惡意性。在沙箱、蜜罐等模擬環境中執行檢測樣本,在執行過程中將獲取的代碼執行細節、提取的類似行為作為特征,將這些特征作為依據來檢測樣本。2010 年提出的JSAND 檢測技術利用蜜罐動態分析惡意代碼的執行細節,提取相似性。之后,提出了基于攻擊行為建模的惡意檢測方法,它使用確定性有限自動機(DFA)來總結行為特征,獲取惡意行為信息。
組合分析方法種類繁多,如文獻[7]使用機器學習和動態程序分析惡意代碼的攻擊特征向量或動態執行軌跡來進行檢測,首先對代碼進行動態解析;然后靜態掃描解析出的內容,統計其特征,實現惡意代碼檢測;之后;使用靜態方法解析代碼的動態特征和靜態特征,使用深度學習模型對特征進行綜合分類,以實現惡意代碼檢測。
該文所使用的檢測模型分為兩個步驟:數據處理、模型訓練與檢測,如圖1 所示。數據處理階段采用Esprima 解析器將JavaScript 代碼解析為AST(抽象語法樹),通過遍歷AST 生成語法單元序列實現代碼的反混淆[8-9]。然后使用FastText 來訓練對應的語法單元序列獲得對應的靜態詞向量[10],根據獲得的靜態詞向量,使用多層Bi-LSTM 來生成檢測模型所需要的包含語義信息的動態詞向量。模型訓練與檢測階段主要是向DPCNN[11]輸入動態詞向量[12]提取相應的特征,然后根據特征來判斷代碼的惡意性。

圖1 監測模型框架
語法單元序列依賴上游的AST(Abstract Syntax Tree)抽象語法樹生成,然后為下游的詞向量提取做準備。該文采用高性能的語法分析工具Esprima 解析JavaScript 代碼。作為常用的靜態代碼分析工具,Esprima 不僅可以生成合理的語法樹,還可以實現語法可視化、代碼驗證等功能。其高性能則表現在不僅可以對不同版本的JavaScript 代碼進行解析,還可以對混淆后的JavaScript 代碼進行解析來實現反混淆的功能。Esprima 將JavaScript 代碼解析成不同類型的節點,然后映射成對應的樹形節點,繼而形成抽象語法樹AST。最后通過深度優先遍歷的方式遍歷語法樹,生成語法單元序列,Esprima解析過程如圖2所示。

圖2 Esprima解析過程
語法單元序列在輸入檢測模型進行特征提取和檢測前,需要轉換成模型所需的詞向量數據。該文將詞向量提取分為兩步:靜態詞向量提取和包含語義信息的動態詞向量提取。在靜態詞向量提取中,該文采用的是FastText 詞向量模型。相比于傳統的Word2Vec 模型,FastText 的一大優勢就是字符級別的n-gram 分詞。字符級別的n-gram 可以最大程度上解決相似詞的詞向量相似問題。以單詞statement 為例,<為前綴,>為后綴,FastText分詞結果如圖3所示。

圖3 FastText分詞結果
然而,FastText 提取的靜態詞向量不包含上下文語義信息。為此,需要經靜態詞向量轉換成具備上下文語義的動態詞向量。為了構造包含上下文語義信息的詞向量,該文引入了Bi-LSTM(雙向長短期記憶)網絡。單向的LSTM(長短期記憶)網絡只包含上文的語義信息,而Bi-LSTM 則是通過正向和后向的雙向LSTM,通過拼接的方式構造出了包含上下文語義信息的動態詞向量。如圖4所示,該文采用多層疊加的深度Bi-LSTM 來構造動態詞向量Ht。

圖4 動態詞向量的生成
假設一個語法單元序列S 經過FastText 訓練后,得到每個語法單元對應的靜態詞向量,如式(1)所示:
對于每個靜態詞向量Wt,通過每一層前向LSTM和后向LSTM 都會生成不同動態詞向量,拼接后形成時間t的輸出Ht,如式(2)所示:
而對于前向分量和后向分量的{Hi|i=1,2,3},其計算公式如式(5)-(6)所示:
動態詞向量Ht由FastText 構造出的靜態詞向量Wt、Wt通過前向LSTM 得到的和Wt通過后向LSTM 得到的拼接而成。前向LSTM 提取上文的語義信息,后向LSTM 提取下文的語義信息。由此,每個輸出都包含了上下文的語義信息。
在選擇深度學習算法中,該文采用了層次更深、精度更高的深層金字塔卷積神經網絡(Deep Pyramid CNN,DPCNN)。DPCNN 的模型架構如圖5 所示。

圖5 DPCNN模型
相比于傳統的TextCNN[13],DPCNN 在不增加運算成本的情況下,通過加深網絡的方式來獲取更高的準確率。在DPCNN[14-15]模型中,詞嵌入可以包含多個詞的嵌入,之后卷積層和下采樣層交替重復出現。在下采樣層中,DPCNN采用數量不變的特征圖。因為特征圖尺寸減半,卷積運算的時間也相應減半。經過這樣的下采樣,模型實現了不增加運算成本的情況下加深網絡和增強全局特征提取能力的功能。不僅如此,DPCNN 還采用了等長卷積和區域詞嵌入的方式來提高詞向量的語義內涵。經過上述步驟后,檢測模型獲得了JavaScript 惡意代碼的特征。最后,使用這些特征通過一個全連接的Softmax層來計算檢測樣本相應的概率分布。
1)數據集
該實驗的JavaScript 數據集主要來自兩方面:爬取Alexa平臺前100名的網站獲取良性數據集2 000個,在GitHub 等平臺上獲取惡意數據集2 000 個。最后,將所有的數據集以4∶1 的比例隨機分為測試集和訓練集。實驗環境信息如表1 所示。

表1 實驗環境信息
2)參 數
該模型在表1 所示的實驗環境中運行,樣本數據和語法單元序列的提取使用NodeJS 和Esprima 來實現。詞向量的訓練和模型的構建則是由Python 實現的。模型的訓練參數包括epoch=20,batch_size=32,batch=100,seq_len=128,pool_size=3,stride=2,學習率設置為0.001,dropout設置為0.1。
3)評估標準
在分類算法中,通常使用TP(真正率)、FP(假正例)、TN(真反例)和FN(假反例)作為評估的基本標準[16]。為了更加準確地評判每種分類算法的準確性,該文采用準確率、精準率、召回率和F1 值作為模型的評估標準。其計算公式如式(7)-(10)所示:
實驗將該文檢測模型與SVM(支持向量機)[17-18]、樸素貝葉斯兩種傳統機器學習算法和雙向LSTM、結合注意力機制的Bi-LSTM、JSContana 三種深度學習算法進行對比。如表2 所示,所有算法均采用準確率、精確率、召回率和F1 值來進行評估,評估指標為加權平均值。

表2 該文檢測模型與其他算法的檢測結果對比
從表2 可以看出,該文檢測模型在幾種機器學習算法和深度學習算法中效果最好,準確率最高。在使用五折交叉驗證時,準確率和召回率都達到了0.96。然后是JSContana 和Bi-LSTM-Attention,雙向LSTM 表現一般。最后是SVM,樸素貝葉斯算法的性能最差,準確率和召回率分別為0.73、0.75;相對而言,使用深度學習算法的模型性能較機器學習算法的模型性能好。而在深度模型算法中,DPCNN 和Bi-LSTM 組合模型的性能最好。
不同模型處理時間的對比如表3 所示。

表3 不同模型處理時間的對比
由表3 可以看出,在模型訓練和加載時間上,因為動態詞嵌入模型收斂較慢,JSContana 和結合Bi-LSTM 的DPCNN 模型耗時都是最多的。此外,JSContana 和該文檢測模型在加載時間和檢測時間都是最為接近的,證明了機器學習耗時雖短,但是準確率不高。而深度學習算法在檢測時間成本和性能上,結合Bi-LSTM 的DPCNN 模型是最佳的。
該文提出了一種基于語義的JavaScript 惡意代碼靜態分析檢測模型。為了提高檢測效果,避免版本更迭和混淆代碼造成檢測失真,該文檢測模型在數據處理時,首先使用抽象語法樹提取詳細的語法單元序列。然后,使用疊加的雙向LSTM 生成動態詞向量使詞向量攜帶代碼的真實上下文語義信息。最后,DPCNN 為模型提取惡意代碼特征并進行檢測。經由上述實驗對比可知,該檢測模型準確率高達0.985。這也意味著該檢測模型可以有效地檢測JavaScript 惡意代碼。
但是,該檢測模型仍具備較大的缺陷。模型由疊加的雙向LSTM 和卷積神經網絡DPCNN 組成,這意味著模型需要較多的訓練樣本和較長的訓練時間。此外,隨著網絡的飛速發展,惡意代碼的種類和數量也會快速增加,該檢測模型對惡意代碼的敏感性會不斷降低。因此,文中提出的檢測模型仍需進一步研究和改進。