■ 國家計算機網絡應急技術處理協調中心江蘇分中心 邱凌志 顧弘
編者按:惡意軟件往往能夠逃避傳統使用黑名單標記或關注終端惡意代碼檢測的方法。本文提出一種在大規模網絡中檢測惡意軟件分布的方法,聚焦于惡意軟件基礎設施之間的網絡關系,在大規模網絡中區分正常和惡意流量,用以發現傳統檢測方法無法檢測到的惡意軟件。
惡意軟件作為互聯網中最嚴重的網絡安全威脅之一,受害主機一旦感染惡意軟件,便可能被發送垃圾郵件、進行拒絕服務攻擊以及竊取敏感數據。
筆者對超過500 條近半年的互聯網公開威脅情報研究發現,惡意軟件無論是利用暴力破解各類服務端口方式傳播,或者是利用釣魚郵件方式傳播,亦或是利用瀏覽器漏洞的水坑攻擊方式傳播,在注入ShellCode 之后,會從服務端下載真正的惡意程序,然后開展挖礦、勒索及竊取信息等惡意行為,包括組成僵尸網絡。
Shell Code 通常利用HTTP 請求從遠端服務器下載程序,并在本地安裝執行惡意軟件。這些請求一般通過用戶瀏覽器進行簡單的功能調用,從網絡角度來說,與用戶的正常軟件下載請求很難區分。可是,當進入大規模網絡,便會發現大量惡意軟件通過不同主機下載,而這些惡意主機又均與某一服務端相關,呈現出惡意軟件基礎設施分布,這種分布與CDN網絡有些類似,但仍有不同。
本文提出一種在大規模網絡中檢測惡意軟件分布的方法,該方案聚焦于惡意軟件基礎設施之間的網絡關系,在大規模網絡中區分正常和惡意流量,用以發現傳統檢測方法無法檢測到的惡意軟件。
圖1 展現了方案的整體框架和數據流,整個檢測過程可以分為3 個階段:提取階段、篩選階段和分析階段。
系統的輸入數據為大規模網絡中的HTTP 流量。根據ISP 提供的流量數據,每日的HTTP 請求報文數量達到上億級別,不可能直接檢測這一數量級的報文。因此,這一階段的目的是利用白名單的方法過濾掉大部分非惡意流量。
惡意軟件經常修改后綴類型,因此,不能基于HTTP返回報文中的Content-Type字段判斷文件類型,而是需要重放HTTP 請求報文,根據下載文件的MIME 字段判斷文件的真實類型。結果如在預先制定的白名單范圍內,則過濾掉該報文,否則,提取源IP、目的IP、文件Hash 及完整請求URL 等字段生成待檢測記錄。

