岳子涵,薛 質(zhì),沈興文,吳毅良
(1.上海交通大學(xué),上海 200240;2.上海市浦東新區(qū)大數(shù)據(jù)中心,上海 200240;3.廣東電網(wǎng)公司江門(mén)供電局,廣東 江門(mén) 529099)
隨著互聯(lián)網(wǎng)的不斷發(fā)展,Web 應(yīng)用逐漸廣泛應(yīng)用于人們的生活、娛樂(lè)以及工作,因此安全問(wèn)題隨之而生[1]。PHP 憑借成本低、速度快、可移植性好等優(yōu)點(diǎn),成為Web 開(kāi)發(fā)中最受歡迎的腳本語(yǔ)言之一。但是,由于攻擊面廣和攻擊技術(shù)多,PHP 語(yǔ)言存在一些安全問(wèn)題。Webshell 是一種動(dòng)態(tài)腳本形式存在的后門(mén)程序[2]。攻擊者可通過(guò)訪(fǎng)問(wèn)該程序得到命令執(zhí)行環(huán)境,進(jìn)而達(dá)到控制服務(wù)器的目的,對(duì)用戶(hù)產(chǎn)生了巨大威脅。因此,PHP Webshell 的檢測(cè)方法研究是備受學(xué)術(shù)界和業(yè)界共同關(guān)注的Web 安全研究主題之一。
傳統(tǒng)的Webshell 檢測(cè)方法主要包括靜態(tài)分析、動(dòng)態(tài)分析以及這兩種方法的有機(jī)結(jié)合[3]。基于靜態(tài)分析的檢測(cè)方法是指對(duì)攻擊者上傳的Webshell 文件通過(guò)基于規(guī)則和特征碼匹配的方式發(fā)現(xiàn)Webshell[4]。這種方法資源占用小,檢測(cè)快速方便,但存在漏檢率過(guò)高的問(wèn)題,無(wú)未知風(fēng)險(xiǎn)對(duì)抗能力[5]。動(dòng)態(tài)檢測(cè)方法是對(duì)Webshell 文件執(zhí)行時(shí)特有的HTTP 請(qǐng)求或響應(yīng)進(jìn)行檢測(cè)[6]。這種方法誤判率較高且系統(tǒng)資源和實(shí)踐消耗較大。此外,由于攻擊者利用代碼混淆隱藏技術(shù)使得Webshell 的變體層見(jiàn)疊出,傳統(tǒng)的特征提取檢測(cè)方法局限性較大[7]。可見(jiàn),研究可抵御混淆繞過(guò)技術(shù)且誤報(bào)率低的Webshell 檢測(cè)系統(tǒng)具有重要的實(shí)用價(jià)值。

