李德奇,胡大裟,劉云霞,蔣玉明
(四川大學(xué)計算機學(xué)院,成都610065)
僵尸網(wǎng)絡(luò)是當(dāng)前最主要的網(wǎng)絡(luò)安全威脅之一,種類主要包括信息竊取、拒絕服務(wù)攻擊、勒索病毒、垃圾郵件、挖礦病毒等??煽匦院蛥f(xié)同性是僵尸網(wǎng)絡(luò)兩個基本特性[1],而命令控制信道是兩者實現(xiàn)的關(guān)鍵。命令控制信道主要用于控制者與僵尸主機之間的信息傳遞和交互,其決定了整個僵尸網(wǎng)絡(luò)的高效性和健壯性。在對抗僵尸網(wǎng)絡(luò)過程中,破壞與瓦解僵尸網(wǎng)絡(luò)的命令控制信道是最主要的方式。所以命令控制信道的健壯性決定了僵尸網(wǎng)絡(luò)的生存能力。
Gtbot[2]是歷史上第一個出現(xiàn)的僵尸網(wǎng)絡(luò),該網(wǎng)絡(luò)基于IRC 協(xié)議實現(xiàn)命令控制。IRC 協(xié)議具有實現(xiàn)簡單,廣泛使用的優(yōu)點??刂普咄ㄟ^公共的IRC 聊天室下發(fā)指令,指令傳遞非常高效。IRC 僵尸網(wǎng)絡(luò)命令控制實現(xiàn)如下:
(1)僵尸網(wǎng)絡(luò)控制者在IRC 服務(wù)器上創(chuàng)建一個聊天室,并將聊天室地址硬編碼到僵尸程序中;
(2)僵尸主機通過硬編碼的地址加入聊天室并等待獲取控制命令;
(3)控制者將控制指令發(fā)布到聊天室公告中或通過一對一或一對多的方式向僵尸主機下發(fā)指令。后者要求控制者在線,這也是最為常用的一種方式;
(4)僵尸主機獲取指令并完成響應(yīng)。
由于IRC 服務(wù)器通常由公共服務(wù)商提供,在網(wǎng)絡(luò)安全機構(gòu)和服務(wù)提供商的配合下,基于IRC 協(xié)議的僵尸網(wǎng)絡(luò)很容易被瓦解和摧毀,只需服務(wù)提供商關(guān)閉僵尸網(wǎng)絡(luò)用于傳遞指令的聊天室即可。
Bobax[3]是第一個基于HTTP 協(xié)議實現(xiàn)命令控制的僵尸網(wǎng)絡(luò),該網(wǎng)絡(luò)最早出現(xiàn)于2004 年。此外2006 年出現(xiàn)的垃圾郵件僵尸網(wǎng)絡(luò)Rustock[4]和點擊欺詐僵尸網(wǎng)絡(luò)Clickbot 以及2007 年出現(xiàn)的竊密型僵尸網(wǎng)絡(luò)ZeuS均采用HTTP 協(xié)議作為其命令控制信道實現(xiàn)協(xié)議。
HTTP 協(xié)議作為最常使用的應(yīng)用層協(xié)議,具有很好的通用性。將僵尸網(wǎng)絡(luò)的命令控制流量混雜在海量的正常請求中,可實現(xiàn)流量的隱藏,并能穿透IDS 和防火墻等安全設(shè)備[5]。HTTP 支持對通信內(nèi)容進行加密(HTTPS),同時延遲較低可高效傳輸命令,HTTP 協(xié)議的這些優(yōu)點使得其成為當(dāng)前最主流的僵尸網(wǎng)絡(luò)命令控制信道協(xié)議之一。HTTP 僵尸網(wǎng)絡(luò)命令控制實現(xiàn)如下:
(1)僵尸網(wǎng)絡(luò)控制者利用公共Web 服務(wù)器或自建Web 服務(wù)器并通過網(wǎng)頁發(fā)布指令和接收數(shù)據(jù),將指定網(wǎng)頁的URL 地址硬編碼到僵尸程序中;
(2)僵尸主機通過硬編碼的URL 地址輪詢請求網(wǎng)頁內(nèi)容,向網(wǎng)頁提交本機信息(包括ID、主機名、IP 地址、MAC 地址、操作系統(tǒng)、硬件信息等),并從網(wǎng)頁中獲取控制命令;
(3)控制者將控制指令內(nèi)容發(fā)布到網(wǎng)頁中;
(4)僵尸程序輪詢從網(wǎng)頁中獲取指令并完成響應(yīng)。
早期的HTTP 僵尸網(wǎng)絡(luò)通常采用靜態(tài)尋址方式,隨著網(wǎng)絡(luò)安全技術(shù)的發(fā)展,此方式容易被安全防御人員識別并封鎖,造成命令控制信道被阻斷。基于此,攻擊者嘗試對傳統(tǒng)的方式進行改進,采用動態(tài)尋址機制以增強信道的健壯性,典型的改進協(xié)議包括Domain-Flux[6]和Fast-Flux[7]。
(1)Domain-Flux 僵尸網(wǎng)絡(luò)
Domain-Flux 僵尸網(wǎng)絡(luò)將多個域名映射到幾個或少量的IP 地址,其實現(xiàn)的核心技術(shù)是域名生成算法(Domain Generation Algorithm,DGA)。僵尸網(wǎng)絡(luò)控制者和僵尸主機共享同一套DGA,通過相同的輸入(如系統(tǒng)時間、熱門話題等)生成大量的域名,控制者將其中的一個域名解析到命令控制(Command & Control,C&C)服務(wù)器的IP 地址,僵尸主機依次檢測DGA 生成域名的有效性,一旦檢測到某個域名有效,即可通過該域名與C&C 服務(wù)器進行通信,獲取控制指令。由于DGA 算法在短時間內(nèi)動態(tài)生成大量域名并進行查詢,安全研究防護人員很難在短時間內(nèi)查詢和檢測到C&C 服務(wù)器的地址,無法快速切斷僵尸網(wǎng)絡(luò)的命令控制信道。
(2)Fast-Flux 僵尸網(wǎng)絡(luò)
Fast-Flux 僵尸網(wǎng)絡(luò)將某個域名動態(tài)映射到多個代理節(jié)點的IP,映射關(guān)系快速變換,將C&C 服務(wù)器隱藏在代理節(jié)點后面,而代理節(jié)點從被感染的僵尸主機中產(chǎn)生。僵尸主機輪詢C&C 服務(wù)器的域名時,公網(wǎng)DNS 服務(wù)器返回代理節(jié)點的IP 地址。僵尸主機與C&C 服務(wù)器進行通信時,由代理節(jié)點將請求轉(zhuǎn)發(fā)給Mothership[8],并將Mothership 的請求響應(yīng)轉(zhuǎn)發(fā)給僵尸主機,如圖1。將C&C 服務(wù)器隱藏于大量代理節(jié)點之后,可規(guī)避通過屏蔽IP 地址的方法清除僵尸網(wǎng)絡(luò)。
Slapper 是第一個P2P 僵尸網(wǎng)絡(luò),該網(wǎng)絡(luò)出現(xiàn)于2002 年。區(qū)別于在IRC 僵尸網(wǎng)絡(luò)和HTTP 僵尸網(wǎng)絡(luò)中所有僵尸主機都通過一個或多個域名連接到一個或多個中心命令控制服務(wù)器,P2P 僵尸網(wǎng)絡(luò)建立在一個相對分散的網(wǎng)絡(luò)環(huán)境,網(wǎng)絡(luò)中所有主機都相互連接并通信,中心依賴相對較弱,網(wǎng)絡(luò)健壯性較強,但是P2P 僵尸網(wǎng)絡(luò)協(xié)議實現(xiàn)過程仍然存在不足。
(1)初始化存在中心
僵尸主機初始化時從僵尸程序中讀取硬編碼的緩存服務(wù)器或連接列表中的節(jié)點并請求加入到僵尸網(wǎng)絡(luò)中,該過程通常被稱為bootstrap。而bootstrap 中采用靜態(tài)尋址的資源一旦失效,則新感染的僵尸主機無法加入網(wǎng)絡(luò)獲取控制指令。所以中心化的緩存服務(wù)器或連接列表是bootstrap 中脆弱的環(huán)節(jié),一旦失效,后續(xù)感染的主機無法加入僵尸網(wǎng)絡(luò)。
(2)命令認(rèn)證不完備
P2P 協(xié)議的實現(xiàn)多種多樣,在純P2P 網(wǎng)絡(luò)中,每個節(jié)點均可充當(dāng)服務(wù)端,基于此構(gòu)建的P2P 僵尸網(wǎng)絡(luò),理論上任何人都可以向網(wǎng)絡(luò)中注入命令。而基于索引模式的P2P 協(xié)議缺乏對索引提供者身份進行有效認(rèn)證,此時容易受到索引投毒污染。
2008 年11 月中本聰發(fā)表論文《比特幣:一種點對點的電子現(xiàn)金系統(tǒng)》[9],闡述了基于P2P 網(wǎng)絡(luò)技術(shù)、加密技術(shù)、時間戳等技術(shù)構(gòu)建電子現(xiàn)金系統(tǒng),比特幣就此誕生,區(qū)塊鏈技術(shù)進入人們的視野。區(qū)塊鏈技術(shù)是綜合了分布式數(shù)據(jù)存儲、點對點傳輸、共識機制、加密算法等計算機技術(shù)的新型應(yīng)用模式,有效地解決了去中心化問題,具有開放性、數(shù)據(jù)防篡改和匿名性等特點。鏈上存儲的數(shù)據(jù)永久存儲且不可被任何組織或個人非法篡改。區(qū)塊鏈為人們帶來改變的同時,也引入新的問題,例如惡意使用者利用區(qū)塊鏈存儲傳播不良信息,攻擊者利用區(qū)塊鏈來構(gòu)建僵尸網(wǎng)絡(luò)命令控制信道。
本節(jié)主要研究如何在比特幣交易過程中利用可控字段實現(xiàn)消息的隱藏和傳遞。深入研究比特幣交易過程和其技術(shù)實現(xiàn)可知比特幣交易過程中有三個字段可被用戶控制,包括交易金額值,未花費的交易輸出(Unspent Transaction Output,UTXO)和 交 易 備 注 字 段OP_RETURN。以下就利用三個不同字段分別傳遞消息進行介紹和對比分析。
(1)通過發(fā)送金額值傳遞信息
由于用戶可以自行控制交易金額,故可將僵尸網(wǎng)絡(luò)命令隱藏到金額值中。假如僵尸網(wǎng)絡(luò)控制者想要將“DDOS”命令寫入到比特幣區(qū)塊鏈中,首先將“DDOS”編碼轉(zhuǎn)換成對應(yīng)的十進制數(shù)值1145327443,然后通過帳戶A 將價值1145327443 Satoshi 的比特幣轉(zhuǎn)賬給帳戶B,交易確認(rèn)之后,帳戶B 收到該筆轉(zhuǎn)賬,僵尸程序讀取區(qū)塊鏈對該筆交易金額進行解碼即可得到明文消息“DDOS”。
(2)通過UTXO 傳遞信息
在比特幣系統(tǒng)中并沒有余額的概念,錢包工具中的余額是將用戶所有的UTXO 相加起來得到的。比特幣的交易由交易輸入和交易輸出組成,每一筆交易都要花費(spend)一筆或多筆輸入,產(chǎn)生一筆或多筆輸出(output),而其所產(chǎn)生的輸出,就是“未花費過的交易輸出”[13-14],也就是UTXO。Counterparty[10]和Mastercoin[11]均曾使用unspendable outputs 在交易中插入消息。本節(jié)參照Mastercoin 的實現(xiàn)思路,通過UTXO 打造一個僵尸網(wǎng)絡(luò)命令控制信道,僵尸網(wǎng)絡(luò)的命令協(xié)議格式如下:<命令I(lǐng)D><參數(shù)1><…><參數(shù)n>。根據(jù)比特幣地址的生成規(guī)則,將命令的內(nèi)容編碼成一個或者多個輸出地址。由于地址長度的限制,每一個輸出地址最多能包含20 字節(jié)的命令內(nèi)容,針對長度大于20 字節(jié)的命令,需要將其分段編碼。圖2 的交易中包含一條僵尸網(wǎng)絡(luò)控制指令,指令內(nèi)容為“1 192.168.1.1 443 1547275896 3600”,具體含義為于2019-01-12 14:51:36對目標(biāo)192.168.1.1 的443 端口開啟SYN Flood 攻擊,持續(xù)時間為3600 秒。交易中轉(zhuǎn)賬金額為6000+x 的輸出代表這是第x 段指令內(nèi)容,其對應(yīng)的輸出地址(圖2中的黑色字體部分)中包含該段指令的內(nèi)容,每一段指令包含20 字節(jié)的內(nèi)容,不滿20 字節(jié)的使用空格填充。

