程琪芩,萬 良+
1.貴州大學 計算機科學與技術學院,貴陽 550025
2.貴州大學 計算機軟件與理論研究所,貴陽 550025
隨著信息時代的不斷發(fā)展,網(wǎng)絡安全問題日益受到人們的關注??缯灸_本(cross-site scripting,XSS)作為一種威脅網(wǎng)絡平臺安全的攻擊形式,對其進行有效的檢測已成為當今網(wǎng)絡安全領域的重要研究內(nèi)容[1]。
XSS 攻擊的形成是由于攻擊者在客戶端注入了惡意代碼,從而達到竊取用戶敏感信息等攻擊目標[2-3]。XSS攻擊主要分為三類:反射型XSS攻擊(又稱非持久型XSS 攻擊)、存儲型XSS 攻擊(又稱持久型XSS攻擊)和基于文檔對象模型(document object model,DOM)的XSS攻擊(又稱type-0 XSS攻擊)[4]。形式復雜多變的XSS攻擊導致了傳統(tǒng)檢測方法在檢測性能上存在不足,經(jīng)過混淆處理后的XSS 代碼更是成為提高檢測性能的一大難點[5]。
傳統(tǒng)的檢測技術有基于模糊測試技術[6]、基于黑盒技術[7]等,隨后又提出了基于機器學習[8]的檢測技術。文獻[9]分別構造了檢測準確率優(yōu)于其他決策樹的交替決策樹(alternating decision tree,ADTree)分類器和組合多個弱分類器的自適應提升算法(adaptive Boosting,Adaboost)分類器用于XSS 檢測,并在此基礎上建立了網(wǎng)頁數(shù)據(jù)庫。該方法前期采用了大量的人工特征提取工作,分類效果直接受提取特征好壞的影響。文獻[10]人工提取了25個關鍵特征,并使用10 種不同的機器學習分類器檢測XSS 攻擊,檢測效率良好。文獻[11]人工提取了18個特征,作為檢測惡意網(wǎng)頁的重要依據(jù)。文獻[12]耗費時間提取特征后再使用樸素貝葉斯(naive Bayesian)、支持向量機(support vector machine,SVM)和J48 決策樹(J48 decision tree,J48DT)三種機器學習算法預測XSS 攻擊。隨著研究不斷深入,發(fā)現(xiàn)現(xiàn)有的Web 應用XSS檢測技術還存在著以下不足:(1)需要手工提取特征,工作量大的同時主觀性很強[13];(2)XSS攻擊所注入的代碼常通過惡意混淆來躲避檢測,可讀性低,不易檢測[14];(3)現(xiàn)有檢測技術未能很好地利用注入代碼中XSS的有關信息[2]。針對上述不足,一些研究學者開始使用自動學習特征的深度神經(jīng)網(wǎng)絡來檢測XSS。文獻[15]將深度學習中的長短時記憶網(wǎng)絡(long-short term memory,LSTM)運用到漏洞檢測。文獻[16]在研究中采用卷積神經(jīng)網(wǎng)絡(convolutional neural networks,CNN)、LSTM、CNN-LSTM模型進行漏洞檢測。實驗結果表明,上述方法的預測精度要優(yōu)于傳統(tǒng)的多層感知器(multilayer perceptron,MLP)方法。文獻[17]使用LSTM網(wǎng)絡構建XSS檢測模型,實驗結果表明,基于LSTM的檢測方法能有效地應用于XSS 檢測中,但其對于惡意混淆的XSS 檢測還不夠準確。
結合上述文獻研究,本文提出了一種基于雙向長短時記憶網(wǎng)絡(bidirectional long-short term memory,BiLSTM)的跨站腳本檢測方法。LSTM 是一種帶有記憶單元的神經(jīng)網(wǎng)絡,常用于處理序列問題,能解決長序列依賴的問題,從而廣泛應用在自然語言處理領域中。但是單向的LSTM 只能處理上文對下文的依賴問題,而無法解決下文對上文的依賴,從而對于XSS 特征學習過程中,忽略了下文與上文語義關系,使得提取的特征不夠充分。在此基礎上本文借鑒雙向循環(huán)神經(jīng)網(wǎng)絡(bidirectional recurrent neural network,BiRNN)雙向處理序列的特點,選擇BiLSTM 來雙向學習XSS代碼,獲取更全面的XSS特征,提高檢測性能。首先,通過數(shù)據(jù)預處理,解決樣本數(shù)據(jù)惡意編碼混淆的問題,提高XSS代碼的可讀性。其次,BiLSTM在經(jīng)典LSTM 的基礎上加強了對后文的依賴性的處理,能更全面地學習XSS的相關信息,得到更全面的抽象特征。最后,使用softmax 分類器對學習到的特征實現(xiàn)分類。實驗結果表明,該方法具有良好的分類效果和泛化能力。
循環(huán)神經(jīng)網(wǎng)絡(recurrent neural network,RNN)能夠根據(jù)歷史信息保持記憶,使其可以利用距離特征預測當前輸出。但是,RNN具有梯度消失的缺陷,不利于長序列的處理。LSTM 是RNN 的一種變形,通過增加記憶單元來解決序列的長期依賴問題,以避免梯度消失。
LSTM的工作原理如圖1所示。LSTM有四個重要的組成部分[18]:細胞狀態(tài)、遺忘門、輸入門和輸出門。其中細胞狀態(tài)為LSTM的核心部分;遺忘門決定丟棄上一個細胞狀態(tài)ct-1傳遞到該細胞狀態(tài)ct的哪些信息;輸入門決定更新值it和更新候選細胞狀態(tài);通過遺忘門、輸入門以及細胞狀態(tài),此時得到了更新的ct,可以傳遞到下一個細胞狀態(tài)ct+1;輸出門決定輸出值ht。數(shù)學表達式如下:
更新遺忘門輸出ft:
式中,wf為遺忘門層的權值矩陣,bf為偏置向量,σ1(x)為遺忘門的激活函數(shù),表示sigmoid 函數(shù),用于計算ft。
Fig.1 Structure of LSTM圖1 長短時記憶網(wǎng)絡結構
更新輸入門輸出it并計算候選狀態(tài):
式中,wi為輸入門的權重矩陣,bi為偏置向量,σ2(x)為輸入門的激活函數(shù),表示sigmoid 函數(shù),用于計算it。wc為tanh層的權重矩陣,bc為偏置向量,tanh(x)為激活函數(shù),用于計算候選狀態(tài)。
更新細胞狀態(tài)ct:
更新輸出門輸出ht:
式中,wo為輸出門的權重矩陣,bo為偏置向量,σ3(x)為輸出門的激活函數(shù),表示sigmoid 函數(shù),用于計算ot。tanh(x)為tanh 層的激活函數(shù),用于計算輸出ht。
LSTM可以處理長序列中存在的長期依賴,但是單向LSTM只能從前向后獲取序列信息,而序列預測問題可能由前面若干輸入和后面若干輸入共同決定,使序列中與預測結果相關的信息被充分應用,使預測結果更加準確。基于此,雙向長短時記憶網(wǎng)絡應運而生。
BiLSTM主要包含兩部分:(1)自前向后的LSTM層(forward layer);(2)自后向前的LSTM 層(back-ward layer)。其網(wǎng)絡結構如圖2所示。
Fig.2 Structure of BiLSTM圖2 BiLSTM網(wǎng)絡結構
BiLSTM 的核心思想[19]為:在t時刻,在Forward層自前向后正向計算一遍,得到并保存每個時刻向后隱含層的輸出;在Backward 層自后向前反向計算一遍,得到并保存每個時刻向前隱含層的輸出;最后在每個時刻結合Forward 層和Backward 層的輸出,得到最終的輸出
檢測方法的整體框架如圖3所示,首先利用爬蟲工具從XSSed 數(shù)據(jù)庫和DMOZ 數(shù)據(jù)庫收集大量數(shù)據(jù),再經(jīng)過數(shù)據(jù)預處理(見3.1節(jié))得到適應神經(jīng)網(wǎng)絡輸入的標準數(shù)據(jù)集,最后構建雙向長短時記憶網(wǎng)絡模型(見3.2節(jié))進行檢測分類。
檢測性能不僅受檢測方法的影響,很多時候良好的輸入數(shù)據(jù)能帶來更好的檢測性能。在此基礎上,本文對所收集的XSS 代碼數(shù)據(jù)和正常代碼數(shù)據(jù)進行了預處理,分為數(shù)據(jù)清洗、分詞以及向量化三部分。
Fig.3 Overall architecture of detection method圖3 檢測方法的整體架構
(1)數(shù)據(jù)清洗:為了提高輸入數(shù)據(jù)的質量,優(yōu)化檢測方法的性能,本文對原始數(shù)據(jù)進行了清洗工作。XSS 代碼主要通過編碼技術進行惡意混淆來躲避檢測,因此本文對數(shù)據(jù)進行了解碼操作,實現(xiàn)XSS代碼的反混淆。圖4 顯示了混淆代碼經(jīng)過解碼還原為原始代碼的一個實例。經(jīng)過解碼后,對數(shù)據(jù)進行去噪處理,主要是為了去除重復、不完整以及錯誤的數(shù)據(jù)。
Fig.4 Instance of original codes decoded and restored by obfuscated codes圖4 混淆代碼經(jīng)過解碼還原為原始代碼的實例
(2)分詞:對數(shù)據(jù)進行清洗后,為了降低向量化后的數(shù)據(jù)維度,本文先將代碼中的數(shù)字轉換為0,將鏈接如“http://www.baidu.com”轉換為“http://u”。然后利用XSS 代碼符合腳本語言的特點,根據(jù)不同功能的分詞類別,設計了一系列自定義正則表達式對輸入的代碼數(shù)據(jù)進行分詞,如表1 所示,分詞結果如圖5所示。
(3)向量化:本文根據(jù)詞頻-逆文件頻率(termfrequency-inverse document frequency,TFIDF)建立一個詞匯庫,為每個詞設置一個數(shù)值id,每個詞出現(xiàn)頻率越高,對XSS的重要性越高,id越小。最后,根據(jù)詞匯庫,將代碼轉換為數(shù)值型數(shù)據(jù),再利用深度學習中的word2vec 工具將已經(jīng)完成分詞的代碼轉換為向量,轉換結果如表2所示。由于神經(jīng)網(wǎng)絡的輸入長度固定,而樣本的長度不固定,選擇合適的向量維度極其重要。故根據(jù)樣例長度,將長度超過向量維度的進行截斷,長度不足的用-1進行填充,使所有的向量長度一致。
Table 1 Tokenization表1 分詞
Fig.5 Tokenized result of sample圖5 樣例經(jīng)過分詞的結果
Table 2 Vectorization result表2 向量化結果
文獻[17]提出了使用LSTM 的深度學習檢測模型DeepXSS,但該模型對于XSS 下文對上文的信息依賴利用不夠充分。故而,本文提出了BiLSTM檢測模型,該模型包含了四個組成部分:輸入層、BiLSTM層、dropout層、輸出層。其中BiLSTM層是模型的核心部分,用于學習樣本的上下文信息,從而抽取有效特征,進而將有效特征用于分類器分類預測跨站腳本。
3.2.1 模型設計
為了實現(xiàn)對XSS 的檢測,本文構建了一種基于BiLSTM的檢測模型,結構自下而上如圖6所示。
Fig.6 Detection model based on BiLSTM圖6 基于BiLSTM的檢測模型
Input layer:輸入層。在本層中,數(shù)據(jù)以二階張量形式來表示,同時設置每次輸入到神經(jīng)網(wǎng)絡中訓練樣本的個數(shù)(batch_size)。在數(shù)據(jù)預處理時預先訓練了詞向量矩陣embedding,因此本模型不再使用embedding層。
BiLSTM layer:雙向長短時記憶網(wǎng)絡層。利用BiLSTM 能捕獲數(shù)據(jù)的時序性和能解決長程依賴問題的優(yōu)點,將其自動學習XSS攻擊的抽象特征,使檢測性能更好。
Dropout layer:用來提高方法的泛化能力,避免過擬合。
Output layer:輸出層。輸出分類器的分類結果。
檢測模型具體步驟如下(以一個樣本Ri={x1,x2,…,x49,x50}為例):
步驟1提取抽象特征
(1)將Ri輸入到輸入層,得到輸入層輸出向量Ii={i1,i2,…,i49,i50}。
(2)將Ii作為BiLSTM 層的forward layer 的輸入,先經(jīng)過前向學習輸出最后一個時間步,作為與XSS相關的特征向量f={f1,f2,…,f63,f64}。
(3)將Ii作為雙向LSTM 層的backward layer 的輸入,先經(jīng)過后向學習輸出最后一個時間步,作為與XSS相關的特征向量b={b1,b2,…,b63,b64}。
(4)將前向學習到的特征f和后向學習到的特征b結合起來,得到雙向長短時記憶網(wǎng)絡提取出的抽象特征h=[f:b]={f1,f2,…,f63,f64,b1,b2,…,b63,b64}。
步驟2使用softmax分類器對抽象特征h進行分類預測。
(1)利用dropout 使部分雙向長短時記憶單元隨機失活,避免訓練結果出現(xiàn)過擬合。將抽象特征h作為dropout 層的輸入,輸出為d={d1,d2,…,d127,d128},其中這128個值以dropout比率被置為0。數(shù)學公式如下:
其中,Bernoulli函數(shù)用于生成概率向量r∈(0,1),h以r的概率置零得到d。
(2)將抽象特征d輸入到softmax 函數(shù)中進行分類預測,得到表示為01或10的2維輸出。公式如下:
其中,ws和bs是softmax函數(shù)的權重與偏置,p∈(0,1)。
3.2.2 算法設計
原始數(shù)據(jù)經(jīng)過數(shù)據(jù)預處理,得到適應神經(jīng)網(wǎng)絡輸入的標準訓練集TrR={R1,R2,…,Rn}、標準測試集TeR={R1,R2,…,Rm},其中n、m分別為訓練集和測試集的樣本數(shù),Ri(50×128維)代表每個樣本。BiLSTM檢測模型算法設計如下:
輸入:訓練集TrR和測試集TeR。
輸出:通過分類器softmax 分類得到的分類結果TrY(2維)。
1.構建BiLSTM網(wǎng)絡并初始化其權重和偏置;
2.構建softmax分類器并初始化其權重和偏置;
3.將預處理后的訓練集TrR作為輸入;
4.foriin epochs #epochs為訓練迭代次數(shù)
5.將TrR作為輸入層的輸入,得到輸出TrI(50×128維);
6.將TrI作為BiLSTM 層的輸入,經(jīng)過forward layer學習得到抽象特征h1(64 維),經(jīng)過backward layer 學習得到抽象特征h2(64維),結合h1、h2后得到抽象特征h=[h1:h2](128維);
7.將抽象特征h作為softmax分類器的輸入,得到分類結果TrY(2維);
8.根據(jù)分類結果與實際標簽的誤差,反向傳播調(diào)整參數(shù);
9.更新softmax分類器的權重和偏置;
10.更新BiLSTM網(wǎng)絡的權重和偏置;
11.end for
12.將測試集TeR作為訓練好的檢測模型的輸入,輸出測試結果。
本文數(shù)據(jù)集中,惡意樣例來源于XSSed 數(shù)據(jù)庫,經(jīng)過數(shù)據(jù)預處理得到27 252 條標準數(shù)據(jù);正常樣例來源于DMOZ 數(shù)據(jù)庫,經(jīng)過數(shù)據(jù)預處理得到77 216條標準數(shù)據(jù)。實驗中,將惡意樣例和正常樣例放在一起,運用交叉驗證中的train_test_split函數(shù),從樣本中以7∶3 的比例隨機選取訓練集和測試集。數(shù)據(jù)集的分布情況如表3所示。
Table 3 Dataset distribution表3 數(shù)據(jù)集分布
本文實驗使用的計算機配置為:處理器Intel?CoreTMi3-2367M CPU@1.40 GHz,內(nèi)存6 GB,64位win10操作系統(tǒng)。實驗環(huán)境為Python 3.5.2、TensorFlow 1.12.0、Keras 2.2.4。
為了驗證檢測方法的性能,本文使用了準確率(precision)、召回率(recall)、F1值對模型評估。在本文的評估指標中,將XSS作為正樣本,將正常樣例作為負樣本,評估指標的混淆矩陣如表4所示。
Table 4 Evaluation index confusion matrix表4 評估指標混淆矩陣
4.3.1 檢測方法分析
(1)向量維度
神經(jīng)網(wǎng)絡輸入向量的維度一致,而樣本的維度不一致,選擇一個合適的向量維度,才能充分利用樣本信息。若向量維度過短,會遺失大量有效信息,降低檢測準確率;若向量維度過長,會增加大量計算,降低檢測實時性。為了得到合適的向量維度,本文比較了不同向量維度對準確率和訓練時間的影響,結果如圖7 所示??梢钥闯觯S度超過50 時準確率變化不太明顯,但是訓練時間幾乎成倍增長,維度為100 和50 的準確率能達到最優(yōu),但是維度為50 的訓練時間明顯低于維度超過50 的訓練時間,從而選擇50作為向量維度能使檢測性能達到最優(yōu)。
Fig.7 Vector dimension圖7 向量維度
(2)優(yōu)化器
優(yōu)化函數(shù)是一種不斷調(diào)整參數(shù)使損失函數(shù)值loss越來越小,最終使預測值盡可能接近真實值的方法,而神經(jīng)網(wǎng)絡中的優(yōu)化器用來更新和計算模型訓練與模型輸出的網(wǎng)絡參數(shù),使其逼近或達到最優(yōu)值。優(yōu)化器的不同,會導致?lián)p失函數(shù)值有所不同,為了找到最小化的損失函數(shù),本文對常見的優(yōu)化器Adam、SGD、RMSprop、Adagrad、Adadelta、Adamax進行了對比實驗,損失函數(shù)關系曲線如圖8所示。從該圖可以看出,SGD優(yōu)化效果最差,而其他幾種優(yōu)化器優(yōu)化效果差異不明顯。故選擇了Adam 優(yōu)化檢測模型,使其能快速將損失函數(shù)收斂到一定值。
Fig.8 Optimizer圖8 優(yōu)化器
(3)分類器
分類器的作用是利用已知標簽的訓練數(shù)據(jù)來學習分類規(guī)則,然后對未知標簽的數(shù)據(jù)進行分類預測。分類器的選擇有很多,而本文采用BiLSTM 對XSS進行檢測,因此需要選擇適用于神經(jīng)網(wǎng)絡的分類器。LR 分類器和softmax 分類器是神經(jīng)網(wǎng)絡常用的分類器,LR分類器常用于二分類,也可以用多個二分類實現(xiàn)多分類,適用于非互斥的分類問題,softmax分類器常用于多分類,也可以用于二分類,適用互斥的分類問題。實驗對比了這兩種神經(jīng)網(wǎng)絡分類器,結果如表5 所示??梢钥闯?,softmax 分類器的分類效果要優(yōu)于LR 分類器,故本文選擇softmax 分類器作為模型的分類器。
(4)實驗結果
本文選擇向量維度為50、優(yōu)化器為Adam對模型進行測試。首先分析各個參數(shù)對于網(wǎng)絡結構以及性能的影響,然后根據(jù)實驗結果調(diào)整參數(shù),直至檢測方法達到最優(yōu)。最終檢測模型的參數(shù)設置如表6所示。
Table 5 Classifier表5 分類器
Table 6 Parameter setting of model表6 模型參數(shù)設置
Fig.9 Training results圖9 訓練結果
對經(jīng)過調(diào)整后的檢測方法進行訓練和測試,準確率和損失函數(shù)變化曲線如圖9 所示。從這兩組圖像可以看出,準確率曲線穩(wěn)步上升的同時損失函數(shù)曲線穩(wěn)步下降且兩者均收斂到一定值,表明檢測方法具有良好的訓練效果,分類效果良好。
4.3.2 對比實驗
為了驗證模型的有效性和優(yōu)勢,本文設計了兩組對比實驗:(1)機器學習對比實驗;(2)深度學習對比實驗。
(1)機器學習對比實驗
為了驗證本文提出的檢測方法性能要優(yōu)于傳統(tǒng)機器學習算法,且因文獻[9]所使用的數(shù)據(jù)集與本文的數(shù)據(jù)集都來源于相同數(shù)據(jù)庫,所以將本文提出的檢測方法與文獻[9]中的ADTree、AdaBoost檢測方法進行對比。ADTree分類器是一種基于Boosting的決策樹學習算法,它的分類性能要優(yōu)于其他決策樹。AdaBoost 針對同一個訓練集訓練多個弱分類器,然后將弱分類器集合成一個強分類器,分類性能更優(yōu)。同時,為了增加對比性,本文選擇XSS檢測中常用的SVM(support vector machine)分類器進行對比實驗,SVM是一種按監(jiān)督學習方式對數(shù)據(jù)進行二元分類的廣義線性分類器。實驗中,運用了sklearn 中的SVM算法對代碼樣本進行分類。實驗結果如表7 和圖10所示。可以看出,ADTree、AdaBoost 準確率分別為93.8%和94.2%,SVM準確率為98.9%,而本文所提出的方法準確率高達99.7%,召回率高達98.1%,F(xiàn)1 值高達98.7%,性能明顯要優(yōu)于ADTree、AdaBoost、SVM這些傳統(tǒng)機器學習算法。
Table 7 Detection results of proposed method and machine learning methods表7 本文方法與機器學習方法的檢測結果
(2)深度學習對比實驗
Fig.10 Comparison of proposed method with machine learning methods圖10 本文方法與機器學習方法對比
Table 8 Detection results of proposed method and similar deep learning methods表8 本文方法與類似深度學習方法檢測結果
Fig.11 Comparison of different deep learning detection methods圖11 不同深度學習檢測方法的對比
為了驗證本文提出的檢測方法相對于其他深度學習檢測方法具有更好的檢測性能,將本文方法與RNN、LSTM和門循環(huán)單元(gated recurrent unit,GRU)進行了對比實驗,結果如表8 和圖11 所示。可以看出,深度學習中常見的RNN、LSTM、GRU 檢測方法對跨站腳本攻擊實現(xiàn)了良好的檢測,但是相對于本文提出的BiLSTM 檢測方法,它們在準確率、召回率和F1值都有所欠缺。同時可以看到本文方法與其他三種方法相比具有最低的誤報率(false positive rate,F(xiàn)PR)。圖12 繪制了四種方法的ROC 曲線(receiver operating characteristic curve),并計算出AUC(area under the curve)值??梢钥闯觯珺iLSTM網(wǎng)絡比單向的RNN、LSTM、GRU網(wǎng)絡更適用于跨站腳本檢測。
Fig.12 ROC curves圖12 ROC曲線
針對現(xiàn)如今復雜網(wǎng)絡中的XSS 攻擊問題,本文提出一種基于雙向長短時記憶網(wǎng)絡的XSS 檢測方法。首先,由于XSS 通常采用編碼技術進行惡意混淆,為了提高檢測精度,先對數(shù)據(jù)解碼;然后,通過數(shù)據(jù)預處理使其向量化作為神經(jīng)網(wǎng)絡的輸入;其次,采用BiLSTM 提取XSS 的抽象特征;最后,利用分類器根據(jù)抽象特征進行分類,完成檢測。與三種傳統(tǒng)的機器學習方法相比,本文所提方法不需要人工提取XSS 代碼特征,大大降低了人力成本,并且得到了更好的檢測結果。與三種深度學習方法相比,本文方法更充分地利用了與XSS 相關的信息,在XSS 檢測上取得了更高的準確率和更低的誤報率。本文提出的檢測方法可能面臨著以下挑戰(zhàn):一是BiLSTM提取的特征中有與XSS 相關性不高的信息,從而加大了模型計算量;二是模型可能對于其他類型的XSS 檢測性能不高。因此下一步將進行針對這兩方面的研究:一是使用注意力機制對模型進行改進,運用注意力機制計算BiLSTM提取特征的注意力權重,使模型顯著關注與XSS相關性高的特征,從而優(yōu)化模型;二是收集其他類型XSS數(shù)據(jù),提高檢測模型的泛化能力。