圖1 方案整體設計
在篩選階段,方案針對惡意攻擊者常用的4 種技術進行檢測。
(1)服務端多態。為了躲避檢測,惡意攻擊者會經常改變服務端惡意文件下載路徑,甚至使用不同的域名,這些方式被稱為服務端多態。
(2)分布式主機。惡意攻擊者為確保惡意服務端有效,通常會使用多個服務端,這種分布式的主機與CDN 網絡有些相似。在這里,使用機器學習的分類算法區分正常CDN 與惡意分布式網絡。
(3)專用惡意主機。惡意攻擊者可能通過重定向技術將受害主機重定向至專用惡意域名,而這些專用惡意域名與正常網頁在頁面、CSS文件和JavaScript 腳本程序方面有許多不同,系統對此加以區分。
(4)掛馬網頁。受害主機首先通過瀏覽器訪問惡意網頁,被注入ShellCode 后會再次連接惡意服務端,可考慮利用User-Agent 字段識別這樣的網絡行為。但用戶使用不同瀏覽器訪問同一網站或者NAT 網絡可能造成誤報,對此需要加以區分。
基于上述兩個階段篩選出的可疑記錄,生成惡意軟件基礎設施網絡分布圖,直觀展現惡意軟件的網絡分布。
在提取階段,首先將存儲在HDFS 的海量HTTP 流量請求報文檢索出來。為了提升下一步重放報文的效率,檢索過程同樣采用域名白名單的方法。域名白名單的制定由統計平均和經驗總結相結合,既包含傳統互聯網頭部企業域名,例如baidu.com、qq.com。也包含新興流行互聯網應用域名,例如yximgs.com、miwifi.com。由此,制定域名白名單Top 100。
第二步,遍歷檢索出的HTTP 請求報文,如果包含文件下載的請求,則重放該報文。然而,下載文件開銷很大,尤其是大文件。幸運的是,可以使用wget 命令只下載文件的前1 KB 大小。此后,通過Linux 的file 命令判斷文件類型,file 命令通過文件頭判斷文件真實類型,而不依據文件后綴。如果命中MIME 白名單(如視頻、音頻、圖片等格式)則舍棄,否則計算文件Hash 值,并提取IP、URL、User-Agent 等字段作為一條記錄,進入下面檢測階段。
第一個檢測機制是捕捉惡意軟件發布者嘗試繞過反病毒軟件基于簽名檢測的行為。檢測方法是檢索滿足如下兩個條件的下載記錄:相同的URI;下載超過n 個不同的文件,文件依據上一階段的Hash 值進行區分,n 的取值在實驗中將進行評估。實際的例子觸發這一檢測機制的URI 如/dlq.rar,該URI 有多種域名變化,如www.9530.ca、585872.com。可以看出,發布者不僅重打包惡意軟件,而且通過域名變換增加了惡意軟件的魯棒性。
檢測方法分為兩個階段:首先,試圖找到CDN;然后,使用一個分類器區分正常CDN與惡意CDN。
第一步,根據文件Hash值將所有記錄進行聚類,即當兩條下載記錄擁有相同 的Hash 值h,而 對 應 的URL 分 別 為u1 和u2 時,將這兩條記錄關聯,形成一個Cluster。如果兩個Cluster存在相同的Domain 或服務端IP,則將這兩個Cluster合并為一個。系統認為所有的Cluster 至少包含兩個記錄,否則無法構成CDN 網絡。
第二步,使用機器學習的方法在上一階段的結果中區分正常CDN 與惡意Cluster,檢測分布式惡意軟件主機。通過對訓練集中的數據手工打標簽的方式,訓練分類器。方案選擇隨機森林的算法作為分類器,以滿足需求。根據對惡意軟件基礎設施的研究,總結以下6 個分類特征:
域名共存:為了減少開銷,惡意軟件常常將很多域名放在同一臺服務器上,這個特征值等于一個Cluster中所有的域名數/IP 數。
頂級域名數:為了逃避域名黑名單的檢測,惡意軟件通常會使用一系列不同的頂級域名,正常的CDN 一般使用同一頂級域名下的二級域名。
每個域名上的路徑數、文件名數:正常的CDN 考慮用戶體驗,會有完整的目錄結構,而惡意軟件則相反。對于上述特征,計算路徑數、文件名數/域名數。
自體輸血也有禁忌證,以下患者不適合自體輸血:采血可能誘發疾病加重者、菌血癥患者、貧血、肝腎功能不良或嚴重心臟病等患者[20]。
每個域名上的URI 數量:惡意軟件發布者在每個域名上通常只使用很少的URI 數量,最常見情形是只有一個。對于這一特征,計算集群域名中所有域名的URI 數量/域名數。
文件類型:正常CDN 會提供不同的文件類型供用戶下載,而惡意軟件服務端提供的最多的是可執行文件。系統計算集群中所有主機的可執行文件數/所有文件數,作為特征指標。
惡意軟件發布者經常使用專用主機隱藏在僵尸網絡幕后。這些主機通常只會存放少量的可執行文件,很少有其他類型的文件。正常主機則包含了HTML 頁面、CSS 文件以及JavaScript 腳本等等。利用這個特征,可以檢測出專用惡意主機。據此,系統發現了112adfdae.tk 這個域名,它被KingMiner 挖礦網絡用來傳播挖礦程序。
觀察掛馬網頁的網絡流量行為特征:連續兩條請求報文,一條來自瀏覽器,一條來自ShellCode。因此,系統尋找來自同一源IP,但User-Agent 字段不同的連續HTTP 請求報文。其中,第一個請求的文件類型必須是可執行文件,然而,NAT 環境會對檢測產生干擾。對此,可以設定一個請求報文的時間間隔閾值,實際檢測過程中設定為1 min,當時間間隔小于這個閾值時,則認為其是惡意軟件行為。符合這一策略的是znshuru.com 域名下的setup_pgytg001.exe文件,瀏覽器下載后會再次下載.dat 格式的惡意文件,User-Agent 字段為NULL。
如圖2 所示,一個最簡單的網絡圖由8 個節點構成,方案關心以下節點之間的關系:
URL 屬于同一完整域名FQDN 或頂級域名Domain;
同一URL 下載的不同文件Hash;
相同URI 或文件名file。

圖2 簡單惡意軟件基礎設施網絡分布圖
開始圖中只有一個URL節點,然后添加URL 到各節點的邊,當2 條記錄存在上述關系時,合并2 條記錄。如此迭代,直到圖無法增長或達到預先設定的大小(比如800 個節點)。
一旦惡意軟件基礎設施網絡分布圖生成,安全分析人員可以直觀地看出圖中的哪個URL 節點或服務端節點(包括域名、IP)是惡意的。這基于簡單的規則:如果節點越孤立,則可能性越低,否則,屬于惡意的概率越大。當然,為了量化這一概率,需要先對邊賦值:
邊url-hash,權重為1;
邊url-server,權重為1;
邊url-client,權重為4;
其余的邊權重均為2。
然后,給出節點j 的惡意概率Pj的計算公式:

