孫寶丹,王培超,周 鋆
1(國防科技大學(xué) 信息系統(tǒng)工程重點(diǎn)實(shí)驗(yàn)室,長沙 410072)2(中國人民解放軍31104部隊(duì),南京 210018)
XSS(Cross-Site Scripting)全稱跨站腳本,是一種常見的Web應(yīng)用漏洞.XSS攻擊屬于用于客戶端的被動(dòng)式攻擊方式,所以危害性容易被忽視.攻擊者在Web頁面里插入惡意腳本代碼,當(dāng)用戶瀏覽該頁時(shí),嵌入Web頁面里的惡意腳本代碼就會(huì)被執(zhí)行,從而達(dá)到惡意攻擊用戶的目的[13].XSS漏洞可以分為三類:Stored XSS漏洞、Non-persistent XSS漏洞以及DOM-Based XSS漏洞[13].XSS漏洞會(huì)給企業(yè)帶來巨大的經(jīng)濟(jì)損失,利用XSS攻擊,攻擊者可以獲取用戶隱私、盜取用戶身份Cookie、劫持用戶的瀏覽器等,會(huì)給用戶帶來嚴(yán)重的生活困擾.目前雖然已經(jīng)有一些檢測XSS攻擊的方法,但是這些方法的效果有限.因此,如何高效檢測XSS攻擊仍然是一個(gè)需要深入研究的問題,本文將機(jī)器學(xué)習(xí)方法與XSS攻擊檢測相結(jié)合,實(shí)現(xiàn)了對XSS攻擊的有效檢測.
利用機(jī)器學(xué)習(xí)方法進(jìn)行XSS檢測目前已有一定的應(yīng)用,其中包括:Gupta MK[1]等人將XSS漏洞檢測轉(zhuǎn)換為基于預(yù)測模型的分類問題,并提出了一種基于文本挖掘和模式匹配的新方法;Khan Nayeem[2]等提出了一種將一組有監(jiān)督和無監(jiān)督分類器作為在客戶端使用的攔截器來檢測惡意腳本的方法;Sunder NS[3]等提出了一種先進(jìn)的XSS預(yù)測方法,引入新的評分系統(tǒng)對瀏覽器中的內(nèi)容確定特權(quán)級別和漏洞級別,同時(shí)使用機(jī)器學(xué)習(xí)算法存儲(chǔ),分類和分析在瀏覽器中運(yùn)行的Java腳本.
GuoXiaobing[4]等利用機(jī)器學(xué)習(xí)算法構(gòu)建了優(yōu)化模型,減小了攻擊媒體庫的大小,提高了XSS漏洞檢測的效率;RathoreShailendra[5]等人用多種分類器區(qū)分網(wǎng)頁是否受到XSS攻擊;Angelo Eduardo Nunan[6]提出了從Web文檔內(nèi)容和URL中提取特征,并使用機(jī)器學(xué)習(xí)技術(shù)在網(wǎng)頁上進(jìn)行XSS自動(dòng)分類;Xi Xiao[7]等介紹了一種對基于編碼的注入攻擊進(jìn)行檢測的方法,該攻擊方式比一般注入攻擊更加隱蔽,其中的JavaScript代碼以人類不可讀的形式編碼,文中使用機(jī)器學(xué)習(xí)的分類算法來確定應(yīng)用程序是否遭受代碼注入攻擊.貝葉斯網(wǎng)絡(luò)作為一種解釋性很強(qiáng)的機(jī)器學(xué)習(xí)模型,也可以很好應(yīng)用到XSS檢測中,目前有Zhou Yun[8]等使用集成貝葉斯網(wǎng)絡(luò)的方法進(jìn)行XSS攻擊檢測,但在模型結(jié)構(gòu)獲取時(shí)采用的是傳統(tǒng)的貝葉斯網(wǎng)絡(luò)結(jié)構(gòu)學(xué)習(xí)算法.
本文中使用的NO TEARS算法[9]區(qū)別于以往的貝葉斯網(wǎng)絡(luò)學(xué)習(xí)算法,不需要深入了解圖論的相關(guān)知識,將本來復(fù)雜的結(jié)構(gòu)學(xué)習(xí)算法轉(zhuǎn)化為較為容易求解的數(shù)值優(yōu)化問題.與基于局部啟發(fā)式的結(jié)構(gòu)學(xué)習(xí)算法不同,NO TEARS能夠找到全局最優(yōu)的有向無環(huán)圖結(jié)構(gòu),利用更優(yōu)的模型對XSS攻擊進(jìn)行檢測,從而可以在檢測中達(dá)到更高的準(zhǔn)確率.算法中主要通過定義一個(gè)新的無環(huán)性的描述方法,將非凸組合約束項(xiàng)轉(zhuǎn)化為容易求解梯度值的平滑函數(shù),只涉及一些基本的矩陣運(yùn)算,求解容易,工程化難度較低.
本文利用NO TEARS算法獲取的貝葉斯網(wǎng)絡(luò)作為分類器,對XSS攻擊載荷(Payload)進(jìn)行檢測,其主要貢獻(xiàn)有:1)將NO TEARS算法應(yīng)用到XSS攻擊檢測領(lǐng)域,驗(yàn)證了NO TEARS算法在實(shí)際應(yīng)用過程中的有效性;2)使用機(jī)器學(xué)習(xí)方法實(shí)現(xiàn)了對XSS攻擊進(jìn)行自動(dòng)檢測;3)本文中設(shè)計(jì)算法模型與其他模型相比取得了較高的準(zhǔn)確率.
本文的創(chuàng)新點(diǎn)主要如下:1)本文使用的結(jié)構(gòu)學(xué)習(xí)算法能夠?qū)ふ胰肿顑?yōu)的貝葉斯網(wǎng)絡(luò)結(jié)構(gòu);2)首次將這種算法應(yīng)用到網(wǎng)絡(luò)安全領(lǐng)域關(guān)注的重要問題—XSS攻擊檢測,并取得很好的實(shí)驗(yàn)結(jié)果,具有一定的參考及應(yīng)用價(jià)值.
要將NO TEARS算法應(yīng)用到XSS檢測中,首先要獲取XSS攻擊的特征,這里涉及對XSS攻擊載荷的特征提取[8].根據(jù)XSS攻擊的特點(diǎn),本文從以下幾個(gè)方面選取特征:1)輸入長度;2)XSS攻擊載荷常見的敏感關(guān)鍵詞和敏感字符;3)跳轉(zhuǎn)鏈接對應(yīng)的協(xié)議(protocol)出現(xiàn)的次數(shù).經(jīng)過篩選,本文將一條記錄用30個(gè)特征進(jìn)行表示,這些特征從1開始編號到30,同時(shí)節(jié)點(diǎn)31代表標(biāo)簽,表示當(dāng)前記錄是否為XSS攻擊,具體特征如表1所示.
表1 XSS攻擊特征Table 1 Features of XSS attack
攻擊特征獲取之后,便可以建模對XSS攻擊進(jìn)行檢測,如圖1所示.這里在將數(shù)據(jù)輸入到分類器之前,首先要對數(shù)據(jù)進(jìn)行預(yù)處理.攻擊者對用戶發(fā)動(dòng)XSS攻擊時(shí),會(huì)將XSS payload進(jìn)行隱藏,諸如使用大小寫變換或編碼轉(zhuǎn)換等,因此需要對數(shù)據(jù)進(jìn)行相關(guān)解碼,解碼依照如下順序:變小寫、URL解碼、HTML解碼、JavaScript解碼、Unicode解碼、URL二次解碼.數(shù)據(jù)完成解碼之后,對于每一條記錄,可以獲取相應(yīng)特征的值,特征已經(jīng)在上一節(jié)列出.最后把處理后的數(shù)據(jù)輸入到貝葉斯網(wǎng)絡(luò)結(jié)構(gòu)學(xué)習(xí)算法中,通過結(jié)構(gòu)學(xué)習(xí)獲取更優(yōu)的貝葉斯網(wǎng)絡(luò)模型,并基于此對樣本進(jìn)行檢測,輸出相應(yīng)的分類標(biāo)簽.
前文提到過,有向無環(huán)圖的結(jié)構(gòu)學(xué)習(xí)是一個(gè)NP難的問題,現(xiàn)有的結(jié)構(gòu)學(xué)習(xí)算法都不能有效實(shí)現(xiàn)無環(huán)約束.這是由于無環(huán)約束是組合約束,同時(shí)它的計(jì)算規(guī)模隨節(jié)點(diǎn)數(shù)呈超指數(shù)增加.另外,即便能夠得到相對滿足約束條件的有向無環(huán)圖,它也不一定適合一般目的的優(yōu)化.目前的結(jié)構(gòu)學(xué)習(xí)算法依賴于不同的局部啟發(fā)式算法,這種方法雖然能夠降低計(jì)算規(guī)模,但是不能得到全局最優(yōu)的結(jié)構(gòu).現(xiàn)有的算法大致有分支-切割法、動(dòng)態(tài)規(guī)劃法、A*搜索法、貪心算法、坐標(biāo)下降法等[10].與這些算法不同,本文應(yīng)用的算法采用完全不同的求解方法,將原本的結(jié)構(gòu)優(yōu)化問題,轉(zhuǎn)化成數(shù)學(xué)優(yōu)化問題進(jìn)行求解.值得注意的是,這里得到的解是針對當(dāng)前數(shù)據(jù)得到的全局最優(yōu)的貝葉斯網(wǎng)絡(luò)結(jié)構(gòu),相比傳統(tǒng)啟發(fā)式算法有了很大的提升.同時(shí)這里使用的算法不要求研究人員具有很深的圖論基礎(chǔ),從而具有廣泛的研究和應(yīng)用價(jià)值.
圖1 XSS檢測過程Fig.1 Process of XSS attack detection
本文中使用的算法是一種新的描述貝葉斯網(wǎng)絡(luò)的方法,通過求解一個(gè)帶有平滑約束的優(yōu)化問題,從而找到最優(yōu)的有向無環(huán)圖.具體地,對于任意給定數(shù)據(jù)集W=(wij)∈d×d,令A(yù)(W)∈{0,1}d×d是一個(gè)表示有向圖的二元鄰接矩陣,那么有如下描述:[A(W)]ij=1?wij≠0,反之則相反.同時(shí)D?{0,1}d×d表示二元矩陣B的子集,其中B是無環(huán)圖的鄰接矩陣,那么貝葉斯結(jié)構(gòu)優(yōu)化問題轉(zhuǎn)換成如下的非凸形式:
(1)
其中Q是與數(shù)據(jù)有關(guān)的損失函數(shù),X∈n×d是數(shù)據(jù)矩陣,h是一個(gè)平滑函數(shù),h:d×d→只有當(dāng)A(W)∈D時(shí),h(W)=0.那么上述基于圖論表示的貝葉斯網(wǎng)絡(luò)的結(jié)構(gòu),就轉(zhuǎn)化成這樣一個(gè)非凸優(yōu)化的問題,可以根據(jù)數(shù)學(xué)優(yōu)化的工具進(jìn)行求解.但是在正式求解前,需要將上式中的無環(huán)約束進(jìn)行進(jìn)一步的刻畫,用數(shù)學(xué)方法表示出來,才能便于后續(xù)優(yōu)化問題的求解.
這一部分主要介紹一種新的無環(huán)約束的表示方法,這里使用了矩陣指數(shù)的概念,便于后續(xù)優(yōu)化問題的求解.矩陣指數(shù)是所有方塊陣都能定義的一類函數(shù),類似于指數(shù)函數(shù).在表示方法上將指數(shù)函數(shù)的變量用方塊矩陣代替,具體定義方式如下:
(2)
值得注意的是這里,B為n×n的實(shí)數(shù)或復(fù)數(shù)矩陣,那么就有這樣的定理:
定義1.當(dāng)且僅當(dāng)trexp(B)=d時(shí),B∈{0,1}d×d是有向無環(huán)圖的鄰接矩陣.
證明:當(dāng)且僅當(dāng)(Bk)ii=0對所有的k≥1和所有i都成立時(shí),B表示在有向圖中不存在環(huán)路,那么就有:
(3)
鑒于上述定理中使用的方塊矩陣B,且B同時(shí)也是個(gè)二元矩陣,不能普遍適用于一般數(shù)據(jù),因此接下來應(yīng)該找到一種可以將B替換成任意權(quán)重矩陣W的方法,這里使用的是矩陣的Hadamard乘積,定義為:
(4)
其中A,B∈m×n且A={aij},B={bij},均為m×n的矩陣.經(jīng)過如上的變換,對于給定任意權(quán)重矩陣W∈d×d,無環(huán)約束就可以表示為:
h(W)=trexp(W°W)-d=0
(5)
h(W)的梯度值為:
h(W)=[exp(W°W)]T°2W
(6)
之前已經(jīng)給出過貝葉斯網(wǎng)絡(luò)的數(shù)學(xué)表達(dá)方式,并對其中的無環(huán)約束進(jìn)行了數(shù)學(xué)變換,得到最終需要進(jìn)行優(yōu)化的數(shù)學(xué)表達(dá)式:
(7)
這里引入了一個(gè)二次懲罰項(xiàng)ρ>0表示懲罰違反約束h(W)=0,那么上式就可以使用增廣拉格朗日法進(jìn)行求解,帶有對偶變量α的增廣拉格朗日方法可以寫作:
(8)
它的對偶形式為:
(9)
(10)
(11)
這里的步長ρ的大小是比較增廣問題和初始約束問題得來的,這兩個(gè)表達(dá)式的梯度分別如下所示:
▽Q(W;X)+[α+ρh(W)]▽h(W)=0
(12)
▽Q(W;X)+α▽h(W)=0
(13)
根據(jù)上述無約束優(yōu)化問題的求解過程,最終可以得到本文中使用的新的貝葉斯網(wǎng)絡(luò)結(jié)構(gòu)學(xué)習(xí)算法的總體流程如表2所示.需要注意的是在上文指出了對于無環(huán)約束的表示方法為h(W)=0,但在算法中設(shè)置的優(yōu)化準(zhǔn)確率ε>0,且是一個(gè)非常接近于0的值.這樣帶來一個(gè)問題,雖然最終的結(jié)果是一個(gè)非常接近有向無環(huán)圖的網(wǎng)絡(luò),但仍然無法保證得到的是滿足約束條件的有向無環(huán)圖.因此這里引入一個(gè)后處理的過程:定義B(ω)=I(W>ω),且找到滿足定義的最小閾值ω*>0,就能夠得到有向無環(huán)圖,這里I(·)是指示函數(shù).
表2 增廣拉格朗日方法Table 2 Augmented lagrangian algorithm
XSS Payload 的訓(xùn)練集從GitHub 上獲取而來,其具有151658 條記錄,包含16151 條黑樣本(XSS Payload)和135507條正常URL[8].測試集包含了從GitHub和各大安全博客論壇上收集的Payload,共有10000條記錄,包含6503條正常樣本和3497條黑樣本.實(shí)驗(yàn)中使用Python集成環(huán)境Anaconda3,Python版本為3.6,同時(shí)應(yīng)用NO TEARS相應(yīng)的Python算法包.為了驗(yàn)證本文中使用的結(jié)構(gòu)學(xué)習(xí)算法的效果,這里設(shè)置對比實(shí)驗(yàn),即將本文中使用的算法與目前效果較好的基于局部搜索和評分函數(shù)的結(jié)構(gòu)學(xué)習(xí)算法(Tabu Search)[11]、Greedy Hill Climbing[12]算法使用相同的訓(xùn)練集和測試集進(jìn)行實(shí)驗(yàn),并比較它們分類的準(zhǔn)確性.本文設(shè)置的另一組對比實(shí)驗(yàn)為:將本文使用的NO TEARS算法與現(xiàn)有的其他分類算法—樸素貝葉斯分類器(Na?ve Bayes,NB)、邏輯回歸(Logistics Regression,LR)、決策樹(Decision Tree,DT)和隨機(jī)森林(Random Forest,RF)算法——進(jìn)行比較.兩組實(shí)驗(yàn)均設(shè)定訓(xùn)練樣本數(shù)取訓(xùn)練集中數(shù)據(jù)的55%、60%、65%、70%,并取上述不同分類算法的準(zhǔn)確率.
從表3中可以看出,本文中使用的NO TEARS算法的準(zhǔn)確率普遍在98.35%以上,比Tabu Search和Greedy Hill Climbing算法都要高,這是因?yàn)镹O TEARS算法求解出來的是貝葉斯網(wǎng)絡(luò)的全局最優(yōu)結(jié)構(gòu),因此分類的結(jié)果更加準(zhǔn)確.隨著表格中訓(xùn)練樣本數(shù)的增加,算法的分類準(zhǔn)確率也在不斷增大,當(dāng)樣本數(shù)達(dá)到訓(xùn)練集的70%時(shí),即使用105461條數(shù)據(jù)進(jìn)行訓(xùn)練時(shí),準(zhǔn)確率可以達(dá)到98.56%,遠(yuǎn)超傳統(tǒng)的結(jié)構(gòu)學(xué)習(xí)算法,顯示出了優(yōu)越的性能.
表3 不同貝葉斯結(jié)構(gòu)學(xué)習(xí)算法的準(zhǔn)確率比較Table 3 Accuracy of different BN structure learning algorithms
本文中采用的NO TEARS算法與傳統(tǒng)的基于評分和局部搜索的算法不同,是一個(gè)能夠找到全局最優(yōu)解的算法.基于評分和局部搜索的貝葉斯網(wǎng)絡(luò)結(jié)構(gòu)學(xué)習(xí)算法,雖然能夠有效減少解空間的規(guī)模,但是并不能保證找到全局最優(yōu)的網(wǎng)絡(luò)結(jié)構(gòu).而NO TEARS算法能夠找到全局最優(yōu)的網(wǎng)絡(luò)結(jié)構(gòu),構(gòu)建的貝葉斯網(wǎng)絡(luò)分類器結(jié)構(gòu)更優(yōu),其準(zhǔn)確率故而要高于一般的結(jié)構(gòu)學(xué)習(xí)算法.
表4 不同分類器算法的準(zhǔn)確率比較Table 4 Accuracy of different classifier algorithms
從表4中可以看出,本文中使用的NO TEARS算法的效果均優(yōu)于表中其他算法.同時(shí),邏輯回歸在這些算法中分類準(zhǔn)確率最低,在70%左右,而其余算法的準(zhǔn)確率均在95%以上,分類效果相對其他算法較差.
網(wǎng)絡(luò)空間安全如今日益受到關(guān)注,Web安全是其中的重要方面,本文選擇應(yīng)用層常見漏洞XSS,引入了機(jī)器學(xué)習(xí)中的貝葉斯網(wǎng)絡(luò)的結(jié)構(gòu)學(xué)習(xí)算法,用于檢測XSS攻擊載荷是否存在.貝葉斯網(wǎng)絡(luò)目前在多領(lǐng)域均具有廣泛應(yīng)用,其結(jié)構(gòu)學(xué)習(xí)算法較為復(fù)雜,是一個(gè)NP難的問題.盡管目前在貝葉斯網(wǎng)絡(luò)的結(jié)構(gòu)學(xué)習(xí)方面取得了進(jìn)步,其仍然受到多方面條件的制約.本文中使用的NO TEARS算法,不同于一般的結(jié)構(gòu)學(xué)習(xí)算法,能夠找到全局最優(yōu)的結(jié)構(gòu),因此大大增加了分類準(zhǔn)確率.本文首先介紹了對XSS攻擊及其類別,然后介紹了機(jī)器學(xué)習(xí)和貝葉斯網(wǎng)絡(luò)在XSS檢測領(lǐng)域的相關(guān)研究以及文中使用的NO TEARS算法.接著,本文給出了XSS檢測問題的描述,在將原始數(shù)據(jù)輸入到分類器之前,首先要對數(shù)據(jù)進(jìn)行預(yù)處理,文中對數(shù)據(jù)共進(jìn)行5種預(yù)處理方式,將處理之后的數(shù)據(jù)依據(jù)特征進(jìn)行相應(yīng)值的提取并將提取值輸入算法,經(jīng)過算法學(xué)習(xí)之后就可以得到用于判斷的分類器.然后本文具體描述了使用的全局優(yōu)化算法,給出了其原理、公式以及算法流程.最后本文對使用的算法進(jìn)行了實(shí)驗(yàn),實(shí)驗(yàn)結(jié)果表明利用傳統(tǒng)貝葉斯結(jié)構(gòu)學(xué)習(xí)算法得到的網(wǎng)絡(luò)進(jìn)行分類最高可達(dá)97.63%的準(zhǔn)確率,而NO TEARS算法能夠達(dá)到98.56%的準(zhǔn)確率,優(yōu)于傳統(tǒng)的結(jié)構(gòu)學(xué)習(xí)算法和其他經(jīng)典分類算法,更加有效地實(shí)現(xiàn)了對于XSS攻擊載荷的檢測.