圖2 僵尸網(wǎng)絡(luò)命令解析
單個unspendable outputs 最多可插入20 字節(jié)的信息,而一筆交易中可以包含多個輸出。大量使用unspendable outputs 傳遞信息會引起UTXO 膨脹,大量比特幣被封存到無法花費的地址中,造成比特幣的浪費。
(3)通過OP_RETURN 傳遞信息
2013 年比特幣加入OP_RETURN 腳本命令,它后面可以緊跟80 字節(jié)的數(shù)據(jù),用于存儲和交易邏輯無關(guān)的數(shù)據(jù),可以起到備注的作用。OP_RETURN 的引入有效解決了UTXO 集合膨脹的問題,同時OP_RETURN 具有操作簡單,使用靈活,存儲容量相對較大,使用廣泛,成本低等優(yōu)點。圖3 所示,2015 年6 月開始,OP_RETURN 的使用頻率大幅增長,2018 年9 月開始呈爆發(fā)式增長。

圖3 OP_RETURN每月使用情況
相比上述兩種在區(qū)塊鏈上構(gòu)建命令控制信道的方式,OP_RETURN 更適合用于構(gòu)建僵尸網(wǎng)絡(luò)命令控制信道。使用OP_RETURN 傳遞僵尸網(wǎng)絡(luò)控制命令幾乎不受賬戶余額的影響,操作更加簡單方便;單筆交易最大可以傳遞80 字節(jié)的指令內(nèi)容,能容納絕大部分的控制指令;將指令內(nèi)容加密傳輸,可使得命令控制信道更加隱蔽和安全;交易不會引起UTXO 集合膨脹而造成貨幣的浪費,指令傳遞的成本相對較低。
由于單筆交易最大可以傳遞80 字節(jié)的指令內(nèi)容,針對超過80 字節(jié)的長指令需將其拆分到多筆交易中。為了適配長短指令,設(shè)計表1 中的分片格式,將長指令內(nèi)容進行分段,每一筆交易包含一段指令內(nèi)容,僵尸主機將多筆交易中的OP_RETURN 提取并組合成完整的指令然后完成相應(yīng)的操作。如表,超過75 字節(jié)的指令將被拆分到不同的交易中傳遞,而不大于75 字節(jié)的指令不再進行拆分,一筆交易即可完成指令傳遞。

