傅建明,黎 琳,王應(yīng)軍
(1.武漢大學(xué) 國家網(wǎng)絡(luò)安全學(xué)院 湖北 武漢 430072;2.武漢大學(xué) 空天信息安全與可信計算教育部重點(diǎn)實(shí)驗(yàn)室 湖北 武漢 430072)
Web服務(wù)是企業(yè)對外服務(wù)的接口,因其后臺企業(yè)數(shù)據(jù)和消費(fèi)者數(shù)據(jù)的巨大價值,吸引了大量的攻擊者.根據(jù)Internet Live Status 2018年1月的數(shù)據(jù)[1],全球每天大概有100 618個網(wǎng)站被攻擊.并且根據(jù)《2018年全球風(fēng)險報告》[2],網(wǎng)絡(luò)攻擊的次數(shù)正在逐步增多,僅2016年就有3.75億個新型惡意軟件和木馬程序出現(xiàn)在被攻破的Web服務(wù)器上.為了便于攻擊者對破襲后的Web服務(wù)器進(jìn)行長期的控守,攻擊者會上傳一個遠(yuǎn)程訪問工具到Web服務(wù)器,該Web服務(wù)器上的遠(yuǎn)程訪問控制工具俗稱為Webshell.
Webshell本質(zhì)上是一個采用ASP、JSP或PHP編寫的腳本程序文件,駐留在Web服務(wù)器的公開訪問目錄中,攻擊者利用瀏覽器或者定制的客戶端軟件可以對其直接訪問.Webshell提供了對各種關(guān)鍵功能的遠(yuǎn)程訪問,例如執(zhí)行任意命令、遍歷文件目錄、查看和修改任意文件、提升訪問權(quán)限、發(fā)送垃圾郵件和釣魚郵件[3].2018年5月的統(tǒng)計數(shù)據(jù)[4]指出,PHP在網(wǎng)站服務(wù)器編程語言中占據(jù)了83.4%;同時,已有的研究主要關(guān)注PHP編寫的Webshell.因此,本文只關(guān)注PHP Webshell,如China Chopper、WSO、C99和B374K等[5-6].當(dāng)然,其檢測方法也可以推廣到其他腳本的Webshell.
學(xué)術(shù)界和安全公司都研究檢測Webshell的方法,包括Webshell日志的檢測[7]、Webshell流量的檢測[8-9]、Webshell文件的檢測[10-12].從網(wǎng)頁訪問的日志中容易檢測Webshell,這歸因于訪問Webshell的IP比較單一、訪問次數(shù)少、Webshell網(wǎng)頁比較孤立,這是一種攻擊事后溯源的方式.利用啟發(fā)式規(guī)則或者統(tǒng)計模型從網(wǎng)絡(luò)流量中檢出Webshell流量一直是安全界和企業(yè)界常用的方式,Webshell的正則表達(dá)式大量用于Web服務(wù)器邊界的WAF(web application firewall)中,但正則表達(dá)式容易被混淆繞過[13],且只能檢測已知的Webshell.而Webshell的統(tǒng)計模型一般采用人工構(gòu)建的特征作為輸入?yún)?shù),這些特征一旦被攻擊者感知到,則攻擊者可以繞過這種模型[14].
Webshell是一種惡意代碼,傳統(tǒng)基于特征值匹配的惡意代碼檢測方法同樣適應(yīng)于Webshell文件的檢測[10-12],其優(yōu)點(diǎn)是檢測速度快、檢測精準(zhǔn),但變形和混淆會引發(fā)漏報,且對未知的Webshell缺乏感知能力.同時,傳統(tǒng)機(jī)器學(xué)習(xí)模型檢測Webshell文件也需要人工構(gòu)建的特征作為輸入?yún)?shù),而攻擊者可構(gòu)造繞過模型的Webshell文件.但是,Webshell文件檢測非常重要,入侵檢測系統(tǒng)在Web服務(wù)的邊界捕獲到可疑文件,需要快速得到檢測結(jié)果;同時,攻擊者在上傳Webshell到Web服務(wù)器之前,也會測試該Webshell是否能被安全工具和各種公開的Webshell沙箱檢出.
Webshell是由腳本語言編寫的一種語言文本.因此,可以采用自然語言的語言模型例如N-gram模型、馬爾可夫模型處理Webshell,把Webshell看作是不同語言符號構(gòu)建的、有特殊含義的文本.為了對抗混淆和加密,本文把Webshell轉(zhuǎn)換為腳本編譯后的操作碼(operation code,opcode),從而把Webshell文件的檢測轉(zhuǎn)化為Webshell opcode序列的檢測.與此同時,深度學(xué)習(xí)已經(jīng)廣泛應(yīng)用于圖像識別、聲音識別、自然語言處理中[15-18].本文引入深度學(xué)習(xí),用以對抗傳統(tǒng)機(jī)器學(xué)習(xí)中Webshell的繞過人工特征,同時也希望深度學(xué)習(xí)模型可以記憶混淆操作和加密操作,從而提高檢測的泛化能力.
本文關(guān)注Webshell文件檢測,提出了基于詞匯表模型和深度學(xué)習(xí)算法卷積神經(jīng)網(wǎng)絡(luò)(convolutional neural network,CNN)的檢測方法,具體工作包括3個方面:
a) 為了降低Webshell混淆和加密操作對檢測的干擾,將對文件的檢測轉(zhuǎn)化為對opcode序列的檢測,并通過實(shí)驗(yàn)證明基于opcode的檢測相較于基于原始文本的檢測,能夠提高檢測精度.
b) 分別利用詞袋模型和詞匯表模型對opcode序列提取詞頻特征和詞序特征,實(shí)驗(yàn)證明詞序特征對Webshell檢測的影響優(yōu)于詞頻特征,能夠提高檢測的精確率.
c) 將改進(jìn)后的CNN模型應(yīng)用到Webshell文本檢測這個二分類問題,并通過實(shí)驗(yàn)證明優(yōu)于傳統(tǒng)的機(jī)器學(xué)習(xí)算法和現(xiàn)有安全工具.
攻擊者利用SQL注入漏洞或者文件上傳漏洞等把Webshell文件上傳到Web服務(wù)的文件目錄中,然后像正常使用Web服務(wù)一樣利用Webshell.攻擊者在利用Webshell時,會在網(wǎng)絡(luò)中產(chǎn)生網(wǎng)絡(luò)流量,也會在Web服務(wù)器中產(chǎn)生Web日志.利用已知的正常網(wǎng)絡(luò)流量(日志)和Webshell流量(日志),就可以構(gòu)建識別Webshell的模型.
文獻(xiàn)[7]統(tǒng)計Web日志的分布發(fā)現(xiàn),Webshell的URI資源和URI查詢字符比較簡短、隨意、雜亂,甚至出現(xiàn)畸形字符,Webshell文件的單位時間窗口的訪問次數(shù)較少,Webshell文件訪問的入度和出度比較小,甚至接近于0.這些啟發(fā)式知識有利于從大量Web日志中發(fā)現(xiàn)Webshell的使用痕跡,屬于攻擊事后的取證.文獻(xiàn)[19]把Web流量的每一個記錄分為URI資源和URI查詢,分別對這兩部分以4-gram分割,建立各自修正的TF-IDF權(quán)值,最后根據(jù)累計的權(quán)值識別惡意Web流量,包括Webshell流量.這種加權(quán)累加的結(jié)果也是一種啟發(fā)式知識,可以用于在線檢測.利用啟發(fā)式知識識別Webshell的好處是檢測速度快,但其對混淆和加密比較敏感.
文獻(xiàn)[9]把HTTP請求轉(zhuǎn)換為一個帶統(tǒng)計特性的符號序列,采用變階的馬爾科夫模型(variable-order Markov model,VMM)描述該變長的符號序列,然后根據(jù)模型出現(xiàn)的概率識別惡意流量,其中包括Webshell流量.該模型可以緩解概念漂移、變長符號、高熵帶來的識別干擾.CNN-Webshell[6]引入Word2Vec和CNN[20-21]識別網(wǎng)絡(luò)流量中Webshell的請求,其檢測結(jié)果優(yōu)于樸素貝葉斯、支持向量機(jī)、K鄰近、隨機(jī)森林等傳統(tǒng)的機(jī)器學(xué)習(xí)算法,其檢測準(zhǔn)確率比SVM提高了2.6%.
Webshell文件屬于惡意代碼的一種,傳統(tǒng)惡意代碼分析和檢測技術(shù)同樣適用于Webshell文件的檢測.理解Webshell文件的結(jié)構(gòu)、內(nèi)容、特性,可以更好地服務(wù)于檢測.
文獻(xiàn)[18]指出,Webshell習(xí)慣性地使用混淆技術(shù)逃避特征值的檢測,并使用去混淆操作還原Webshell中混淆代碼,最后采用一種上下文觸發(fā)的片斷哈希(context-trigger piecewise hashing)對去混淆的Webshell聚類,樣本間的聚類關(guān)系有助于識別未知Webshell.文獻(xiàn)[22]通過靜態(tài)和動態(tài)分析已有的Webshell,發(fā)現(xiàn)其可見的特性,如口令的暴力破解、SQL數(shù)據(jù)庫的訪問、端口掃描、安全工具的檢測等;也發(fā)現(xiàn)許多不可見的特性,如一半的Webshell有認(rèn)證機(jī)制,且其中1/3可以繞過,1/3 Webshell執(zhí)行時會通知某個第三方(不是攻擊者),泄漏安裝Webshell的Web服務(wù)器.如果注冊被棄用的第三方域名,則可以捕獲感染W(wǎng)ebshell主機(jī).該研究揭示了Webshell的生態(tài)系統(tǒng),包括攻擊者、感染的Web服務(wù)器以及Webshell內(nèi)置的后門代碼,這些后門代碼會泄漏攻擊者的信息和感染的Web服務(wù)器的信息.
文獻(xiàn)[23]利用污點(diǎn)分析獲取Webshell文件的模式,該模式可以識別未知的Webshell.從已有的Webshell文件中抽取可以標(biāo)識Webshell的特征.Linux惡意軟件探測掃描器[10]、PHP Webshell Detector[11]、D盾[12]等都是利用這些特征的正則表達(dá)式檢測Webshell.同時,NeoPI[24]通過文件信息熵、文件可壓縮比、文件重合指數(shù)、單詞最大長度、惡意代碼片斷等統(tǒng)計特征識別Webshell,該統(tǒng)計特征可以對抗部分混淆和加密,提高對未知Webshell的感知能力,但檢測閾值是人為經(jīng)驗(yàn)設(shè)定,會出現(xiàn)誤報和漏報.文獻(xiàn)[25]分析敏感函數(shù)和敏感字符串在正常PHP文件和Webshell文件中的使用分布,提出了一種打分機(jī)制識別可疑的Webshell,但沒有解釋如何確定閾值.
文獻(xiàn)[26]選取文檔屬性(如單詞數(shù)量、分割符數(shù)量)、字符串操作函數(shù)、命令執(zhí)行函數(shù)(如eval,exec,system)、加解密函數(shù)、系統(tǒng)調(diào)用函數(shù)(如文件操作、數(shù)據(jù)庫操作)等作為特征集,其基于決策樹的檢測模型取得了較好的檢測結(jié)果.基于類似的特征集,文獻(xiàn)[27]采用了基于SVM的檢測模型,其準(zhǔn)確性優(yōu)于決策樹模型.文獻(xiàn)[28]首先采用NN(nearest neighbor)剔除樣本中的可疑噪聲,選取NeoPI[24]中特征集,然后應(yīng)用SVM識別Webshell,其準(zhǔn)確性比傳統(tǒng)的SVM高2.1%.
CNN是深度學(xué)習(xí)中一種被廣泛應(yīng)用的網(wǎng)絡(luò),常用于圖像識別領(lǐng)域,由于其方便性、可靠性等特點(diǎn),已經(jīng)成為圖像識別領(lǐng)域的主要研究方法.近些年來,研究者將CNN引入自然語言處理領(lǐng)域用于處理文本分類問題,而Webshell檢測也屬于文本二分類問題,所以本文將其應(yīng)用于對Webshell的檢測.
本文基于CNN的Webshell檢測框架如圖1所示,主要包括數(shù)據(jù)預(yù)處理、特征提取和表示以及檢測模型3個模塊.
圖1 檢測框架Fig.1 Framework of detection
數(shù)據(jù)預(yù)處理的工作包括文件去重和opcode獲取,本文基于MD5值哈希以去除重復(fù)文件.
MD5去重是根據(jù)文件內(nèi)容計算每個文件的MD5值,如果MD5相同,則認(rèn)為文件相同進(jìn)行去重.opcode是PHP腳本編譯之后的中間語言,其和PHP的關(guān)系就類比于jvm字節(jié)碼和JAVA的關(guān)系,它包括操作符、操作數(shù)、指令格式及規(guī)范以及保存指令及相關(guān)信息的數(shù)據(jù)結(jié)構(gòu).PHP腳本執(zhí)行包括4個階段:詞法分析、語法解析、opcode編譯、opcode執(zhí)行.編譯器在第3階段會將opcode與相應(yīng)的參數(shù)或函數(shù)調(diào)用綁定,即使對Webshell危險函數(shù)進(jìn)行混淆加密,在編譯時依然會出現(xiàn)與正常文件編譯結(jié)果不同的opcode語句.因此可以根據(jù)這一特點(diǎn),利用opcode區(qū)分Webshell和正常文件,把對文件的檢測轉(zhuǎn)換為對opcode序列的檢測,本文利用PHP插件邏輯擴(kuò)展模塊(Vulcan logic dumper,VLD)編譯獲取PHP文件opcode.
無論是機(jī)器學(xué)習(xí)還是深度學(xué)習(xí)都無法直接應(yīng)用于文本,因此需要將2.1節(jié)獲得的opcode特征向量轉(zhuǎn)變成算法所能處理的數(shù)學(xué)形式.鑒于本文研究的對象是靜態(tài)PHP文件,因此在opcode的基礎(chǔ)上,通過詞袋模型&TF-IDF和詞匯表模型分別提取詞頻和詞序特征.
2.2.1詞袋模型&TF-IDF 詞袋模型是應(yīng)用于NLP領(lǐng)域的特征提取模型,該模型不考慮詞法、語法和語序關(guān)系,將文檔看作是一袋子獨(dú)立的單詞,基于單詞構(gòu)建字典(dictionary),并根據(jù)字典將文檔表述為向量.該模型假設(shè)存在一個包含正常文件和Webshell文件的文檔集合D,里面共有M個文檔,提取文檔里的所有單詞構(gòu)成包含N個opcode單詞的字典(N可根據(jù)實(shí)際情況進(jìn)行選擇),利用字典將每個文檔表示成一個N維向量,向量每一維的值代表該單詞在該文檔中出現(xiàn)的次數(shù).
但僅憑詞頻無法反映詞的重要性,為了尋找到能更好地概括特征、區(qū)分正常文件與Webshell的opcode單詞,本文在詞袋模型處理之后引入TF-IDF進(jìn)一步處理.TF-IDF算法利用詞的逆文檔頻率(inverse document frequency,IDF)修正僅僅用詞頻表示的詞特征值,基于詞的TF-IDF值過濾掉區(qū)分能力較小的單詞而保留重要的詞語.圖2是詞袋模型的處理示例.
圖2 詞袋模型處理示例Fig.2 Example of bag-of-words model
2.2.2詞匯表模型 由2.2.1節(jié)可知,詞袋模型在構(gòu)建文檔向量時,并沒有保留單詞詞序特征,而詞序往往包含更多的語義信息,因此本文采用詞匯表模型提取PHP腳本opcode序列的詞序特征.
詞匯表模型假設(shè)存在一個包含正常文件和Webshell文件的文檔集合D,里面共有M個文檔,提取文檔里的所有單詞構(gòu)成帶有詞序序號的N個單詞的字典(序號是單詞出現(xiàn)的順序),利用字典將每一個文檔表示成一個P維向量(P即代表所選取的最大文檔長度),P維向量的每一維的值即是該文檔中的單詞出現(xiàn)在詞典里的序號,而不是單詞出現(xiàn)在文檔里的次數(shù).圖3是詞匯表模型的處理示例.
圖3 詞匯表模型處理示例Fig.3 Example of vocabulary model
傳統(tǒng)的用于文本分類問題的CNN結(jié)構(gòu)主要都源于文獻(xiàn)[15]一文中的結(jié)構(gòu),而考慮到數(shù)據(jù)的稀疏性,本文所用CNN模型結(jié)構(gòu)增加了一層卷積層,并改變原先池化卷積層輸出后再合并的方法,而采用先合并卷積層輸出再池化的方式.模型結(jié)構(gòu)如圖4所示,由兩層一維卷積層、全局池化層、softmax層構(gòu)成.
圖4 CNN模型結(jié)構(gòu)Fig.4 Architecture of CNN model
卷積層共有兩層,每層包含3個卷積核數(shù)量為128、長度分別為3、4、5的一維卷積神經(jīng)網(wǎng)絡(luò),通過卷積運(yùn)算抽取局部特征.給定輸入矩陣n*k,n為文檔個數(shù),k為特征維數(shù),該卷積層進(jìn)行卷積時只對列進(jìn)行卷積.在給定矩陣的位置i,卷積結(jié)果為Ci=f(W·Xi:i+h-1+b)∈R,h為卷積核長度,b是偏移量,而f是非線性修正函數(shù),經(jīng)過實(shí)驗(yàn)對比relu和tanh激活函數(shù),發(fā)現(xiàn)tanh對準(zhǔn)確率、精確率和召回率的影響都優(yōu)于relu,因此最終f選用了tanh.整個矩陣的卷積結(jié)果被表示成一個特征向量C=[C1,C2,…,Cn-h+1]∈Rn-h+1.
由卷積的運(yùn)算定義可知,卷積得到的特征向量個數(shù)與卷積核的個數(shù)相等,因此需要對多個特征向量進(jìn)行融合,本文采用串接方式將多個向量進(jìn)行連接,形成固定長度的融合特征向量.而后全局池化層對融合特征向量提取最大值,即C(h,m)=max{C(h,m)},降低特征維數(shù),避免過擬合現(xiàn)象發(fā)生.
池化層之后是softmax層,池化層的輸出通過全連接的方式連接一個softmax層,根據(jù)本文工作需要輸出兩類概率分布,即Webshell和正常文件的概率分布.
在訓(xùn)練中,本文采用Adam算法對參數(shù)進(jìn)行訓(xùn)練.為了提高模型的準(zhǔn)確度,本文采用Dropout策略使得部分神經(jīng)網(wǎng)絡(luò)單元失效,防止模型過擬合.
Webshell文件樣本主要通過使用“Webshell”關(guān)鍵字搜索下載github公開項(xiàng)目得到,由于本文只關(guān)注PHP語言編寫的Webshell,所以經(jīng)過篩選后一共有188個公開項(xiàng)目,例如tennc/webshell、ysrc/webshell-sample、xl7dev/WebShell、tdifg/WebShell、bartblaze/PHP-backdoors等.
正常PHP樣本主要使用互聯(lián)網(wǎng)常見的基于PHP開發(fā)的開源軟件樣本,主要包括WordPress、PHPCMS、phpMyAdmin、Smarty和Yii.
經(jīng)過MD5文件排重處理后共獲得777個Webshell樣本和2 437個正常PHP樣本.
3.2.1實(shí)驗(yàn)條件 本文實(shí)驗(yàn)基于python實(shí)現(xiàn),python版本為3.6.4.實(shí)驗(yàn)環(huán)境是Win10 64bit操作系統(tǒng),處理器為Intel Core i7-8700K@3.70 GHz,內(nèi)存為32 GB.
3.2.2實(shí)驗(yàn)參數(shù) 對數(shù)據(jù)樣本所得opcode個數(shù)統(tǒng)計分析如圖5所示.大多數(shù)文件的opcode個數(shù)都在4~50之間,但92%的Webshell文件和73%的正常文件的opcode個數(shù)分布在4~300之間.選取50、100、150、200、300作為詞匯表模型的最大文檔長度參數(shù)進(jìn)行實(shí)驗(yàn)驗(yàn)證,最終選擇300作為最大文檔長度參數(shù).
CNN模型的丟棄率設(shè)置為0.5,學(xué)習(xí)速率為0.001,批處理大小為100,訓(xùn)練周期為5輪,測試集與訓(xùn)練集比例為40%和60%.
Webshell的檢測是一個二分類問題,本文選取精確率、召回率以及F1值這3個評估指標(biāo)用以評估方法性能.實(shí)驗(yàn)?zāi)P蛯?shù)據(jù)檢測分類的所有可能情況如表1所示.精確率(P)、召回率(R)、F1值計算如下:
圖5 opcode個數(shù)分析Fig.5 Analysis of opcode
表1 分類情況Tab.1 Classification
3.4.1方法性能評估 實(shí)驗(yàn)從算法和特征兩個角度評估本文方法性能,實(shí)驗(yàn)結(jié)果如表2所示.
表2 實(shí)驗(yàn)結(jié)果比較Tab.2 Comparison of experimental results %
在特征方面,本文比較了詞匯表模型和詞袋模型.由表2可知,前3個算法對于特征的改變并不敏感,但對于CNN和RNN算法來說,基于詞序特征的詞匯表模型提高了精確率和F1值,其中CNN的精確率和F1值分別提高了1.1%和0.1%.
3.4.2同類工具比較 本文選取對比了現(xiàn)有的4個安全工具:D盾、河馬在線查殺[33]、OpenRASP[34]以及深信服[35],這4個工具都支持PHP腳本上傳檢測.
實(shí)驗(yàn)將777個樣本上傳至4類工具檢測,檢測結(jié)果如表3所示,D盾檢測率最高達(dá)到了87.4%,但依然低于本文方法的97.1%.
表3 同類工具比較Tab.3 Comparison of similar tools
3.4.3opcode有效性 為了評估opcode的有效性,采用詞匯表模型進(jìn)行特征提取,在原始數(shù)據(jù)集和opcode數(shù)據(jù)集上分別進(jìn)行了實(shí)驗(yàn),實(shí)驗(yàn)結(jié)果如表4所示.由表4可知,采用PHP opcode作為數(shù)據(jù)集時,能夠提高檢測的精度,其中CNN的3個評估指標(biāo)分別提高了1.2%、1.4%、1.2%.
本文提出了一種基于CNN的Webshell檢測方法,該方法基于PHP opcode序列,利用詞匯表模型提取其詞序特征,基于特征向量訓(xùn)練構(gòu)建CNN檢測模型.實(shí)驗(yàn)證明該方法無論在精確率、召回率還是F1值,都優(yōu)于傳統(tǒng)的機(jī)器學(xué)習(xí)算法;其次,實(shí)驗(yàn)還對比了兩類特征模型,證明詞序特征相較于詞頻特征更有助于Webshell檢測;此外,通過對比在opcode和原始文本數(shù)據(jù)集上的實(shí)驗(yàn)結(jié)果,證明opcode比原始文本更加利于檢測;最后,本文還比較了現(xiàn)有安全工具,現(xiàn)有安全工具大多是基于特征匹配的方法,而實(shí)驗(yàn)結(jié)果表明本文方法檢測率優(yōu)于安全工具,證明了本文檢測方法的有效性.與文獻(xiàn)[6]相比,本文方法關(guān)注的是Webshell文本而非Webshell網(wǎng)絡(luò)流量,是長文本而非短文本,但兩者都使用了CNN來處理檢測這個二分類問題,并且實(shí)驗(yàn)也證明了CNN解決此類問題的有效性.
表4 opcode有效性實(shí)驗(yàn)結(jié)果Tab.4 Effectiveness of opcode %
同時,本文的工作也存在一定的局限性.首先,Webshell樣本收集難度大,樣本收集數(shù)量少,導(dǎo)致檢測模型會出現(xiàn)過擬合.其次,檢測模型的輸入長度是固定的,而樣本的長度并非固定,這種長度的不一致會影響模型的檢測率.以上兩個問題是下一步需要研究和解決的問題.