圖1 Webshell 檢測(cè)模型設(shè)計(jì)
由于混淆前后的Web 惡意代碼在語(yǔ)義結(jié)構(gòu)上具有一定的相似性,因此針對(duì)PHP 文件,本文以代碼的語(yǔ)義結(jié)構(gòu)為切入點(diǎn)描述腳本,提出了基于語(yǔ)義分析的Webshell 檢測(cè)方法。該方法與當(dāng)下熱點(diǎn)研究機(jī)器學(xué)習(xí)相結(jié)合,將PHP 代碼的語(yǔ)義結(jié)構(gòu)作為文本特征,結(jié)合機(jī)器學(xué)習(xí)構(gòu)建惡意Web 代碼檢測(cè)模型。
基于語(yǔ)義分析的Webshell 檢測(cè)系統(tǒng)的訓(xùn)練流程如圖1 所示,由抽象語(yǔ)法樹(shù)提取模塊、詞向量提取模塊和機(jī)器學(xué)習(xí)模塊3 部分組成。本系統(tǒng)的輸入為PHP 文件的源代碼。首先,提取輸入樣本的抽象語(yǔ)法樹(shù),并保存為文本文件。其次,對(duì)其進(jìn)行預(yù)處理,使用Word2vec 算法提取行為特征,生成對(duì)應(yīng)的詞向量。最后,將其輸入到機(jī)器學(xué)習(xí)模型中,分析并判斷是否為Webshell。
抽象語(yǔ)法樹(shù)(Abstract,Syntax Tree,AST)是程序語(yǔ)言源代碼經(jīng)過(guò)詞法分析和語(yǔ)法分析后獲得的樹(shù)狀解析表示[8]。樹(shù)的每個(gè)節(jié)點(diǎn)表示源代碼中的一個(gè)結(jié)構(gòu)。AST 一般為編譯器語(yǔ)法分析階段的產(chǎn)物,只提供主要結(jié)構(gòu)。與直接使用源代碼相比,使用AST 進(jìn)行處理的主要優(yōu)點(diǎn)是AST 是對(duì)代碼分段后的結(jié)果的總結(jié)[9]。樹(shù)結(jié)構(gòu)反映了代碼的實(shí)際執(zhí)行順序,操作符周?chē)闹碉@示在每棵樹(shù)的相應(yīng)參數(shù)中。通過(guò)將PHP 代碼轉(zhuǎn)化為AST 后執(zhí)行字向量轉(zhuǎn)換,基于底層代碼的特征集合,避免了技術(shù)干擾方法的影響,實(shí)現(xiàn)了對(duì)未知Webshell 的檢測(cè)。
PHP 源代碼通過(guò)圖1 中AST 提取模塊所示過(guò)程轉(zhuǎn)換為抽象語(yǔ)法樹(shù)。本文主要通過(guò)PHP-Parser將PHP 源代碼轉(zhuǎn)化為抽象語(yǔ)法樹(shù)。PHP-Parser 是一個(gè)由PHP 編寫(xiě)的PHP 代碼靜態(tài)分析工具,可以生成指定PHP 源代碼相對(duì)應(yīng)的AST。它首先會(huì)列出所有的全局變量,其次根據(jù)代碼的執(zhí)行順序拆分函數(shù)名和參數(shù)值,最后生成如圖2 所示的AST。一個(gè)語(yǔ)句對(duì)應(yīng)一個(gè)數(shù)組,數(shù)組的名字即為被調(diào)用的函數(shù)。數(shù)組中按順序存放函數(shù)類(lèi)型和函數(shù)值。

圖2 一句話(huà)木馬及其抽象語(yǔ)法樹(shù)示例
Word2vec 是2013 年谷歌團(tuán)隊(duì)推出的一款開(kāi)源詞向量特征訓(xùn)練工具[10-11]。它使用向量運(yùn)算代替文本內(nèi)容處理,通過(guò)向量化文本中的單詞,用向量空間的距離表示每個(gè)詞之間的距離。距離越近,則出現(xiàn)在一定相鄰范圍中的概率越大。因此,文本語(yǔ)義上的相似度可通過(guò)向量空間的相似度表示。Word2vec 一般分為連續(xù)詞袋模型(Continuous Bagof-Words,CBOW)和跳字模型(Skip-Gram)兩種模型。它們的區(qū)別在于CBOW 根據(jù)某一特征詞的上下文相關(guān)詞預(yù)測(cè)該詞的概率,Skip-Gram 則是基于某一特征詞預(yù)測(cè)其上下文相關(guān)詞的概率。由于該場(chǎng)景的樣本中,各單詞出現(xiàn)的頻率隨機(jī)分布于幾十到上萬(wàn)之間,差異較大,故選擇可較好處理低頻元素的Skip-Gram 詞向量訓(xùn)練模型,以得到更高的準(zhǔn)確率。
對(duì)于生成的AST,使用Python 腳本處理得到格式化的文本序列(如圖3 所示)作為模型的原始輸入,便于特征提取。然后,對(duì)所有樣本的文本序列進(jìn)行分詞,構(gòu)成用于訓(xùn)練詞向量的數(shù)據(jù)集,使用Word2vec 生成每個(gè)單詞的詞向量。對(duì)于每一個(gè)抽象語(yǔ)法樹(shù)樣本,對(duì)其包含的所有單詞的詞向量計(jì)算算術(shù)平均值得到該文本的向量。

