傅繼晗,沈 煒
(浙江理工大學(xué)信息學(xué)院,浙江杭州 310018)
發(fā)改運行〔2021〕1283 號文件指出虛擬貨幣挖礦活動是通過專用“礦機”計算生產(chǎn)虛擬貨幣的過程,該活動能源消耗與碳排放量大,對國民經(jīng)濟貢獻度低[1]。比特幣[2]發(fā)明以來,使用各類挖礦算法的加密貨幣層出不窮,至今已經(jīng)超過了8 600 種,總市值超過了2.21 萬億美元[3]。在如此高的挖礦熱度下,挖礦已經(jīng)從礦場擴散到零星設(shè)備,更有甚者,通過惡意挖礦網(wǎng)頁等非法方式占用用戶資源牟取非法利益[4]。自從2017 年誕生第一個網(wǎng)頁挖礦程序coinhive[5]以來,越來越多惡意挖礦網(wǎng)頁采用內(nèi)嵌挖礦腳本的形式,在用戶登錄網(wǎng)頁期間,利用網(wǎng)頁代碼實施挖礦劫持攻擊(cryptojacking),嚴重耗費了計算機資源,影響了人們正常的生產(chǎn)生活。因此,通過科學(xué)可信的檢測手段對挖礦網(wǎng)頁進行準(zhǔn)確檢測、判斷是當(dāng)今網(wǎng)絡(luò)安全研究中一個重要課題。
隨著網(wǎng)頁內(nèi)置挖礦程序越來越多,不少網(wǎng)頁挖礦網(wǎng)站黑名單被曝光,如Nocoin[6]和MinerBlock[7]將含有挖礦木馬的URL、域名、IP 地址等信息保存在黑名單庫中,通過檢索判斷是否為惡意網(wǎng)頁。然而,隨著惡意挖礦網(wǎng)頁變種增多,不少網(wǎng)站都使用DGA 域名生成算法等手段生成無規(guī)律隨機的域名來繞過一般的檢測機制,因此對惡意挖礦網(wǎng)站進行行為特征分析十分重要。在國內(nèi)外相關(guān)研究中,主要分為惡意挖礦網(wǎng)站的靜態(tài)分析和動態(tài)分析,國內(nèi)辛毅等[8]對挖礦木馬進行檢測分析,應(yīng)宗浩等[9]對木馬攻擊手段進行研究。國外如Romano 等[10]提出MinerRay 技術(shù),通過語義分析網(wǎng)頁代碼分析挖礦行為;Domhnall Carlin 等[11]通過ollydbg 調(diào)試運行惡意網(wǎng)頁的Chrome 瀏覽器,從機器指令集角度分析惡意網(wǎng)頁特征;Papadopoulos 等[12]通過網(wǎng)頁運行時的CPU、內(nèi)存使用情況以及系統(tǒng)溫度識別挖礦網(wǎng)頁。
但上述惡意挖礦網(wǎng)頁分析方法存在以下3個問題:
(1)由于惡意代碼在Chrome 瀏覽器的JavaScript 虛擬機中運行,因此通過ollydbg 等調(diào)試器進行機器指令級分析效率不高,且在不同架構(gòu)CPU 的機器上通用性差。
(2)惡意代碼存在嚴重混淆,導(dǎo)致如上文提到的minerray 等一些JavaScript 分析框架容易出錯,在實驗中難以對付越來越多的惡意挖礦變種。
(3)通過網(wǎng)頁運行時的CPU、內(nèi)存使用情況以及系統(tǒng)溫度識別挖礦網(wǎng)頁容易造成誤報,錯誤地將一些網(wǎng)頁游戲識別成挖礦程序,而且檢測環(huán)境必須是在只運行瀏覽器的情況下,實際生產(chǎn)環(huán)境中難以做到,并且受外界溫濕度的影響較大。
針對以上問題,本文提出基于Chrome 瀏覽器自帶的開發(fā)人員工具檢測網(wǎng)頁挖礦的方法,能有效提升檢測效率與準(zhǔn)確度。通過FOFA 引擎搜索authedmine.com 接口,獲取有代表性的挖礦網(wǎng)頁http://218.29.203.186:7788,并以該網(wǎng)站為例,使用Chrome 自帶的開發(fā)人員工具分析其挖礦期間的各種特征,從而提高對網(wǎng)頁惡意挖礦行為的檢測及防范水平。
一個HTML 格式的網(wǎng)頁主要由head、body 組成,其中head 和body 里可以插入script 標(biāo)簽或者iframe 以引入其他外部js 腳本。在本例惡意挖礦網(wǎng)頁中發(fā)現(xiàn)了兩處惡意挖礦代碼的引入點。其中,位于head中的script標(biāo)簽如下:
從上述script 標(biāo)簽引入的惡意代碼中,可以看見設(shè)置了API_KEY(見圖1),惡意代碼植入者通過設(shè)置API_KEY來連接挖礦服務(wù)提供者,從而將挖礦收益記錄到自己的賬戶。同時,該惡意代碼還創(chuàng)建了新的iframe 標(biāo)簽(見圖2),iframe 也被稱為HTML 內(nèi)聯(lián)框架元素,能將另一個HTML頁面嵌入到當(dāng)前頁面中[13],惡意代碼通過創(chuàng)建iframe 進一步引入新的惡意代碼并執(zhí)行。由于iframe 的代碼執(zhí)行虛擬環(huán)境獨立于主網(wǎng)頁,因此通過iframe 執(zhí)行惡意代碼也能一定程度上繞開相關(guān)檢測機制。
Fig.1 API_KEY imported with malicious code圖1 惡意代碼引入的API_KEY
Fig.2 Impovting new malicious code by creating new iframe圖2 通過創(chuàng)建新的iframe引入新的惡意代碼
進一步分析新引入的iframe,發(fā)現(xiàn)其本質(zhì)是一個表單,一旦點擊表單上藍色高亮的同意按鈕,該iframe 會加載混淆過的惡意挖礦代碼,如圖3所示。
Fig.3 Impovting new malicious code圖3 引入新的惡意代碼
對惡意代碼進行反混淆,發(fā)現(xiàn)惡意挖礦代碼的原理是通過隱式方式引入wasm 文件,使用WebAssembly 語言通過瀏覽器進行挖礦,如圖4 所示。WebAssembly 是一種新型編碼方式,是一種低級的類匯編語言[14],具有緊湊的二進制格式,可以接近原生的性能運行。惡意代碼使用WebAssembly 提升了挖礦效率。
Fig.4 Wasm object imported in malicious code圖4 惡意代碼中植入的wasm文件對象
對上述惡意樣本進行靜態(tài)代碼分析后可以發(fā)現(xiàn),惡意樣本的代碼混淆程度較高,且使用iframe 執(zhí)行代碼,導(dǎo)致使用一般的方法難以識別挖礦代碼。本文將使用Chrome自帶的開發(fā)人員工具從網(wǎng)絡(luò)行為以及javascriptCPU 性能剖析器的角度對惡意樣本進行分析。
在惡意網(wǎng)站加載完所有惡意代碼之后,瀏覽器控制臺會打印一條WebSockets 連接的建立和多個worker 的創(chuàng)建情況,隨后另一組WebSockets 和worker 建立,通過分析日志打印的來源(Chrome JavaScript 引擎腳本VM6 與VM8)以及兩條不同的wss 連接路徑,得知這兩組WebSockets 和wocker 分別來自前一節(jié)兩處不同惡意代碼引入點的執(zhí)行環(huán)境,如圖5所示。
WebSockets 是一種先進的技術(shù),可以在用戶的瀏覽器和服務(wù)器之間打開交互式通信會話[15],與http 協(xié)議共享端口。通過分析WebSockets 網(wǎng)址和傳輸?shù)膉son 格式消息,可以確定該WebSockets 連接用于下發(fā)挖礦任務(wù),同時向挖礦服務(wù)器上傳挖礦結(jié)果。由于其采用了wss 即WebSockets over SSL/TLS 加密方案,導(dǎo)致各單位難以從網(wǎng)關(guān)過濾中發(fā)現(xiàn)此類流量,如圖6 所示。對惡意網(wǎng)站另一處iframe 引入的代碼(見圖1)進行比較分析后發(fā)現(xiàn),該處引入的惡意代碼與圖6 處一致,且引入該代碼的url 中key 的數(shù)據(jù)一樣,均為jC8oUd3fagiDXAm,表明該處代碼與前一處script標(biāo)簽的代碼為同一黑客引入。
Fig.5 Two sets of console logs圖5 兩組控制臺日志
Fig.6 Wss sessions created while malicious code executing圖6 惡意代碼建立的wss消息內(nèi)容
通過分析wss 的消息內(nèi)容,得知挖礦服務(wù)器下發(fā)了多個任務(wù),同時繼續(xù)對惡意樣本進行網(wǎng)絡(luò)日志審計,發(fā)現(xiàn)該惡意網(wǎng)站加載了多組相同的惡意代碼,其中包括與上一節(jié)相同的wasm 代碼,如圖7所示。
Fig.7 Malicious samples loaded multiple groups of minning codes圖7 惡意樣本加載了多組挖礦代碼
由此可以推斷該惡意樣本至少同時使用8 個線程進行挖礦。雖然挖礦軟件的網(wǎng)絡(luò)流量經(jīng)過了SSL 加密,外部網(wǎng)關(guān)難以獲取相關(guān)流量,但由于挖礦軟件本身是在瀏覽器中運行,因此使用Chrome 自帶的開發(fā)人員工具能夠繞開SSL 層,無需解密即可直接獲取挖礦程序運行時的網(wǎng)絡(luò)流量日志,為特征分析提供方便。
由于瀏覽器開發(fā)人員自帶的工具使用Chrome Dev-Tools Protocol 協(xié)議連接調(diào)試頁面,也即是說,任何一個實現(xiàn)了Chrome DevTools Protocol 的程序都可以用來調(diào)試頁面。據(jù)此,提出以下檢測惡意挖礦網(wǎng)站的方法,即使用remotedebugging-port 參數(shù)啟動Chrome 瀏覽器無頭模式,暴露出Chrome DevTools Protocol 協(xié)議端口,再使用nodejs 調(diào)用Chrome-remote-interface 庫,通過該協(xié)議與無頭模式的瀏覽器進行通訊,控制瀏覽器訪問惡意挖礦網(wǎng)站,最后通過記錄websocket 日志,從中提取特征信息,如“wasm”“set_job””get_job”等,與挖礦流量日志數(shù)據(jù)庫進行比對即可篩選出挖礦網(wǎng)站,流程如圖8所示。
Fig.8 Web mining detection program based on traffic analysis圖8 基于流量分析的網(wǎng)頁挖礦檢測程序
虛擬貨幣挖礦需要大量計算,必定會增加CPU 負荷。劫持挖礦一般利用CPU 較多、GPU 較少,導(dǎo)致CPU 利用率過高,因此觀察CPU 利用率可作為判定是否被劫持挖礦的特征之一。JavaScript CPU 性能剖析器是一個Chrome 開發(fā)人員工具里自帶的JavaScript 動態(tài)分析組件,能自動記錄放入其中的JavaScript 代碼運行時每個函數(shù)調(diào)用棧消耗CPU 的特征。由于惡意網(wǎng)站使用了代碼混淆技術(shù),使用JavaScript CPU 性能剖析器能夠很好地抗混淆并記錄虛擬機實例中執(zhí)行的函數(shù)名稱。鑒于惡意挖礦木馬往往在視頻網(wǎng)站中寄生,故將普通視頻網(wǎng)站與惡意樣本的運行結(jié)果進行比對,分析其動態(tài)運行特征,結(jié)果如下:
由圖9、圖10 可知,在惡意網(wǎng)站中,存在多個JavaScript虛擬機實例,且每個實例中wasm-function 函數(shù)占用CPU 的時間最多,而在普通的視頻網(wǎng)站中,則是program 函數(shù)占用時間最多,如圖11所示。
火焰圖是一種基于堆棧跟蹤剖析器收集數(shù)據(jù)繪制的用于性能剖析的可視化圖表。在火焰圖中,元素以堆疊方式顯示,函數(shù)的調(diào)用堆棧從下到上顯示,其中最上面的元素代表堆棧中最新調(diào)用的函數(shù)[16],如圖12、圖13 所示,元素越寬代表該函數(shù)占用CPU 資源越多。Chrome 開發(fā)人員工具每隔一段時間(timeDeltas)進行采樣得到繪制火焰圖的原始數(shù)據(jù),對以上函數(shù)調(diào)用情況繪制火焰圖表可以發(fā)現(xiàn),挖礦網(wǎng)站的資源使用情況呈現(xiàn)一定規(guī)律,而普通網(wǎng)站的資源使用情況相對不規(guī)律,如圖14、圖15所示。
Fig.9 Malicious code creates multiple JS virtual machine instances for mining圖9 惡意代碼創(chuàng)建多個JS虛擬機實例挖礦
Fig.10 Function calls of malicious websites圖10 惡意網(wǎng)站中的函數(shù)調(diào)用情況
Fig.11 Function calls of ordinary video websites圖11 普通視頻網(wǎng)站中的函數(shù)調(diào)用情況
由于開發(fā)人員工具導(dǎo)出的性能分析數(shù)據(jù)為函數(shù)調(diào)用棧頂函數(shù)名的排列串,因此排除這些函數(shù)串中名稱為“(program)”或者“(idle)”的函數(shù),從剩下的函數(shù)名子串中選擇函數(shù)名相同的連續(xù)子串s1s2s3…sk。通過Amir 等[17]提出的周期模式挖掘算法獲取其中可能的排列周期,即選定一個ε∈[0,1),存在ρ,使得s1s2s3…sk中存在最大子串序列snsn+1sn+2…sn+m,滿足其中任意子串長度的絕對誤差大于ρ且小于ρ(1 +ε),從中獲得的最大子串序列長度m即為挖礦函數(shù)周期數(shù)M,ρ為挖礦函數(shù)周期長度P,用偽代碼表示如下:
Fig.12 Code snippets and data collected by the corresponding performance profiler圖12 代碼片段與對應(yīng)性能剖析器采集的數(shù)據(jù)
Fig.13 Flame diagram based on the data collected in figure 12圖13 根據(jù)圖12采集數(shù)據(jù)繪制的火焰圖
Fig.14 CPU performance flame diagram of malicious websites圖14 惡意網(wǎng)站的CPU性能火焰圖
Fig.15 CPU performance flame diagram of ordinary video websites圖15 普通視頻網(wǎng)站的CPU性能火焰圖
由此,設(shè)計一個基于JavaScript 剖析器的網(wǎng)頁挖礦檢測程序,其工作模式如圖16所示。
Fig.16 Web mining detection program based on performance profile圖16 基于性能剖析器的網(wǎng)頁挖礦檢測程序
硬件環(huán)境為HP probook 440 G6,軟件環(huán)境為windows10 20H4 以及python3.10,實現(xiàn)方式為通過python 控制基于Chrome 的無頭瀏覽器訪問樣本中的網(wǎng)頁。
利用Adblock 防火墻提供的基于瀏覽器的秘密挖礦黑名單[18]和部分瀏覽器插件內(nèi)置的挖礦黑名單,收集有挖礦靜態(tài)特征的20 個挖礦網(wǎng)頁樣本。通過網(wǎng)絡(luò)各收集20 個有視頻網(wǎng)頁樣本和無視頻一般網(wǎng)頁樣本,使用本文提出的網(wǎng)頁挖礦檢測方法通過流量分析和CPU 分析進行驗證。
在特征分析中,本文定義疑似存在挖礦靜態(tài)特征的網(wǎng)頁特征分析為真(T),否則為假(F);在流量分析中,使用remote-debugging-port 參數(shù)啟動Chrome 瀏覽器無頭模式,暴露出DevTools Protocol 協(xié)議端口,再使用nodejs 調(diào)用Chrome-remote-interface 庫,通過該協(xié)議與瀏覽器進行通訊,控制瀏覽器訪問惡意挖礦網(wǎng)站,從記錄websocket 日志中提取特征信息,并與挖礦流量日志數(shù)據(jù)庫比對,符合特征為真(T),否則為假(F);在CPU 分析中,利用JavaScript CPU 性能剖析器進行驗證,網(wǎng)頁占用CPU 資源多且占用情況呈現(xiàn)一定規(guī)律的為真(T),否則為假(F)。具體驗證結(jié)果如表1所示。
Table 1 Experimental verification results表1 實驗驗證結(jié)果
結(jié)果表明,挖礦網(wǎng)頁3 項全部為真即真陽性TP(預(yù)測為正,實際也為正)最大檢出數(shù)為18 個,最小數(shù)也有17 個,其準(zhǔn)確率在85%~90%之間,而其他網(wǎng)頁假陰性FN(預(yù)測為負、實際為正)最多只有1 個。因此,該方法能有效檢測出大多數(shù)挖礦網(wǎng)頁,有較高準(zhǔn)確率。
本文以一個真實的挖礦網(wǎng)站為例,提出兩種基于Chrome 瀏覽器自帶開發(fā)人員工具(DevTools)的自動化動態(tài)檢測分析方法,將兩種動態(tài)檢測分析方法相結(jié)合具有效率高、抗混淆和出錯率低的特點。未來開發(fā)人員可以基于Chrome DevTools Protocol 結(jié)合相關(guān)封裝好的調(diào)用庫開發(fā)相關(guān)檢測工具,以提升檢測水平。在實際中,有一些礦池采用加密通信,對于加密流量如何檢測,本文未作研究,將在下一步進行探索。