李娜
(國家計算機網絡與信息安全管理中心寧夏分中心 寧夏回族自治區(qū)銀川市 750001)
互聯(lián)網的高速發(fā)展帶來信息化的快速推進,隨著《“十四五”數字經濟發(fā)展規(guī)劃》、《要素市場化配置綜合改革試點總體方案》等國家指導文件正式發(fā)布,“東數西算”工程全面啟動,我國正式步入數字經濟發(fā)展時代,數據已成為核心生產要素,越來越多的信息數據實現了網絡化,Web服務充斥于我們的生活中,隨之而來的針對Web 服務的攻擊也越來越多,其中最為著名的有Webshell。Webshell 憑借其靈活多變和強隱秘性成為備受黑客青睞的攻擊后門之一,植入成功后攻擊者可以隨時通過被利用的Web 應用漏洞或“上傳到其他受感染的系統(tǒng)”來啟動,這就等于為攻擊者在Web 服務提供了一個永久后門,可以隨時注入惡意代碼實現破壞用戶程序、竊取用戶敏感信息等操作,危害極大,因此Webshell 查殺歷來都是Web 服務安全防護的重要領域之一。
當前應用Webshell 檢測方法大多是基于規(guī)則匹配代碼做檢測,這樣會存在大量誤報和漏報,需要增加大量的人工干預來提升Webshell 檢出效果,且不具備對未知Webshell 變種的檢測能力。最近幾年來,不少Webshell 檢測研究都在嘗試利用機器學習提高Webshell 檢測效果,但機器學習模型訓練耗時巨大且嚴重依賴樣本的豐富度,而優(yōu)質的Webshell正負樣本很難采集到導致現有的模型檢出Webshell 的準確率不高。
針對上述問題,本文結合現有的檢測技術的同時提出一種基于污點分析的Webshell 檢測方法,即在傳統(tǒng)Webshell檢測方法之上引入基于污點分析技術,全程跟蹤數據處理過程并且記錄整個數據處理過程中的所有流向信息,即通過標記污點數據、跟蹤污點傳播過程、污點檢測實現Webshell攻擊檢測,進而提高Webshell 檢測效果。
Webshell 是一種惡意后門,主要以jsp、asp 和其它Scripting language等網頁文件形式存在于網站的運行環(huán)境中。攻擊者在入侵網站之后利用Webshell 工具將其注入到網站的服務器中,為了使網站使用及維護人員無法發(fā)現,通常將Webshell 工具存儲在網站服務器目錄下,放置于正常的網頁文件中,從而實現利用Web 服務訪問該Webshell 文件,竊取用戶數據、執(zhí)行系統(tǒng)命令等操作,達到控制服務器的目的。目前應用最為廣泛的Webshell 后門包括蚊劍、冰蝎、哥斯拉等,其中冰蝎、哥斯拉此類的Webshell 后門通信中流量使用隨機填充字符后通過AES 等加密方式進行傳輸,這種加密流量的傳輸方式使得在通信過程中檢測Webshell 異常困難。
主流的Webshell 檢測方法目前主要有三種:
(1)靜態(tài)檢測,可細分為正則、ssdeep 等方式,是通過匹配特征碼和危險函數來檢車識別Webshell,也可結合語法解析,剝離代碼、注釋、分析變量以及函數字符串等,缺點是因查Webshell 時不涉及函數執(zhí)行時的動態(tài)行為,會帶來一定的誤報;
(2)基于行為的動態(tài)檢測,類似沙箱方式,是對payload 的行為分析檢測,重點監(jiān)測Webshell 的訪問路徑、主機異常行為,訪問特征(如IP、cookie)等;
(3)基于日志分析的檢測,主要利用日志分析訪問特征(如訪問頁面是否是孤立,日志中是否含有payload,頁面訪問次數等)并進行識別。
其中基于行為的動態(tài)檢測和基于日志分析的檢測方法,會在檢測過程中產生大量的實時記錄大幅度影響服務器性能,且只能在攻擊者實施攻擊后檢出異常,因此基于源碼的靜態(tài)查殺相對使用更廣泛。
2.2.1 基于源碼的靜態(tài)檢測
基于源碼的靜態(tài)檢測主要有基于正則、ssdeep、機器學習、統(tǒng)計學和基于語法分析這五種檢測方法。其中基于正則的Webshell 檢測,是對已經人為定義好的Webshell 關鍵特征進行掃描,匹配其腳本文件中的特征碼字符串,如高危函數eval、system 等,從而判斷文件是否為Webshell;基于ssdeep 的Webshell 檢測,是一種基于模糊哈希算法的工具,通過文件的相似性比較發(fā)現其與源文件的相似關系。需要先獲取已知Webshell 樣本的ssdeep 哈希值然后設置相似度范圍識別同一系列的變形shell;基于統(tǒng)計學的Webshell 檢測,通過統(tǒng)計分析大量已知Webshell 表現出來的特殊統(tǒng)計特征,來綜合判斷當前腳本是否為Webshell;基于機器學習的Weshell 檢測,通過對大量被披露出的Webshell 正負樣本數據學習模擬建立Webshell 檢測模型,這種檢測模型還需要安全領域的技術人員通過以往積累的知識經驗加以輔助。
2.2.2 基于行為的動態(tài)檢測
基于行為的動態(tài)檢測又稱為沙箱檢測,是指Webshell 在運行過程中進行的一種檢測方式,通過監(jiān)測其在運行過程中的狀態(tài),對比運行過程中執(zhí)行的系統(tǒng)命令、產生的流量等內容綜合判斷是否存在異常情況,一般來說,Webshell 為了躲避靜態(tài)特征的檢測會提前將其加密,但攻擊者如若想控制數據庫和系統(tǒng),就需要遠程運行Webshell 工具,這時只要監(jiān)測到系統(tǒng)存在異常調用的情況,就可以檢測出Webshell,攔截攻擊者對系統(tǒng)下達的命令,保障正常網頁文件的安全性。
2.2.3 基于日志分析的檢測
基于日志分析的檢測,是指通過對服務器日志記錄進行提取、分解、過濾、刪除和合并進行分析,尤其是訪問、操作數據等記錄,網站系統(tǒng)被植入Webshell 腳本工具后,利用算法通過對日志分析判斷是否為正常行為或者Webshell行為,常用的算法如K 近鄰算法。
Webshell 具有多變性、復雜性、隱秘性的特點,任何一種檢測方法都無法實現Webshell 全類型的檢測覆蓋,經過調研分析,所有傳統(tǒng)Webshell 檢測方法都各有所長,優(yōu)劣分析對比如表1 所示。
表1:
污點分析是對數據流進行分析的技術,工作原理主要是追蹤所有數據處理相關操作,并記錄數據全程的流向情況從而尋找源數據與對象數據之間的依存關系。污點分析一般包括以下幾個環(huán)節(jié),其一對污點數據進行標識,其二是傳遞污點屬性,其三對污點進行檢測。一般來講,整個污點傳播的過程主要分為以下兩個步驟:第一步,將數據標記為污點之前,需得判斷外源數據是否值得信任;第二步,算術、邏輯等運算擴散被標記的源污點數據,通過運算得到的新結果數據依賴源數據,這樣通常認定其不可信,即依舊將其被標記為污點。污點檢測一般是檢測腳本程序中包含的變量是否具備污點,在分析過程中根據應用狀態(tài)分為存在兩種:一種是需要使腳本程序處于運行狀態(tài),被稱為動態(tài)污點分析;另一種是靜止狀態(tài),被稱為靜態(tài)污點分析。
3.1.1 靜態(tài)污點分析
靜態(tài)污點分析的對象是程序代碼或中間表示(Intermediate Representation,IR),此過程中既不運行目標程序也無需修改代碼,通過分析非運行狀態(tài)下目標程序的數據、控制依存關系,確定其從源傳播到匯聚點的整個過程。對數據依賴進行分析時,主要分析程序特性函數間內的污點傳播,包括調用、賦值等依賴關系;對控制依賴進行分析時,一般是選用遞歸的算法:對基本塊進行A 分析,然后對后續(xù)基本塊B 和C 進行識別并增加到控制流程圖中,之后重復的對B 和C 進行相同遞歸分析,直到所有基本塊都被識別以及全部添加到控制流程圖中。靜態(tài)污點分析是基于程序源代碼或IR 基礎,分析程序所有執(zhí)行路徑,污點傳播規(guī)則清晰容易識別,但是靜態(tài)污點分析的過程并不運行目標腳本、程序,缺失其運行時的特殊信息,所以從分析結果上看不夠精準。
3.1.2 動態(tài)污點分析
動態(tài)污點分析是通過插樁的方式實時跟蹤和監(jiān)控程序的運行過程,記錄跟蹤和監(jiān)控過程中產生的過程數據值,進而確定污點數據從源A 傳播到匯聚點B 的行為。但頻繁的插樁操作會導致占用過多的系統(tǒng)資源,相較于靜態(tài)污點分析,其執(zhí)行效率不高并且無法覆蓋到所有路徑,有概率產生漏報。
Webshell 最根本的惡意行為就是任意執(zhí)行外部命令,而要執(zhí)行外部命令則不可避免要獲取外部數據,因此如果發(fā)現腳本中的外界變量通過不斷傳遞,最終進入危險函數,就可準確識別Webshell。結合污點分析在數據流分析中的優(yōu)勢,本文提出一種設計思路,即在傳統(tǒng)Webshell 檢測方法中引入污點分析技術,綜合靜態(tài)污點分析、動態(tài)污點分析和深度還原技術,多管齊下實現Webshell 攻擊檢測。
3.2.1 整體實現架構
在傳統(tǒng)Webshell 檢測中,增加動靜態(tài)污點分析、動態(tài)污點分析技術以及深度還原技術,以PHP 樣本為例,整體架構圖如圖1。
圖1
PHP 腳本常用$_GET,$_POST 等變量接收http 請求,利用污點分析來檢測這類變量傳遞行為,將外界變量視為污點源,將eval,system 等危險函數視為污點匯聚點,全過程涉及字符串處理、條件分支等操作,這就需要全程跟蹤污點傳播過程,判斷污點變量是否被洗白,最終是否進入污點匯聚點。一旦獲取到相關變量后通過不斷傳遞,進入危險函數中執(zhí)行命令,則判定Webshell。
其中涉及到的靜態(tài)污點分析技術主要是將各種主流腳本語言進行詞法語法分析,將其轉換成一種統(tǒng)一的中間標識。得到中間表示后,構建數據依賴圖和控制依賴圖,并在圖上跟蹤外界污點變量的傳遞,如發(fā)生使用外部變量且執(zhí)行高危函數,則判定為Webshell。
動態(tài)污點分析技術的加入是為了更好的關注攻擊行為的發(fā)生,在內部設計了一個安全精巧的虛擬執(zhí)行解釋,可以將Webshell 在安全、穩(wěn)定的前提下執(zhí)行并觸發(fā)惡意行為,同時利用動態(tài)污點跟蹤技術,對惡意行為進行檢測。動態(tài)分析會監(jiān)控樣本中讀取外界變量并對這些變量做污點標記,監(jiān)控執(zhí)行中的各種函數調用和賦值操作,確保這些污點變量如何傳遞都能被跟蹤。最后對eval,system 等高危函數進行攔截,分析其是否使用了污點變量實現WebShell 檢測。
除了靜態(tài)污點分析和動態(tài)污點分析以外,為了分辨各種加密后的樣本和代碼,對于加密混淆流量引入深度還原技術用于部分加密流量的解密還原。首先利用傳統(tǒng)脫殼技術,對已知的加密混淆方案進行專項處理實現對常見加密混淆進行“脫殼”,另外還利用虛擬執(zhí)行器進行虛擬執(zhí)行,將混淆加密的代碼進行動態(tài)還原,實現“解密”。針對多次加密的樣本還會進行多次解密,深度還原。解密后的明文可用于特征識別和動靜分析,可以在提高檢出率同時降低部分加密正常樣本的誤報率。
3.2.2 污點分析模塊
上文架構中提到的污點分析模塊是整個檢測方法的核心部分,其主要通過預先設定好污染源、沉降點和污染傳播策略,對代碼或程序進行標記、追蹤和分析。下面闡述污點分析模塊的工作原理及污點分析模塊初始化流程圖(圖2)。
圖2
(1)首先定義HashTable 類型符號表sy_tb,將全局變量GS、預定義變量$_C00KIE,_POST_等保存在sy_tb 表中;
(2)在整個污點分析模塊初始化過程中,預先對變量結構體中的flag-stu 空閑位進行標識,將保存在sy_tb 表中的值_POST_、$_C00KIE 標記為污染,同步傳入關鍵函數并觸發(fā)關鍵函數的安全檢查代碼FCALLD、ICALL;
(3)劫持FCALLD、ICALL 來Hook 函數調用,獲取調用的函數和參數后,利用ZSUOHandle 來hook 代碼FCALLD、ICALL 監(jiān)控敏感函數;
(4)當函數通過上述FCALLD、ICAL 調用時,在函數表中查找指定的函數名,然后返回function 類型的指針;
(5)獲取z_function 指針,判斷z_function 結構體中的類型,這時分為兩種情況,第一種為內部函數,通過z_internal_function.handler 來執(zhí)行這個函數,第二種為用戶自定義的函數,調用z_execute 執(zhí)行函數中包含的z_op_array,觸發(fā)”handler”,在自定義函數中編寫污點記錄及啟用污點檢查策略。
污點分析的精準性依賴于污染傳播策略的制定,污點檢查策略的內部的函數其實就是污染在全部過程中的傳播,污點檢查策略的嚴格或寬松會導致最終監(jiān)測結果的差異,如漏報或者誤報,人為設定的污染傳播策略具有一定局限性,如何在污染傳播策略中引入機器學習,繼而從大量、隨機且不完全、雜亂的污點數據樣本中獲取需要的信息,進而形成更高效的規(guī)則策略機制,是下一步的研究方向。
采用黑盒(不透明)的方式,隨機黑箱監(jiān)測搜集的3285 個樣本,對比基于污點分析的WebShell 檢測與某商業(yè)Webshell 檢測引擎在樣本集中的檢測能力。測試結果如表2所示。另外,兩種檢測方法同時告警2127 個,占比67.6%;同時漏報83 個,占比2.5%。
表2:
從測試結果分析不難看出,引入污點分析后的WebShell檢測方法檢出率明顯提升,漏報率明顯下降,且對于特殊Webshell 具備較高的獨報能力,其檢出效果要明顯優(yōu)于某商業(yè)Webshell 檢測引擎。
本文針對目前存在的大量webshell 變種無法識別的情況,探索基于污點分析的Welshell 檢測方法,即在傳統(tǒng)的Webshell 監(jiān)測手段中引入污點分析技術,通過提出新的設計思路重新構建檢測機制,結合靜態(tài)污點分析、動態(tài)污點分析和深度還原技術,多管齊下實現Webshell 的檢測。同時也選取了真實環(huán)境總的樣本數據做測試,相比傳統(tǒng)的Webshell檢測方法,本文設計的方法給出了較為滿意檢出結果。接下來將測試更多樣本,力求完善優(yōu)化判定規(guī)則、提高檢測準確率。