圖3 格式化文本序列
將Word2vec 算法生成的文本詞向量作為基于機(jī)器學(xué)習(xí)的Webshell 檢測(cè)模型的輸入。本文共選取隨機(jī)森林、XGBoost 和SVM 這3 種機(jī)器學(xué)習(xí)算法進(jìn)行訓(xùn)練。
1.3.1 隨機(jī)森林
隨機(jī)森林算法是機(jī)器學(xué)習(xí)算法中常見(jiàn)的一種決策樹(shù)算法,利用多棵決策樹(shù),通過(guò)投票機(jī)制對(duì)樣本進(jìn)行訓(xùn)練和預(yù)測(cè)[12]。每棵樹(shù)有放回地隨機(jī)抽取訓(xùn)練樣本,隨機(jī)選取特征作為分枝依據(jù),使得每個(gè)子決策樹(shù)得到一個(gè)判斷結(jié)果[13]。經(jīng)由所有子決策樹(shù),根據(jù)其判斷進(jìn)行表決,得到隨機(jī)森林的判定結(jié)果。由于是有放回地抽取樣本且隨機(jī)選擇特征,它可以有效避免可能出現(xiàn)的過(guò)擬合現(xiàn)象。
1.3.2 XGBoost
XGBoost 是一種高效、可擴(kuò)展的梯度增強(qiáng)框架實(shí)現(xiàn)[14],是一種集成學(xué)習(xí)。集成學(xué)習(xí)的目的是通過(guò)結(jié)合多個(gè)基學(xué)習(xí)器的預(yù)測(cè)結(jié)果[15],提高單個(gè)學(xué)習(xí)器的泛化能力和魯棒性。XGBoost 以CART 樹(shù)中的回歸樹(shù)作為基分類(lèi)器,但不是簡(jiǎn)單地將幾個(gè)CART 樹(shù)進(jìn)行組合。它將模型上次預(yù)測(cè)產(chǎn)生的誤差作為參考進(jìn)行下一顆樹(shù)的建立,從而不斷降低損失函數(shù)[16]。作為梯度增強(qiáng)回歸算法的改進(jìn)優(yōu)化,XGBoost 算法是Tree Model 的一個(gè)特例[17]。
1.3.3 SVM
支持向量機(jī)(Support Vector Machines,SVM)是一種判別分類(lèi)器算法,通過(guò)定義兩個(gè)類(lèi)之間的超平面,可以以最佳效果將所有樣本分為兩個(gè)不同類(lèi)別的點(diǎn)[18],同時(shí)使得類(lèi)間所有點(diǎn)的相對(duì)分離距離最大。支持向量機(jī)算法通過(guò)尋找最優(yōu)解來(lái)尋找最優(yōu)超平面參數(shù)。公差邊界越大,錯(cuò)誤分類(lèi)點(diǎn)的個(gè)數(shù)越接近邊界。但是,大多數(shù)其他數(shù)據(jù)點(diǎn)的距離會(huì)增加,懲罰系數(shù)會(huì)減小,以提高整體驗(yàn)證樣本的準(zhǔn)確性。
本文的PHP 訓(xùn)練樣本集大小為24389。其中:正常樣本22400 個(gè),主要來(lái)源于PHP 開(kāi)源內(nèi)容管理系統(tǒng)(Content Management System,CMS),如wordpress、phpcms 以及yii;收集異常樣本1989 個(gè),主要來(lái)源于github 上公開(kāi)的數(shù)據(jù)。在實(shí)際的生產(chǎn)環(huán)境中,正常PHP 文件的數(shù)量遠(yuǎn)遠(yuǎn)大于惡意webshell文件的數(shù)量。因此,將正樣本和負(fù)樣本的比例大約設(shè)置為10:1,增加白樣本的數(shù)量,以使模型對(duì)實(shí)際環(huán)境更具適應(yīng)性,從而增強(qiáng)模型的魯棒性和適應(yīng)性。
實(shí)驗(yàn)環(huán)境的軟硬件配置信息如表1 所示。在PHP 編譯環(huán)境中,將PHP 代碼轉(zhuǎn)換成抽象語(yǔ)法樹(shù),之后的詞向量提取、模型訓(xùn)練與檢測(cè)均基于Python語(yǔ)言。詞向量訓(xùn)練使用Genism 庫(kù),機(jī)器學(xué)習(xí)部分則采用sklearn(scikit-learn)實(shí)現(xiàn)。

