虛擬貨幣挖礦檢測與防御
前言
近年來,由于虛擬貨幣區塊鏈等技術和產品的發展,以及虛擬貨幣價值的持續上漲,原本用于DDoS攻擊或者發垃圾郵件的僵尸網絡又看到了另一種新的變現途徑:虛擬貨幣“挖礦”。所以一些被攻陷的主機常常也被植入挖礦木馬,開始偷偷地消耗服務器資源來挖礦,甚至企業的內鬼也會給服務器安裝挖礦木馬,防不勝防。
作為企業,如何檢測防范挖礦這種危害行為?其實挖礦木馬本身是一個程序,同傳統的木馬檢測思路一致,也是從流量層或主機層入手。
流量
1. 挖礦協議
挖礦機器與礦池之間的通信需要遵循特定的協議,目前主流的挖礦協議為Stratum協議,在很久之前還有GBT(getblocktemplate)協議和getwork協議,不過由于帶寬和性能的消耗較多,在7、8年前就已經被新的礦機所拋棄[1] 。
回到Stratum協議,該協議在2012年推出,是從getwork協議的基礎上演變而來的,解決了getwork協議效率低下的問題[2]。在Stratum中,挖礦機器與礦池之間采用TCP的形式傳輸數據,數據傳輸的過程基于JSON-RPC(一個無狀態且輕量級的遠程過程調用RPC傳送協議)。礦機向礦池可使用如下8個發放發送數據:

礦池向礦機則可使用如下7個方法發送數據:

礦機使用Stratum協議的總體工作流程如下:
01 礦機任務訂閱
礦機=>礦池:mining.subscribe
礦池=>礦機:mining.notify
02 礦機認證
礦機=>礦池:mining.authorize
礦池=>礦機:返回認證的結果,true 或者false
03 設置難度和extranonceing.set_extranonce,并通知礦機工作
礦池=>礦機:mining.set_difficulty、mining.set_extranonce、mining.notify
04 礦機提交結果
礦機=>礦池:mining.submit
礦池=>礦機:返回是否接受結果,true 或者false
值得注意的是,上面是標準的Stratum,由Slush Pool(最大的BTC礦池)提出[3],由于加密貨幣的種類繁多,不同的加密貨幣采用的通信協議會有部分不同。比如常見的XMR(門羅幣)挖礦程序xmrig[4]、xmr-stak[5]則會將上述的協議進行修改。
門羅幣簡化了上述流程,通過login方法來進行認證和訂閱。礦池端在接收到login信息后,如果驗證通過,則會直接下發任務——這樣就將標準Stratum協議的三次通信壓縮為一次,大大減少了通信流量。
2. 協議檢測
首先看下真正的挖礦流量是什么樣子:


可以看出,BTC挖礦采用了標準的Stratum協議,其傳輸數據采用標準的json格式,有比較明顯的方法標識,如mining.subscribe、mining.authorize等。
而XMR挖礦流量簡化了上述過程,數據包大概分成了兩類,一類是登錄包,一類是提交包。這兩種包也有明顯的特點:
(1) 首先是有jsonrpc的版本標識,這個是必須要有的。
(2) id字段請求和響應相等,并且逐步遞增。
(3) 帶有明顯的特征字段,例如login、submit、params、seed_hash等
針對上述的特征,可以通過特征工程的方式建立規則,針對性的進行檢測。由于挖礦行為本身的特性,一天中的登錄和認證包較少,而提交包和下發任務的包很多,可針對這種情況進行優化。
3. 檢測對抗
針對礦機與礦池通信的協議檢測僅能覆蓋到明文通信的情況,目前絕大多數礦池都支持了加密通信。

協議加密是未來IDS要解決問題。那么針對加密傳輸的情況,我們能夠在握手協議和證書兩個層面來做一些事情。由于挖礦的特殊性,礦池的域名、證書是不會輕易進行變化的,并且礦池的具有聚集屬性,即越大的礦池集合到的礦機越多,越能夠保證收益的穩定性。所以也可以針對排名較為靠前的礦池進行域名和證書的收集,添加針對性的檢測策略。
主機
早期的挖礦木馬在感染主機后顯著的行為特征是極大的占用CPU及GPU資源,主要包括:高CPU 和 GPU 使用率、響應速度慢、 崩潰或頻繁重新啟動、系統過熱、異常網絡活動(比如連接挖礦相關的域名或 IP)。
隨著對抗的深入和區塊鏈技術的升級,挖礦采取更加隱蔽的CPU/GPU占用,防止被用戶發現,同時出現了一類以占用硬盤空間和網絡帶寬來進行挖礦的虛擬貨幣,CPU并沒有表現出極高的使用率,反而是硬盤被占用了極大的空間,比較有代表性的幣種是Filecoin、Chia、Swarm和Dfinity。
雖然經過多年的演進,挖礦木馬攻擊主機的手法越來越多樣化和精細化,但從攻擊流程來說并沒有大的變化,總體上分為三個階段:
(1) 攻擊者利用主機或者服務漏洞獲取上傳挖礦木馬的必要權限。比如未授權訪問漏洞、Web服務遠程代碼執行漏洞、服務器系統組件漏洞等;
(2) 攻擊者將挖礦木馬上傳到受害主機后,啟動木馬程序自動實現持久化運行和自身隱藏。
(3) 挖礦木馬為了實現收益的最大化,使用內網探測掃描,密碼爆破等方式發現其他潛在受害目標主機,并在內網主機間進行大范圍傳播。
在整個攻擊流程中,主機層面的檢測在上述三個階段中均有合適的切入點,一般會從進程特征,網絡連接,文件特征等多個維度進行檢測。
在第一階段,攻擊者利用已知漏洞對主機進行自動化攻擊,攻擊成功后,接著通過命令執行等方式下載執行挖礦木馬,同時會檢查系統有沒有其他挖礦進程運行,如果有就結束掉,確保自己獨占挖礦資源。通過對常見挖礦木馬腳本命令執行鏈的進行分析,可以比較容易地發現其中的異常。