表1 分片協(xié)議格式
為了保證僵尸網(wǎng)絡(luò)控制權(quán)不被奪取,僵尸主機需要對接收到的指令進行認(rèn)證。認(rèn)證的方式可通過限定交易的雙方,因為區(qū)塊鏈上賬戶的地址通常由其公鑰計算得到,只有擁有私鑰的用戶才能使用該賬戶發(fā)起交易,由公鑰直接得到相對應(yīng)的私鑰目前幾乎不可能實現(xiàn),從而有效保證了控制命令的可信度。
在比特幣區(qū)塊鏈上實現(xiàn)僵尸網(wǎng)絡(luò)控制命令信道步驟如下,圖4 展示了僵尸網(wǎng)絡(luò)控制者通過OP_RETURN 字段下發(fā)命令和僵尸主機獲取命令的過程:
(1)僵尸網(wǎng)絡(luò)控制者在區(qū)塊鏈上分別創(chuàng)建賬戶A和賬戶B,并將賬戶A 和賬戶B 的地址硬編碼到僵尸程序中;
(2)僵尸主機輪詢從區(qū)塊鏈上讀取從賬戶A 到賬戶B 的最新交易,提取并解析OP_RETURN 字段的內(nèi)容,得到最新的指令;
(3)攻擊者創(chuàng)建交易,使用賬戶A 向賬戶B 發(fā)起一筆或多筆轉(zhuǎn)賬,并將控制指令嵌入交易中的OP_RETURN 字段,交易被確認(rèn)后,控制指令被永久寫入比特幣區(qū)塊鏈中;
(4)僵尸主機輪詢從區(qū)塊鏈上讀取指令并完成響應(yīng)。

