程琪芩,萬 良+
(1.貴州大學 計算機科學與技術(shù)學院,貴州 貴陽 550025;2.貴州大學 計算機軟件與理論研究所,貴州 貴陽 550025)
跨站腳本(cross-site script,XSS)攻擊最早出現(xiàn)在20世紀90年代的萬維網(wǎng)上,是一種攻擊者將惡意腳本注入web網(wǎng)頁的注入攻擊[1]。黑客利用XSS漏洞盜取用戶Cookie,從而得到用戶的身份權(quán)限,給用戶帶來不便甚至造成巨大損失[2]。因此,檢測XSS攻擊、提高web安全成為當今網(wǎng)絡安全領域不懈的追求。傳統(tǒng)的檢測技術(shù)有模糊測試技術(shù)[3]、黑盒技術(shù)[4]、輸入驗證技術(shù)[5]等,后來又提出了基于機器學習[6-8]的檢測技術(shù)。但是,隨著XSS攻擊形式越來越多變,攻擊特征也更加難以捕捉,現(xiàn)有的檢測方法性能有限[9]。為了更全面地獲取XSS特征,加快模型的收斂速度,提高檢測性能,本文將編碼-解碼(Encoder-Decoder)框架應用到XSS檢測中,將XSS檢測視為自然語言序列問題,由卷積神經(jīng)網(wǎng)絡(convolutional neural network,CNN)和雙向門控循環(huán)單元(bidirectional gated recurrent unit,BiGRU)并行組成Encoder,并運用注意力機制解決該框架的“分心問題”。實驗驗證,應用注意力機制改進Encoder-Decoder框架下的XSS檢測模型具有良好的性能,且相對于串行結(jié)構(gòu),并行結(jié)構(gòu)的CNN和BiGRU具有更好的特征提取能力。
傳統(tǒng)機器學習方法的人工提取特征具有主觀性強、工作量大、特征提取不夠充分等問題,而具備自動學習能力的深度學習能很好的解決這個問題,一些專家學者將其應用到XSS檢測中,并提出了不同的檢測方法。Guichang Z等[10]提出了一種命名為CNNPayl的XSS攻擊檢測方法,該方法先利用高斯混合模型和代碼混淆策略得到攻擊數(shù)據(jù)集,再構(gòu)建多層CNN模型學習和提取攻擊特征,得到了較高檢測率和較低假陽性的檢測效果,但是該方法忽略了XSS上下文的語義信息。Fang Y等[11]提出了一種命名為DeepXSS的XSS檢測方法,該方法運用長短時記憶網(wǎng)絡(long-short term memory,LSTM)檢測XSS,并取得了較好的預測效果。Wu F等[12]提出了一種結(jié)合CNN和LSTM的CNN-LSTM檢測模型,該方法驗證了組合神經(jīng)網(wǎng)絡的效果優(yōu)于單一網(wǎng)絡。
在上述文獻研究的基礎上,本文構(gòu)建了一種應用注意力機制改進Encoder-Decoder框架下的跨站腳本檢測模型。Encoder-Decoder[13]是深度學習中一個非常常見的模型框架,常用于圖像識別和機器翻譯等領域,采用CNN、循環(huán)神經(jīng)網(wǎng)絡(recurrent neural network,RNN)、LSTM等網(wǎng)絡自由搭配,解決多個領域的問題。CNN[14]是一種前饋神經(jīng)網(wǎng)絡,常用于圖像處理、自然語言處理等。CNN通過若干次卷積、池化,不斷提取和壓縮特征,最終學習到高層次特征。門控循環(huán)單元網(wǎng)絡[15](gated recurrent unit,GRU)為LSTM的一個變種,它將LSTM的遺忘門和輸入門合成為重置門,用于捕獲序列問題中的短期依賴,并設置了更新門,用于捕獲序列問題中的長期依賴。GRU結(jié)構(gòu)比LSTM簡單,參數(shù)更少,訓練收斂速度更快。借鑒雙向循環(huán)神經(jīng)網(wǎng)絡(bidirectional recurrent neural network,BiRNN)雙向處理序列的特點,選擇BiGRU學習XSS上下文信息。本文組合這兩種神經(jīng)網(wǎng)絡,取其優(yōu)勢,進行XSS檢測。模型中Encoder采用CNN和BiGRU并行結(jié)構(gòu)的方式,讓CNN去逐層學習XSS的更高層次特征,讓BiGRU去學習XSS序列間的信息依賴和上下文信息,結(jié)合兩者學習到的特征,完成編碼,再利用注意力機制選擇關(guān)注編碼后的特征中與XSS顯著相關(guān)的重要特征,從而更好實現(xiàn)分類。
為了有效檢測XSS、提高web網(wǎng)頁安全,本文提出了一種應用注意力機制改進Encoder-Decoder框架下的跨站腳本檢測模型,模型結(jié)構(gòu)自下而上如圖1所示,采用序列問題中常用的Encoder-Decoder框架,并運用注意力機制提取Encoder序列中與輸出顯著相關(guān)的信息。模型主要分為4個階段:Encoder階段、注意力機制階段、Decoder階段、分類預測。實驗中,樣例數(shù)據(jù)經(jīng)過數(shù)據(jù)預處理后,已經(jīng)為50×128維詞向量矩陣word embedding,因此模型不再需要使用embedding層,直接使用input層實例化神經(jīng)網(wǎng)絡的輸入,再進行后面的操作。
圖1 模型結(jié)構(gòu)
在深度學習中,常用Encoder將輸入序列編碼形成中間表示形式。本文將CNN和BiGRU并行作為Encoder,結(jié)合CNN學習到的22×128維特征和BiGRU學習到的50×128維特征,作為編碼后的72×128維中間表示特征。
2.1.1 CNN
一維卷積(Convolution1D,Conv1D)是一維卷積操作,常用于自然語言處理,它的輸入為三維數(shù)據(jù)向量,本文選擇其作為模型的卷積層。最大池化(max-pooling)能減少卷積層參數(shù)造成的估計均值誤差,本文選擇其作為模型的池化層。
模型的CNN階段包含兩個Conv1D層和一個max-pooling層。兩個Conv1D層選擇了128個卷積核為4×4的卷積操作(如式(1)所示),然后使用非線性激活函數(shù)對卷積操作的輸出結(jié)果做一次非線性映射,增強模型的非線性表達能力
(1)
常用的非線性激活函數(shù)中,relu函數(shù)(如式(2)所示)迭代速度較快,因此本文選擇其為卷積層的激活函數(shù)
(2)
經(jīng)過第一層卷積操作和非線性映射后,得到了一個特征映射,再將其作為第二個卷積層的輸入,經(jīng)過第二個卷積操作和非線性映射后,得到該層的特征映射。經(jīng)過兩層卷積后,將特征輸入到池化層進行池化操作,對經(jīng)過非線性映射的特征進行采樣處理。max-pooling層選擇值為2的池化步長,對特征映射取最大值,提取最有效的特征信息,降低特征維度。
CNN階段通過逐層卷積或者池化,學習高層次的特征,作為Encoder編碼結(jié)果的一部分。CNN學習過程如下:
步驟1 初始化卷積層的卷積核大小、卷積核數(shù)量,初始化池化層的池化步長;
步驟2 將每條樣例數(shù)據(jù)x輸入第一個卷積層;
步驟3 對其進行卷積操作,再經(jīng)過非線性激活函數(shù)relu(x)進行非線性映射,輸出47×128維的特征映射x1;
步驟4 將步驟3卷積出來的特征映射x1輸入第二個卷積層;
步驟5 以相同的方式進行卷積和非線性映射,輸出44×128維的特征映射x2;
步驟6 將步驟5輸出的特征映射x2輸入池化層;
步驟7 池化下采樣,輸出CNN訓練得到的22×128維特征。
2.1.2 BiGRU
圖2 GRU結(jié)構(gòu)
重置門rt和更新門zt均以Sigmoid函數(shù)作為激活函數(shù),zt計算前一狀態(tài)傳遞到當前狀態(tài)的信息量,如式(3)所示,其中wz為更新門zt的權(quán)值矩陣,bz為zt的偏置向量,σ(x)為Sigmoid激活函數(shù)。zt值越大,前一狀態(tài)傳遞到當前狀態(tài)的信息越多。和LSTM必須考慮上一狀態(tài)對當前狀態(tài)的影響不同,GRU通過重置門選擇是否保留上一狀態(tài)的隱藏輸出,若zt為0,則丟棄上一狀態(tài)的隱藏輸出,若為1,則保留上一狀態(tài)的隱藏輸出
zt=σ(wz·[ht-1,xt]+bz)
(3)
rt=σ(wr·[ht-1,xt]+br)
(4)
(5)
(6)
BiGRU階段通過前向GRU層學習上文與下文的關(guān)系信息,通過反向GRU層學習下文對上文的關(guān)系信息,最后得到XSS的上下文信息特征,作為Encoder編碼結(jié)果的一部分。BiGRU學習過程如下:
步驟2 將每個樣例數(shù)據(jù)x輸入BiGRU的前向?qū)樱?/p>
步驟5 將每個樣例數(shù)據(jù)x輸入BiGRU的反向?qū)樱?/p>
本文引入注意力機制[16]來學習抽取特征中與XSS相關(guān)性高的信息,提高模型的檢測性能,加快模型的收斂速度。注意力機制主要是借鑒人類的視覺系統(tǒng),讓模型忽略與XSS相關(guān)性不高甚至沒有關(guān)系的部分特征,選擇關(guān)注與XSS密切相關(guān)的部分特征,從而進行更高效的學習。本文將CNN和BiGRU同時作為注意力模型的編碼器,以GRU作為解碼器,經(jīng)過編碼器編碼以后,計算每個輸入對于當前輸出的注意力矩陣,再利用解碼器解碼,得到分類結(jié)果。注意力機制的結(jié)構(gòu)如圖3所示。
圖3 注意力機制結(jié)構(gòu)
其中xi(1≤i≤n) 表示輸入向量,hi(1≤i≤n) 表示經(jīng)過CNN階段和BiGRU階段編碼得到的隱藏輸出,Hi(1≤i≤m) 表示經(jīng)過GRU解碼得到的隱藏輸出。 F(Ht-1,h1∶t) 計算輸入數(shù)據(jù)h1∶t對當前輸出Yt的注意力分布情況(如式(7)所示),然后應用softmax函數(shù)將其轉(zhuǎn)換為對應的注意力分配權(quán)值(如式(8)所示),再與輸入加權(quán)求和(如式(9)所示),就得到了注意力矩陣,突顯出與當前輸出密切相關(guān)的特征。將注意力矩陣作為解碼器的部分輸入,從而得到當前隱藏輸出
etj=relu(tanh(wF·[Ht-1,hj]+bF))
(7)
其中,wF為注意力機制權(quán)值矩陣,bF為偏置向量,relu(x)和tanh(x)均為激活函數(shù),etj表示第j個輸入hj對第t個輸出Yt的注意力分布情況
atj=softmax(etj)
(8)
其中,atj表示第j個輸入對第t個輸出的注意力權(quán)重,softmax(x)表示激活函數(shù),使atj∈(0,1),atj趨近于0表示相關(guān)性不高,趨近1表示相關(guān)性高
(9)
其中,ct表示輸入對第t個輸出的注意力矩陣,將每個輸入和其與當前輸出的注意力權(quán)重以點乘的方式進行計算,完成對輸入序列的不同局部賦予不同的權(quán)重,得到其重要性分布。
注意力機制階段通過計算輸入數(shù)據(jù)中對每個輸出的注意力特征向量,使模型只關(guān)注與XSS顯著相關(guān)的部分信息。注意力機制學習過程如下:
步驟1 初始化注意力機制各層的神經(jīng)元個數(shù)、權(quán)值、偏置等;
步驟2 將編碼后的72×128維中間表示特征輸入注意力機制的隱藏層;
步驟3 將中間表示特征輸入到激活函數(shù)為tanh(x)的隱藏層和激活函數(shù)為relu(x)的隱藏層對應神經(jīng)元,計算獲得目標輸出Yi和每個輸入特征對應的注意力分布情況;
步驟4 再將步驟2得到的注意力分布情況輸入softmax層,歸一化處理,輸出注意力分配權(quán)重;
步驟5 最后經(jīng)過Dot層,輸出輸入特征對應目標輸出Yi的2×128維高相關(guān)性特征;
步驟6 重復步驟2到步驟5,直到計算出輸入特征對應每個目標輸出的高相關(guān)性特征。
在Encoder-Decoder框架中,Encoder對輸入數(shù)據(jù)進行編碼,得到中間語義表示向量,Decoder對中間語義表示向量和之前已經(jīng)生成的歷史信息來生成i時刻的解碼輸出。本文模型中,由于GRU具備記憶歷史信息的功能,避免了RNN的梯度消失,選擇其作為Decoder。Decoder學習過程如下:
步驟1 初始化GRU的權(quán)值、偏置、初始輸出Y0;
步驟2 將經(jīng)過注意力機制得到的每個高相關(guān)性特征輸入Decoder,得到對應的128維解碼輸出。
在經(jīng)過Encoder-Decoder框架學習后,得到了一組與XSS重要相關(guān)的特征,使用softmax分類器對其進行分類預測,得到模型預測的結(jié)果。
在訓練模型時,根據(jù)預測結(jié)果和實際標簽的誤差反向傳播,通過梯度下降算法對模型各層的權(quán)值和偏置進行更新,直至模型參數(shù)達到最優(yōu)。
實驗使用的計算機配置為:windows10操作系統(tǒng)、Intel(R) Core(TM)i7-9750H CPU @2.60 GHz 2.60 GHz、8 G 內(nèi)存,實驗環(huán)境為python3.5.2、Tensorflow1.12.0、Keras2.2.4。實驗中,使用網(wǎng)絡爬蟲從網(wǎng)站上爬取數(shù)據(jù)樣例,惡意樣例來源于XSSed數(shù)據(jù)庫,正常樣例來源于DMOZ數(shù)據(jù)庫,經(jīng)過數(shù)據(jù)預處理后,最終得到了20 000個惡意樣例和20 000個正常樣例,將其按照7∶3的比例,運用交叉驗證中的train_test_split函數(shù)隨機選取構(gòu)成訓練集和測試集,數(shù)據(jù)集分布情況見表1。
表1 數(shù)據(jù)集分布
在自然語言處理中,數(shù)據(jù)以向量的形式作為神經(jīng)網(wǎng)絡的輸入,同時XSS代碼常常以編碼混淆的方式降低代碼的可讀性,以此躲避檢測,因此對樣本數(shù)據(jù)進行預處理,轉(zhuǎn)換為神經(jīng)網(wǎng)絡輸入需要的向量形式。
(1)數(shù)值化
由于XSS代碼常用URL編碼、Unicode編碼等方式降低代碼的可讀性,本文通過解碼技術(shù)還原代碼,如%3Cscript%3Ealert%28%27Xss%20By%20Atm0n3r%27%29%3C/script%3E還原為