在第二階段,挖礦木馬植入到受害主機,一般會寫入計劃任務實現持久化,并開始挖礦。

挖礦木馬在進行挖礦時,會對礦池進行DNS查詢和IP連接。通過對比收集的公開礦池域名和IP,在木馬進行網絡連接的時候可以有效告警。
當然,這樣不能檢測連接私有礦池的挖礦木馬,但是對連接公開礦池的挖礦木馬具有很好的檢測能力。如下所示,這是收集的部分公開礦池地址。

除了命令執行鏈和主機網絡連接信息的檢測,大部分挖礦木馬會在主機落地。通過收集大量的挖礦木馬樣本,提取靜態檢測規則或者使用機器學習的方式訓練檢測模型來發現潛在的挖礦木馬。比如科恩實驗室的BianryAI引擎就是類似方法[6]。
在第三階段,挖礦木馬為了實現利益最大化,開始橫向移動,感染更多的機器。高級的挖礦木馬一般會自帶密碼庫和具備掃描爆破功能,用來爆破登陸同一網段里的主機。這部分可以通過東西向流量檢測以及HIDS來發現。
挖礦木馬的縱深防御
1. 威脅情報
無論是因為可利用的漏洞數量(且因為補丁更新會不斷收斂)的原因,還是網絡資源總量的原因,甚至是僵尸網絡互相競爭原因,同時期存在于網絡中的僵尸網絡數量其實是有限的。
如果基于威脅情報共享,那么網絡和計算資源相對豐富的各大型互聯網公司,以及電信運營商所提供的情報幾乎可以覆蓋現網主要挖礦木馬網絡。
TSRC在以往的博文中,也分享過不少木馬與僵尸網絡的IOC信息。從《云端博弈——木馬屠城》[7]一文可以看到,通常活躍的僵尸網絡,其木馬常用的就是幾個固定版本,或者有明顯的家族特征;
從《BORG:一個快速進化的僵尸網絡》[8]可以看到,僵尸網絡的活躍程度與0day\1day的在網絡中的存在周期是相關的,且僵尸網絡雖然也在進化,但也有其家族特征,依然是可以通過威脅情報關聯檢測與打擊。
2. 資金鏈
雖然虛擬貨幣有其宣稱的匿名性和去中心化特點,但大量的虛擬幣需要變現,那么還是會有與資金相關的活動痕跡可追溯。
今年初的時候,幣圈掀起一股所謂的“空投”(發行新的虛擬貨幣的資金募集行為)熱潮,其中大部分都是騙子,募集了散戶投資者資金之后,根本不會上市交易。筆者曾經追蹤過幾個“空投”事件,其募集的‘資金(代幣)’最終都流入了幾個大賬戶,并且走到了交易所。那么走到交易所之后如何追蹤呢?我們來看看下面的案例。
2020年 8月27日,某國通過訴訟,追繳黑客入侵加密數字貨幣交易所盜取的資金。
“在訴訟書中表示,執法人員通過分析區塊鏈來識別特定BTC/ETH地址的所有者。例如,黑客可能會創建多個BTC地址來接收來自不同地址的BTC,當黑客想要處理它接收到的BTC 時,這些收款地址就會發生聚集和關聯。執法部門利用幾家不同的區塊鏈分析公司提供的商業服務來調查虛擬貨幣交易,這些公司通過分析BTC虛擬貨幣交易背后的數據,創建大型數據庫,在數據庫中進行數據關聯推導,最終追蹤溯源到某國黑客的盜竊行為和資金流向。”
結尾
不管是通過網絡層的宙斯盾流量安全分析還是主機層的洋蔥EDR,我們在檢測挖礦木馬的檢測方面都做了大量的工作,既保護了自身業務的安全和穩定,也通過安全產品能力輸出為云客戶提供安全保障(比如上述能力已整合到騰訊云主機安全產品“云鏡”),挖礦治理是需要全行業的合作,歡迎與大家一起探討合作解決。
參考
[1]https://bitcointalk.org/index.php?topic=288963.0
[2] https://zh.braiins.com/stratum-v1
[3] https://braiins.com/stratum-v1/docs
[4] https://xmrig.com/
[5] https://github.com/fireice-uk/xmr-stak
[6] 騰訊主機安全(云鏡)兵器庫:斬殺挖礦木馬的利劍-BinaryAI引擎
[7] 云端博弈——木馬屠城,
https://security.tencent.com/index.php/blog/msg/83