圖4 OP_RETURN實現(xiàn)命令傳遞
Nick Szabo 于1996 年第一次提出智能合約的定義:一個智能合約是一套以數(shù)字形式定義的承諾,以及合約參與方在其上執(zhí)行這些承諾的協(xié)議[12]。區(qū)塊鏈的出現(xiàn)使得智能合約的執(zhí)行獲得了可信的環(huán)境,以太坊[17]首先實現(xiàn)了區(qū)塊鏈和智能合約的完整契合,標(biāo)志著區(qū)塊鏈進入2.0 時代。智能合約可應(yīng)用于金融服務(wù)、身份認(rèn)證、物流跟蹤、數(shù)據(jù)存儲、資產(chǎn)管理和游戲娛樂等行業(yè),具有良好的應(yīng)用前景。由于區(qū)塊鏈的去中心化、開放性、匿名性和不可篡改性等特性,以及智能合約實現(xiàn)的靈活性,攻擊者通過區(qū)塊鏈上的智能合約來構(gòu)建僵尸網(wǎng)絡(luò)命令控制信道,可使得命令控制信道堅不可摧。
與使用比特幣交易中OP_RETURN 字段傳遞消息相比,利用智能合約來傳遞信息實現(xiàn)上更為靈活,操作上更簡單,單次傳遞的信息量更大。以太坊上的智能合約可使用Solidity、Serpent 等語言編寫,編譯后的機器碼可以在以太坊虛擬機EVM 上運行,如圖5。智能合約部署后,外部用戶可通過合約接口調(diào)用合約獲取信息。通過以下智能合約Demo 可實現(xiàn)命令的傳遞,將合約編譯部署到以太坊上得到合約地址Addr,結(jié)合該智能合約的abi 接口,外部用戶可以調(diào)用該智能合約中的函數(shù)獲取信息。