其中,shortest_path(i,j)為節點i 到節點j 的最短加權路徑。可以看出,節點距離越近,權重越小,則概率越大。
在討論實驗結果之前,需要先明確判斷下載文件是否為惡意軟件的標準。本文使用VirusTotal檢 測URL、域 名 以 及IP,VirusTotal 使用多個反病毒引擎,當有2 個及以上反病毒引擎檢測結果為惡意時,判斷該對象為惡意的。對于那些VirusTotal 未檢測為惡意的可疑對象,通過沙箱結合人工的方式進行驗證。
服務端多態:在訓練集中,當n 取2 時,檢測惡意URL 的數量為55。然而此時,反病毒軟件的升級請求數量為423,會造成大量誤報,極高的假陽率影響檢測。因此,一方面可通過域名白名單對反病毒軟件進行過濾,另一方面根據實驗結果,取n 為10。改善后,該方法的檢測準確率達到93.4%,假陽率僅為6.6%。
分布式主機:實驗中使用隨機森林作為分類器區分正常CDN 和惡意CDN。在訓練集中,初始參數的隨機森林成績僅有0.87 左右,經過參數調整優化,方案對分布式主機的檢測準確率達到92.1%。在測試集中,經驗證實際的準確率稍有降低,數值為85.2%。

表1 方案整體評估
整體評估:實驗中發現專用惡意主機、掛馬網頁兩種檢測方法相較前兩種方法準確率稍微低一些,這是因為有小部分正常的流量請求也滿足檢索條件。將4 種檢測方法結合,在表1 中給出整體實驗結果,評估方案的有效性。
在訓練集中,檢測結果去重后給出166 條惡意記錄。通過驗證后,發現其中存在21 條誤報,準確率為87.3%。在測試集中,檢測結果去重后給出369 條惡意記錄,通過驗證后,發現其中存在132 條誤報,準確率為64.2%。可以看到,隨著測試數據的增多,系統準確率也出現了下降。幸運的是,由于惡意軟件基礎設施變化較快,檢測對象為一段時間T 內的流量數據,T 的取值一般為最近一天,最長至最近一周。T 如果時間太長,許多設施便會無法訪問。
此外,使用樣本集共161條惡意流量數據進行測試,方案共檢測出其中108 條,假陰率為32.9%。這是因為,樣本集中有一些獨立的惡意URL,比如doc、jar 為后綴的,與其他URL 未呈現相關性,方案對此難以識別。不過,傳統惡意軟件可以通過黑名單的方式檢測,方案的目標是輔助傳統檢測方法,而不是代替它。
最后,在2019 年11 月的測試集中,方案檢測到一個惡意域名es.ldbdhm.xyz,它被用作發布眾多jpg 后綴的惡意文件,這些文件實際上是可執行pe 文件。可以關注到,2019 年12 月互聯網公開了相關威脅情報,它是“紫狐”木馬使用的最新惡意域名,這表明了方案的有效性。
生成圖統計:圖3 展現的一個真實惡意軟件基礎設施網絡分布圖,包含14 條檢測記錄,由于部分節點相同,因此節點數小于14 乘以字段數8,實際共79 個節點。實驗中,訓練集、測試集中分別生成了30 和66 幅惡意軟件基礎設施網絡分布圖,占比最多的為節點數小于50的生成圖。節點數小于50的生成圖網絡關系比較簡單甚至無相關性,因此方案的誤報也集中在這一區間。

圖3 真實的惡意軟件基礎設施網絡分布圖
本文提出一種新的在大規模網絡中挖掘惡意軟件分布的方法,區別于傳統惡意軟件檢測方案,該方案不使用黑名單或終端行為特征檢測技術,而是聚焦挖掘惡意軟件網絡基礎設施,輔助發現那些多變化的惡意軟件,彌補傳統檢測方案的不足。
然而,在大規模網絡流量中區分正常和惡意報文給檢測工作帶來挑戰。本文使用白名單、機器學習分類技術,結合網絡關系可視化,完成了檢測方案的設計。筆者實現了方案的原型系統,分別選擇真實的2 天HTTP 城域網級別流量作為訓練集,7 天城域網級別HTTP 流量作為測試集,對系統進行了評估。
實驗表明,系統能夠有效檢測大規模網絡中的惡意軟件網絡分布關系,以及尚未公布的惡意軟件網絡基礎設施。