張昊祎



摘? ?要:論文提出了一種語義分析和神經網絡模型相結合的WebShell檢測方法,通過對預編譯后腳本文件進行語義分析,基于抽象語法樹獲取腳本文件的行為特征;基于BP神經網絡對樣本進行有監督學習,得到可用于未知樣本的檢測模型。不同于現有基于語義分析的檢測方法,論文提出的方法無需人工定義惡意行為,從而有效屏蔽各類逃逸技術的干擾。實驗證明,論文提出的WebShell檢測方法具有較高的準確率和召回率。
關鍵詞:BP神經網絡;語義分析;WebShell;入侵檢測;Web安全
中圖分類號:TP309.5? ? ? ? ? 文獻標識碼:A
A method for WebShell detection based on semantics analysis and neural network
Zhang Haoyi
(School of Electronics Engineering and Computer Science Peking University, Beijing 100871)
Abstract: This paper proposes a WebShell detection method combining semantic analysis and neural network. Through semantic analysis of pre-compiled script files, the behavior characteristics of script files are obtained based on abstract syntax tree. Classifier model can be trained based on back propagation neural network that can be used for unknown samples. Different from the existing detection methods based on semantic analysis, the proposed method does not need to manually define malicious behavior, thus effectively shielding the interference of various escaping technologies. The experiment proves that the WebShell detection method proposed in this paper has higher accuracy and recall rate.
Key words: BP neural network; semantic analysis; WebShell; intrusion detection; Web security
1 引言
隨著Internet的迅速發展和Web技術在各行業的廣泛應用,Web安全逐漸成為信息安全領域最重要的攻防戰場之一。WebShell是一種常見的Web攻擊技術,由攻擊者通過文件上傳、SQL注入等攻擊手段植入Web應用內,常用于權限維持、數據竊取、內網探測等攻擊目的。根據知道創宇于2019年上半年發布的《2018年度網絡安全態勢報告》,掃描器和網站后門(即WebShell)已成為攻擊者最常用的Web攻擊技術,共占比79%。因此,快速、準確地進行WebShell的檢測在安全防守端尤為重要。
2? WebShell
WebShell是基于Web腳本語言開發的,可由Web服務器解析和執行的一類惡意腳本。通過植入WebShell,攻擊者可以相對隱蔽地對服務器進行遠程控制,對Web安全乃至內網安全都會造成極大威脅。WebShell的行為和目的主要包括四個方面。
信息嗅探:以嗅探Web運行環境信息、主機信息、數據庫信息、IDC網絡信息為目的,將收集到的各類信息回顯在頁面中或通過其它渠道反饋給攻擊者,攻擊者可以將收集到的信息用于下一步的入侵中。
權限維持:攻擊者可以通過HTTP請求的參數(包括GET/POST參數、Cookie、Header等)傳遞命令,由WebShell以Web應用運行權限執行命令,是一種攻擊成功后較隱蔽的權限維持手段。此外,攻擊者還可以通過各種反彈Shell手法獲取到交互式Shell,利用系統本地內核漏洞進行提權。
數據竊取和篡改:嗅探到數據庫連接方式等配置信息后,攻擊者可以利用WebShell竊取或篡改數據庫內的敏感信息。
網絡代理:攻擊者可以利用WebShell建立TCP/IP網絡隧道,用于嗅探、掃描IDC網絡和進一步的內網滲透,例如著名的reGeorg工具就利用了WebShell建立SOCKS5隧道。
3 WebShell檢測逃逸技術
通過對大量WebShell樣本進行分析,以及對黑客論壇中的WebShell逃逸技術進行總結,可以將WebShell逃逸技術進行分類。
3.1 字符串編碼與構造
簡單的WebShell靜態檢測技術的主要思路是關鍵函數關鍵詞匹配,WebShell開發者可以通過對函數字符串中的敏感詞進行編碼,在運行時再進行解碼,從而逃避關鍵詞匹配檢測。常見的編碼方式為大多數語言內置支持的Base64、Rot13等編碼。此外,還可對字符串進行混淆,包括亂序、移位、邏輯運算后,在運行時重新構造。
3.2 代碼混淆
基于統計學的檢測方法對腳本文件的統計指標進行提取,包括文件字符長度、信息熵、重合因子等。為了使WebShell的這些指標與正常頁面文件保持一致,WebShell開發者常在腳本內加入大量看似正常的無效代碼、HTML內容等進行混淆。
3.3 利用反射機制
絕大多數Web語言,包括ASP、PHP、JSP等均提供反射或序列化機制,WebShell開發者可以利用反射機制逃避關鍵類名/方法名/屬性名等特征匹配,再配合上述字符串編碼與構造技術,WebShell將在不出現任何關鍵詞的情況下執行敏感操作。
3.4 文件包含
通過將WebShell拆分成多個較小的文本或圖片文件,再通過文件包含進行匯總。將惡意執行的語句拆分到不同文件中,可以避免在一個WebShell文件中出現大量特征,從而干擾WebShell檢測結果。
3.5 流量加密
基于流量的WebShell檢測提取攻擊者和WebShell通信時的流量特征,為了隱藏HTTP請求中下發的指令關鍵詞,可以利用加密或編碼技術對請求參數進行加密,從而逃避這類檢測。而隨著信息熵等指標在檢測中的應用,流量加密的方式也在不斷發生變化。
3.6 隱蔽通道
與流量加密類似的,為了逃逸基于流量的檢測方法,攻擊者可以通過隱蔽通道傳遞執行信息。例如,將指令隱藏在腳本文件名中,調用時并不直接傳遞指令,而在WebShell內根據腳本文件名執行指令。同時,還可以利用HTTP會話機制,將指令隱藏在會話屬性中,從而實現指令下發的隱蔽通道。
4 相關研究
與其他安全防御領域類似,根據WebShell的檢測和防御手段的介入階段不同,可以分為事前預警、事中檢測、事后追溯三種。對WebShell的檢測防御思路主要分為基于文件的檢測、基于流量的檢測、基于行為的檢測和基于日志的檢測等。其中,基于文件的檢測是在WebShell剛被植入時,通過對文件屬性、內容、關鍵字等進行靜態分析判斷是否為WebShell,屬于事前預警;基于流量的檢測是從攻擊者與WebShell的交互流量中提取特征并進行判斷,基于行為的檢測是在WebShell運行時對其異常行為進行分析,這兩類均屬于事中檢測;而基于日志的檢測是對Web日志進行全局分析,發現正常訪問日志與WebShell訪問日志的差異,從而判斷是否已經遭受了WebShell攻擊并定位WebShell,屬于事后追溯。
基于文件的檢測是利用WebShell與正常頁面文件在哈希值、屬性、文本關鍵詞、統計指標等方面的差異,對WebShell進行靜態檢測的技術。一種思路是對所有流通的WebShell樣本進行收集,計算文件哈希形成WebShell指紋庫,如WebShell Detector工具,自稱可以達到99%的識別率。這種方法需要長期的人工維護樣本庫,而且可以非常容易地進行繞過(增加任意無效代碼即可)??椎聫V等在[1]中提出基于局部敏感散列算法的檢測方法,可以一定程度上避免局部修改和混淆造成的繞過情況。國內著名的WebShell檢測工具D盾通過在文件內查找惡意函數等方式進行檢測,這有可能被字符串編碼構造等混淆技術繞過。針對常見WebShell檢測逃逸技術,NeoPI[2]通過提取信息熵、最長單詞、重合指數、壓縮比等特征,可以有效判斷出樣本是否采用了混淆和逃逸。戴樺等在[3]中提出基于矩陣分解算法的檢測方法,賈文超等在[4]中提出基于隨機森林算法的檢測方法,胡必偉等在[5]中提出基于樸素貝葉斯的檢測方法,均采用了功能函數、重合指數、信息熵、最長單詞、壓縮比等文本特征和統計指標作為樣本特征,取得了較好的檢測效果。但由于上述方法樣本特征需要人工參與設置和選擇,對于0Day型的WebShell檢測能力仍屬未知。易楠等在[6]中提出了基于語義分析的WebShell檢測方法,突破性地提出利用AST和人工定義風險特征庫提取污點子樹,計算文件危險程度,再通過人工設置閾值的方式進行定性判斷。
攻擊者在與WebShell通信時的參數關鍵詞、訪問行為統計指標、信息熵、頁面關聯性等方面存在差異,基于流量的檢測技術就是對這些差異進行分析,提取特征并通過一定算法進行分類。
基于行為的檢測利用WebShell在活動時對系統執行的行為與正常頁面文件的差異性進行檢測。根據WebShell檢測中對WebShell目的的分析,WebShell常會在運行時出現文件讀寫行為、網絡監聽行為、數據庫連接行為等。采用Hook技術、RASP等可以對WebShell運行時的行為進行收集,并采用一定規則或算法進行檢測。
基于日志的檢測是從Web日志的文本特征、統計特征、響應頁面特征等方面提取特征,對正常業務訪問日志進行建模,從而利用無監督聚類等方式對WebShell訪問請求進行檢測。
當WebShell已經被攻擊者訪問時安全性將變得不可控,可能在一次請求后即建立了更為隱蔽的C&C連接或造成了一定的損失。本文認為安全防御應該盡可能早地介入攻擊鏈條中,因此本文提出的檢測方法屬于事前預警類檢測。在特征提取階段即獲得抽象層面的行為特征,對上述字符串編碼與構造、代碼混淆、利用反射機制、文件包含等形成降維打擊,可以有效對抗已知的檢測逃逸技術;采用BP神經網絡建設WebShell檢測分類模型。與[6]中提出的基于語義分析的檢測方式不同,本文的檢測方法并非只針對PHP語言,兼容性較強;且無需人工定義和維護風險特征庫。
5 基于抽象語法樹的特征提取
抽象語法樹(Abstract Syntax Tree,AST)是編程語言的抽象語法結構的樹狀表現形式,作為編譯器后端的輸入,不依賴于具體的文法和語言的細節。通過對抽象語法樹進行分析,可以獲得對代碼語義層面的理解。抽象語法樹的生成過程包括詞法分析和語法分析兩個步驟,其中詞法分析是將代碼字符流轉變為標記(Token)的過程,語法分析是根據標記集合構造抽象語法樹的過程。
以Python為例,下面一段代碼與其生成的抽象語法樹為:
import os;os.system(cmd)
Module(body=[
Import(names=[
alias(name='os', asname=None),
]),
Expr(value=Call(func=Attribute(value=Name(id='os', ctx=Load()), attr='system', ctx=Load()), args=[
Name(id='cmd', ctx=Load()),
], keywords=[], starargs=None, kwargs=None)),
])
由于WebShell的編寫有很大的可變性,為了逃逸檢測可以采取多種方式對代碼本身進行混淆,如果僅在文本層面提取WebShell特征,則會陷入極大的被動,造成大量的漏報。因此,通過對WebShell文本進行語義分析,從語義角度獲取代碼行為意圖,對各類逃逸技術進行降維打擊,從而獲得相對穩定的WebShell特征。
綜合各種編程語言的抽象語法樹定義,樹節點主要包括聲明(Statement)、表達式(Expression)、注釋(Comment)、定義(Declaration)、類型(Type)等。為了最大程度地屏蔽代碼混淆等對特征提取結果的影響,從提取WebShell實際行為的目的出發,本文認為只有函數調用表達式有實際意義,而外部庫引用、變量定義、類/方法定義、注釋等節點信息沒有參考意義。函數調用表達式包括調用類、調用方法、調用參數三部分組成,其中調用類指函數調用主體類型,調用方法指調用的具體函數,調用參數指調用函數時傳入的參數,如下所示:
os.system(cmd)
Expr(value=Call(func=Attribute(value=Name(id='os', ctx=Load()), attr='system', ctx=Load()), args=[
Name(id='cmd', ctx=Load()),
], keywords=[], starargs=None, kwargs=None)
由于WebShell可以對語言內置類和方法進行重新封裝和重載,為了獲取實際調用類和方法,在抽象語法樹遍歷節點時對內部或外部引用的自定義類型和方法的調用進行遞歸追溯,最大程度上保證函數調用特征提取的完整性和一致性。由于WebShell編寫和逃逸技術應用不盡相同,安全函數調用和危險函數調用的次數和順序與WebShell實際行為沒有必然聯系,因此本文認為在抽象語法樹遍歷時,同一類方法的調用次數不影響該函數調用的權重;不同類方法的調用順序與其實際語義無關。此外,類名、變量名等應解析為對應的全限定名(Fully Qualified Name,FQN),以獲取其明確唯一的類型表示。通過抽象語法樹的生成和遍歷解析,可以得到該腳本文件內的函數調用的無序不重復的函數調用集合。以JSP語言為例,抽取的函數調用集合如圖1所示。
采用詞集模型(Set of Words)對提取出來的函數調用集合進行向量化,獲取函數調用字典及樣本的向量化表示。給定樣本集,將其中所有出現過的函數調用整合為一個詞匯表L(Lexicon),對于任意樣本,的函數調用集為,那么該樣本向量化表示為。如果詞匯表中第個詞出現在中,那么該樣本此處的向量分量就為1,否則就為0,即:
,
至此,已通過解析抽象語法樹得到樣本集的特征向量化表示。
6 BP神經網絡
誤差反向傳播(Back-Propagation,BP)神經網絡是一種有監督的,使用誤差反向傳播算法(BP Algorithm)迭代訓練的多層前饋神經網絡。各個特征分量之間存在無法預知的相互關聯,與WebShell檢測結果間存在一定的非線性對應關系,鑒于BP神經網絡具體較強的非線性映射能力和泛化性能,本文采用BP神經網絡來逼近這一對應關系,從而獲得更好的WebShell檢測效果。
BP神經網絡由輸入層、多個隱含層和輸出層組成,各層包含多個神經元,相鄰層神經元之間全部相互連接;每層神經元接收上一層所有神經元的輸出,使用連接系數和偏置量計算得到該神經元的輸出結果。BP神經網絡訓練包括正向傳播過程和誤差反向傳播過程:通過正向傳播過程,在輸入層輸入的特征向量經過多個隱含層轉換,最終從輸出層獲得輸出結果,如果輸出與實際標簽結果誤差不滿足期望,則進入誤差反向傳播過程;誤差反向傳播過程中,利用梯度下降法由輸出層到輸入層的方向逐層調整各層神經元的連接系數和偏置量等參數,然后進入下一次迭代。通過正向傳播和反向傳播過程的不斷迭代,調整網絡參數達到期望的輸出誤差。
為實現非線性映射的表達能力,在每個神經元使用輸入、連接系數和偏置計算后,使用激活函數(Activation Function)對計算結果進行非線性變換,常用的激活函數包括Sigmoid、Tanh、ReLU等。為量化評估神經網絡的輸出與實際標記之間的差距,使用損失函數(Loss Function)對輸出結果進行計算。WebShell檢測的應用場景屬于典型的二分類問題,常用的分類問題損失函數包括均方誤差(Mean Squared Error,MSE)損失函數、交叉熵(Cross Entropy)損失函數等。
7 WebShell檢測系統設計
基于BP神經網絡的WebShell檢測為標準的有監督學習的二分類任務,結合抽象語法樹的提取過程,系統模型包括預處理模塊及特征提取模塊、模型訓練模塊、WebShell檢測及告警輸出模塊三個基本模塊。檢測流程如圖2所示。
其中,預處理及特征提取模塊包含樣本預處理和特征提取兩個子模塊。樣本預處理子模塊用于對樣本中的異常字符進行處理,防止樣本格式不規范對特征提取造成影響。此外,在樣本預處理子模塊中處理腳本文件的文件包含處理,將被包含的文件內容整合在一個文件中,從而提取樣本最完整的特征,防止WebShell通過拆分成多個文件逃逸檢測。特征提取子模塊包括詞法分析、語法分析、函數調用提取、詞匯表生成及特征的向量化表示等處理過程。預處理及特征提取模塊工作流程如圖3所示。
告警輸出模塊采用高可讀性的方式對WebShell檢測結果進行輸出。
8 實驗與分析
8.1實驗數據集
本文提出的檢測方法對各類語言開發的WebShell均適用。采用JSP語言編寫的WebShell樣本作為實驗數據集,WebShell樣本來源為Github中WebShell收集比較全面的項目,共收集232個WebShell樣本;正常腳本樣本收集來源為開源的CMS Web項目,包括Jeewx、Tianti、Infoglue、Jeesite等,以及Github隨機爬取的JSP/JSPX,共收集415個正常腳本樣本。
8.2 效果評估
WebShell檢測屬于典型的二分類問題,對于這類問題,檢測結果可以表示為如表1所示的混淆矩陣。
WebShell檢測的準確率,召回率。由于準確率和召回率屬于互相矛盾的度量指標,為均衡表示WebShell檢測模型的效果,使用度量表示模型的綜合性能,其中。對樣本進行隨機取樣,取十次實驗結果的平均值。
8.3 實驗結果
通過本文所述方式對所有JSP/JSPX文件進行語法分析和特征提取,首先利用org.apache.jasper.Jsp庫對樣本文件進行預編譯,獲得等價的Java腳本;再利用com.github.javaparser相關庫進行語法分析從而獲取抽象語法樹;對抽象語法樹進行解析,獲取函數調用序列,并利用詞集模型進行特征向量化,得到1418維特征向量。通過主成分分析(Principal Component Analysis,PCA)處理后,樣本的分布圖如圖4所示。
從圖4中可以看到,通過語法分析特征提取,WebShell可以相對明顯地區分于正常樣本。采用包含2個隱藏層的BP神經網絡模型,隱藏層神經元個數分別為200、50,損失函數為交叉熵(Cross Entropy)損失函數,每一層之后使用線性整流單元(Rectified Linear Unit,ReLU)作為激活函數。實驗結果平均模型準確率為0.9909,召回率為0.9869,模型的綜合性能F1為0.9858。
基于神經網絡分類器的實驗指標與其他WebShell檢測文獻的實驗結果進行對比,如表2所示。
從表2中可以看出,得益于基于語法分析的特征提取的完整性及BP神經網絡較強的非線性映射能力,本文提出的WebShell檢測方法具有較高的準確率和召回率。
9 結束語
本文對WebShell的行為目的和常見逃逸技術進行了分析和闡述,為對抗WebShell逃逸技術對WebShell檢測造成的影響,提出基于抽象語法樹的WebShell特征提取方法;基于BP神經網絡訓練得到表達能力和泛化性能較佳的分類模型。區別于其它基于語義分析的WebShell檢測方法,本文提出的檢測方法無需人工定義風險特征庫和設置判定閾值。實驗結果表明,本文提出的WebShell檢測方法具有較高的準確率和召回率。
本文提出的WebShell檢測方法仍存在一些優化點:可基于抽象語法樹細化樣本特征,基于數據流的方式提取函數調用序列,從而利用卷積神經網絡(Convolutional Neural Network,CNN)、注意力模型(Attention Model)等對WebShell的行為目的進行更深入的建模;可以結合基于流量或基于行為的WebShell檢測技術,將靜態分析結果與動態執行監控結合起來,進一步完善WebShell的特征,提高分類器的性能。
參考文獻
[1] 孔德廣,蔣朝惠,郭春,等.基于Simhash算法的Webshell檢測方法[J].通信技術,2018.
[2] Tu T D,Guang C,Xiaojun G,et al.Webshell detection techniques in web applications[C]// 2014 5th International Conference on Computing, Communication and Networking Technologies (ICCCNT). IEEE Computer Society,2014.
[3] 戴樺,李景,盧新岱,等.智能檢測WebShell的機器學習算法[J].網絡與信息安全學報, 2017(4):55-61.
[4] 賈文超,戚蘭蘭,施凡,等.采用隨機森林改進算法的WebShell檢測方法[J].計算機應用研究,2018, 35(5).
[5] 胡必偉.基于貝葉斯理論的Webshell檢測方法研究[J].科技廣場,2016(6):66-70.
[6] 易楠,方勇,黃誠,等.基于語義分析的Webshell檢測技術研究[J].信息安全研究,2017(2).