圖5 智能合約編譯、部署、運行
pragma solidity^0.4.24;
contract CMDManager{
string Command; //傳遞信息的變量
constructor(string_command)public{
if(bytes(_command).length==0){
Command="No Message!";}
else{
Command=_command;}
}
function getCommand()constant public returns(string){//獲取信息
return Command;
}
function setCommand(string_command)public{//設(shè)置信息
if(bytes(_command).length==0)
{
Command="No Message!";}
else{
Command=_command;}
}
}
僵尸網(wǎng)絡(luò)使用智能合約實現(xiàn)控制命令信道過程如下,圖6 是通過智能合約傳遞指令的過程:
(1)僵尸網(wǎng)絡(luò)控制者編寫智能合約并部署到以太坊上,得到智能合約地址。將智能合約地址和智能合約abi 接口信息硬編碼到僵尸程序中;
(2)僵尸程序第一次運行時,同步區(qū)塊,在以太坊上創(chuàng)建帳戶,并通過硬編碼的智能合約地址和接口信息調(diào)用智能合約,提交本機信息(帳戶地址、主機名、IP地址、MAC 地址、操作系統(tǒng)、硬件信息等)。僵尸主機輪詢調(diào)用智能合約獲取控制命令。
(3)攻擊者通過合約創(chuàng)建者調(diào)用部署的智能合約,獲取僵尸主機信息并下發(fā)控制指令。
(4)僵尸主機輪詢調(diào)用智能合約獲取控制指令并完成響應(yīng)。