表1 實(shí)驗(yàn)配置環(huán)境
本次實(shí)驗(yàn)為二分類(lèi)問(wèn)題,實(shí)驗(yàn)結(jié)果可分為以下4 類(lèi)。
(1)真正例(True Positive,TP):真實(shí)值為正常樣本,預(yù)測(cè)值為正常樣本。
(2)假負(fù)例(False Negative,F(xiàn)N):真實(shí)值為正常樣本,預(yù)測(cè)值為Webshell 樣本。
(3)假正例(False Positive,F(xiàn)P):真實(shí)值為Webshell 樣本,預(yù)測(cè)值為正常樣本。
(4)真負(fù)例(True Negative,TN):真實(shí)值為Webshell 樣本,預(yù)測(cè)值為Webshell 樣本。
本次實(shí)驗(yàn)采用十折交叉驗(yàn)證評(píng)估模型,評(píng)估指標(biāo)采用精確率P、召回率R和準(zhǔn)確率ACC,計(jì)算公式如下:

本次實(shí)驗(yàn)流程如圖4 所示。

圖4 實(shí)驗(yàn)流程
使用Word2vec 將AST 文本序列轉(zhuǎn)化為數(shù)字向量作為輸入數(shù)據(jù),在輸入相同訓(xùn)練特征的情況下,實(shí)驗(yàn)對(duì)比了XGBoost、隨機(jī)森林、SVM 這3 種算法的準(zhǔn)確率、精確率與召回率,結(jié)果如表2 所示。

表2 Webshell 檢測(cè)模型實(shí)驗(yàn)結(jié)果
結(jié)果表明,基于A(yíng)ST 的檢測(cè)方法準(zhǔn)確率可達(dá)98.82%,此外具有較高的精確率與召回率。此次實(shí)驗(yàn)中,XGBoost 模型各項(xiàng)指標(biāo)均優(yōu)于其他算法,因此選擇基于XGBoost 算法的模型進(jìn)行PHP Webshell檢測(cè)。XGBoost 模型的參數(shù)設(shè)置如下:maxdepth=8,min-child-weight=1,learning-rate=0.1,n-estimators=1000,gamma=0。
此外,表3 顯示了本文模型與PHP Webshell 檢測(cè)相關(guān)工作的對(duì)比結(jié)果。由對(duì)比結(jié)果可得,本文模型在準(zhǔn)確率、精確率和召回率等多個(gè)方面均有所提升。

表3 相關(guān)算法性能比較
為了更好地解決當(dāng)前Webshell 檢測(cè)中混淆惡意代碼的檢測(cè)問(wèn)題,本文提出了一種基于語(yǔ)義分析的Webshell 檢測(cè)系統(tǒng)。從PHP 文件的源代碼中提取AST,使用Word2vec 將詞法序列轉(zhuǎn)換為詞向量作為機(jī)器學(xué)習(xí)模型的最終輸入,并對(duì)不同的機(jī)器學(xué)習(xí)算法進(jìn)行驗(yàn)證,最終選擇了性能最好、準(zhǔn)確率最高的XGBoost 算法。在以后的計(jì)劃中,將嘗試同樣的方法對(duì)JSP 文件進(jìn)行檢測(cè),并嘗試引入動(dòng)態(tài)流量特征信息,結(jié)合兩者檢測(cè)方法來(lái)降低誤報(bào)率,以開(kāi)發(fā)一個(gè)基于機(jī)器學(xué)習(xí)和深度學(xué)習(xí)的全面入侵檢測(cè)系統(tǒng),從而有效保護(hù)網(wǎng)絡(luò)。