圖6 智能合約實現(xiàn)命令傳遞
通過提取已經(jīng)獲取的僵尸程序樣本,提取出其文件特征(如文件hash、代碼特征、數(shù)據(jù)特征等)并簽名,并將這些特征簽名信息作為檢測標(biāo)準(zhǔn),一旦文件中包含全部或者部分特征,即可判定為某僵尸程序或其變種。該方法可在不運行程序的情況下進行檢測,但隨著特征碼庫的不斷積累,檢測時間會越來越長,對于未知的惡意代碼或能自變異的惡意代碼檢測效果不佳。
動態(tài)分析是在虛擬機環(huán)境中運行代碼樣本,并對樣本進行監(jiān)控,獲取樣本所有運行時數(shù)據(jù),然后分析其運行時數(shù)據(jù)流、控制流等信息,判斷樣本的惡意性[18]。通過HOOK 技術(shù)攔截程序的系統(tǒng)調(diào)用,監(jiān)控程序的行為,如文件操作、注冊表操作、遠(yuǎn)程注入行為、網(wǎng)絡(luò)行為、調(diào)用區(qū)塊鏈的行為等,將監(jiān)控到的信息提交到監(jiān)控中心或網(wǎng)絡(luò)服務(wù)器進行分析處理,分析處理模塊可以采用改進的攻擊樹算法來分析判斷。改進的攻擊樹算法是在傳統(tǒng)的攻擊樹[19-20]算法基礎(chǔ)上添加程序在區(qū)塊鏈上的行為分析,如讀取某用戶的交易信息,調(diào)用某個智能合約的函數(shù)等行為。監(jiān)控中心通過分析程序的行為并對程序的惡意性作出有效判斷。動態(tài)行為特征檢測能有效地檢測到已知惡意代碼的變種。
區(qū)塊鏈社區(qū)在區(qū)塊鏈上添加黑名單功能,通過用戶參與的方式將惡意交易地址加入到黑名單中,限制惡意用戶的使用。黑名單中的用戶無法參與正常的交易,從而限制區(qū)塊鏈的惡意使用。
經(jīng)過多年的發(fā)展,僵尸網(wǎng)絡(luò)命令控制信道靈活多樣,傳統(tǒng)僵尸網(wǎng)絡(luò)雖然存在或多或少的缺陷,安全人員可以利用這些缺陷接管或瓦解整個僵尸網(wǎng)絡(luò),但傳統(tǒng)僵尸網(wǎng)絡(luò)仍然是當(dāng)前最大的網(wǎng)絡(luò)威脅之一。區(qū)塊鏈技術(shù)出現(xiàn)后,有效解決了當(dāng)前僵尸網(wǎng)絡(luò)普遍存在的中心化和命令認(rèn)證不完備的問題,僵尸網(wǎng)絡(luò)使用區(qū)塊鏈技術(shù)構(gòu)建命令控制信道勢必將給互聯(lián)網(wǎng)安全帶來更大的威脅。
本文通過分析僵尸網(wǎng)絡(luò)命令控制信道的發(fā)展以及構(gòu)建方法,分別分析基于IRC 協(xié)議、HTTP 協(xié)議、P2P 協(xié)議構(gòu)建的僵尸網(wǎng)絡(luò)存在的缺陷、問題以及對抗方法思路。介紹了兩種結(jié)合區(qū)塊鏈技術(shù)構(gòu)建僵尸網(wǎng)絡(luò)命令控制信道的方法,并提出自己的防御建議。未來隨著區(qū)塊鏈技術(shù)的發(fā)展,公有鏈的使用門檻會更低,更多的僵尸網(wǎng)絡(luò)會使用區(qū)塊鏈來構(gòu)建穩(wěn)固健壯的命令控制信道,安全研究人員應(yīng)提前對此類僵尸網(wǎng)絡(luò)進行研究,并預(yù)先提出相對應(yīng)的對策,盡早消除此類僵尸網(wǎng)絡(luò)的威脅。