謝萱萱,李俊娥,李福陽,許逸凡,劉林彬,陳錦山
(1.空天信息安全與可信計(jì)算教育部重點(diǎn)實(shí)驗(yàn)室 (武漢大學(xué)國(guó)家網(wǎng)絡(luò)安全學(xué)院),武漢市 430072;2.國(guó)網(wǎng)福建省電力有限公司電力科學(xué)研究院,福州市 350000)
“雙碳”目標(biāo)下,隨著分布式能源的大規(guī)模接入和源網(wǎng)荷儲(chǔ)的協(xié)同消納,海量智能終端接入新型電力系統(tǒng)[1],系統(tǒng)暴露面日益擴(kuò)大,信息物理系統(tǒng)(cyber physical system,CPS)的耦合效應(yīng)使得網(wǎng)絡(luò)攻擊對(duì)電網(wǎng)安全穩(wěn)定運(yùn)行的威脅也日益增大[2]。
分析現(xiàn)有的典型網(wǎng)絡(luò)攻擊事件[3-5]可知,后門常被攻擊者用來繞過安全機(jī)制。攻擊者可以在系統(tǒng)中留下后門以保持秘密通道,再次入侵時(shí)便可繞過身份驗(yàn)證等安全機(jī)制[4]。并且后門還具有隱藏自身或其他惡意代碼、清除訪問痕跡等功能[6-8],使得攻擊潛伏期更長(zhǎng)、更隱秘,更不易被檢測(cè)到。例如,SSH后門被BlackEnergy利用來連接C&C服務(wù)器,下載KillDisk組件清空系統(tǒng)日志和刪除覆蓋相關(guān)文件,并清除攻擊痕跡[9]。新型電力系統(tǒng)中,由于網(wǎng)絡(luò)空間的開放性,智能終端的后門更容易被攻擊者利用。因此,對(duì)電力智能終端開展后門檢測(cè)可以及時(shí)發(fā)現(xiàn)和清除隱患,極大程度上避免遭受攻擊,保障電力系統(tǒng)安全運(yùn)行。
現(xiàn)有后門檢測(cè)方法包括可執(zhí)行路徑分析法、特征碼對(duì)比法、行為檢測(cè)法、基于虛擬機(jī)的檢測(cè)方法和基于機(jī)器學(xué)習(xí)的檢測(cè)方法等[10]。由于智能終端計(jì)算和存儲(chǔ)資源有限,下文按照資源開銷大小將各類方法進(jìn)行分類綜述。
現(xiàn)有方法中,可執(zhí)行路徑分析法、特征碼對(duì)比法和行為檢測(cè)法的資源開銷較少。可執(zhí)行路徑分析法主要是通過建立每個(gè)系統(tǒng)調(diào)用的執(zhí)行路徑,以檢測(cè)異常系統(tǒng)調(diào)用。例如,文獻(xiàn)[11]基于細(xì)粒度控制流完整性(control flow integrity,CFI),提出了基于狀態(tài)機(jī)和CFI約束規(guī)則的檢測(cè)模型,可檢測(cè)內(nèi)核級(jí)代碼復(fù)用攻擊。這類方法適用性窄,且實(shí)現(xiàn)較為復(fù)雜。特征碼對(duì)比法使用靜態(tài)特征(如字節(jié)序列、字符串和匯編指令等)進(jìn)行后門檢測(cè)。例如,文獻(xiàn)[12]通過文件檢測(cè)和可加載內(nèi)核模塊(loadable kernel modules,LKM)檢測(cè)后門的文件修改行為和內(nèi)核可疑行為;文獻(xiàn)[13]基于文件特征、內(nèi)核關(guān)鍵數(shù)據(jù)結(jié)構(gòu)等進(jìn)行后門檢測(cè);文獻(xiàn)[14]基于API調(diào)用序列提出基于馬爾科夫鏈的惡意軟件檢測(cè)方法。這類方法檢測(cè)效率高,但單特征檢測(cè)方法的準(zhǔn)確率不高。行為檢測(cè)主要是用于檢測(cè)惡意代碼的功能行為。例如,文獻(xiàn)[15]利用惡意代碼必須改變控制流或數(shù)據(jù)結(jié)構(gòu)的特點(diǎn),根據(jù)虛擬內(nèi)存訪問模式對(duì)惡意行為分類,可檢測(cè)內(nèi)核Rootkit后門;文獻(xiàn)[16]針對(duì)Rootkit隱蔽性強(qiáng)的問題,提出基于Rootkit隱藏行為特征的取證方法,可對(duì)未知惡意代碼進(jìn)行取證;文獻(xiàn)[17]提出一種基于網(wǎng)絡(luò)流量差異的分析方法,可檢測(cè)具有網(wǎng)絡(luò)連接特征的后門。這類方法檢測(cè)準(zhǔn)確率高,但誤報(bào)率也高。
基于虛擬機(jī)的檢測(cè)方法和基于機(jī)器學(xué)習(xí)的檢測(cè)方法資源開銷較大。基于虛擬機(jī)的檢測(cè)將被監(jiān)控系統(tǒng)和檢測(cè)系統(tǒng)安裝在不同的虛擬機(jī)中運(yùn)行,通過檢測(cè)操作系統(tǒng)內(nèi)核對(duì)象視圖的變化來判斷系統(tǒng)是否感染后門。例如,文獻(xiàn)[18]通過在虛擬機(jī)中跟蹤內(nèi)核系統(tǒng)調(diào)用,采用非線性、相空間算法以標(biāo)記感染和未感染主機(jī)之間的差異;文獻(xiàn)[19]基于虛擬機(jī)自省技術(shù),提出一種Rootkit檢測(cè)方法,可定位Rootkit文件并清除;文獻(xiàn)[20]通過跟蹤內(nèi)核活動(dòng)來過濾Rootkit的LKM。文獻(xiàn)[21]提出一種基于虛擬機(jī)架構(gòu)的計(jì)數(shù)追蹤檢測(cè)方法,將理想狀態(tài)和實(shí)際的內(nèi)核函數(shù)調(diào)用情況進(jìn)行對(duì)比,實(shí)現(xiàn)異常檢測(cè)。這類方法計(jì)算和存儲(chǔ)資源開銷大,且需要虛擬機(jī)進(jìn)行輔助?;跈C(jī)器學(xué)習(xí)的檢測(cè)則是利用機(jī)器學(xué)習(xí)算法進(jìn)行模型訓(xùn)練和檢測(cè)。例如,文獻(xiàn)[22]基于硬件性能計(jì)數(shù)器和機(jī)器學(xué)習(xí)檢測(cè)Rootkit后門;文獻(xiàn)[23-26]將惡意代碼轉(zhuǎn)換為二維圖像,使用深度學(xué)習(xí)模型進(jìn)行紋理分析以檢測(cè)Rootkit后門或惡意代碼;文獻(xiàn)[27-28]將機(jī)器學(xué)習(xí)和虛擬機(jī)內(nèi)存取證等結(jié)合,可檢測(cè)內(nèi)核Rootkit后門;文獻(xiàn)[29]考慮攻擊流量自相似特征,提出了一種基于長(zhǎng)短期記憶網(wǎng)絡(luò)的檢測(cè)方法;文獻(xiàn)[30]提出了基于改進(jìn)生成對(duì)抗網(wǎng)絡(luò)和極端隨機(jī)樹的攻擊檢測(cè)模型。但這類方法模型訓(xùn)練時(shí)間長(zhǎng)、計(jì)算和存儲(chǔ)資源開銷大、數(shù)據(jù)集要求高。
綜上所述,現(xiàn)有后門檢測(cè)技術(shù)用于電力智能終端后門檢測(cè)時(shí)存在如下不足:
1)電力智能終端后門樣本量少,無法使用基于大樣本數(shù)據(jù)的后門檢測(cè)方法,例如基于虛擬機(jī)和機(jī)器學(xué)習(xí)的檢測(cè)方法;
2)現(xiàn)有特征碼對(duì)比法可用于電力智能終端后門檢測(cè),但其通常基于單一特征進(jìn)行檢測(cè),無法完整表征后門異常行為,準(zhǔn)確率不高;
3)現(xiàn)有檢測(cè)方法多是基于單一檢測(cè)技術(shù),每種檢測(cè)技術(shù)有各自的優(yōu)缺點(diǎn)和適用場(chǎng)景,單一檢測(cè)技術(shù)的準(zhǔn)確率不高。
針對(duì)電力智能終端后門樣本量少和基于單一特征的檢測(cè)方法準(zhǔn)確率不高的問題,本文基于現(xiàn)有后門樣本詳細(xì)分析其特性、行為及代碼特征,從字符串特征和函數(shù)調(diào)用序列特征兩方面入手,構(gòu)建多特征融合的后門特征庫(kù),實(shí)現(xiàn)對(duì)后門的多方位靜態(tài)檢測(cè);針對(duì)靜態(tài)檢測(cè)方法不適用加密、多態(tài)、變形等后門變體或加殼程序的問題,本文提出基于運(yùn)行狀態(tài)的檢測(cè)方法,從文件狀態(tài)、網(wǎng)絡(luò)狀態(tài)和隱藏行為三方面實(shí)現(xiàn)對(duì)后門異常行為的動(dòng)態(tài)檢測(cè),進(jìn)一步提高后門檢測(cè)的覆蓋率與準(zhǔn)確率。
對(duì)電力智能終端類型及其使用的操作系統(tǒng)進(jìn)行調(diào)研,結(jié)果如附錄A表A1所示。由附錄A表A1可知,電力系統(tǒng)主站系統(tǒng)類終端大多使用Unix、Linux及Windows系列操作系統(tǒng);末端節(jié)點(diǎn)裝置類終端大多使用Linux、VxWorks等嵌入式操作系統(tǒng),部分使用μC/OS-II或WinCE。因此本文主要針對(duì)Unix/Linux操作系統(tǒng)的后門進(jìn)行分析,研究其后門類型、代碼特征和運(yùn)行機(jī)制。
Unix/Linux操作系統(tǒng)中后門種類較多,現(xiàn)有研究大多針對(duì)Rootkit后門展開,而針對(duì)具有網(wǎng)絡(luò)連接特征的后門研究較少,因此本文選取幾類典型的具有網(wǎng)絡(luò)連接特征的后門樣本,分析代碼特征及運(yùn)行機(jī)理,為后續(xù)后門檢測(cè)提供理論支撐。
1)Ping-back是最簡(jiǎn)單的ICMP shell后門,代碼量不到100行,卻具備Unix/Linux ICMP后門的完整功能。程序運(yùn)行后只要接收到對(duì)應(yīng)大小的ICMP包即可激活,實(shí)現(xiàn)相應(yīng)的功能。
2)ICMP-backdoor具有ICMP shell后門和Bind shell后門的功能,還具有從網(wǎng)絡(luò)中下載ELF文件并執(zhí)行的功能。
3)Prism是輕量級(jí)的用戶態(tài)后門,具有兩種模式。STATIC模式下將主動(dòng)連接到指定的IP和端口;ICMP模式下通過接收含有特定口令的ICMP包激活連接,反向shell連接到攻擊者的主機(jī),使攻擊主機(jī)獲得后門主機(jī)的控制權(quán)。Prism還可以清除iptables規(guī)則,從而避免自身的網(wǎng)絡(luò)報(bào)文被過濾。
4)Liinux是Bind shell后門與Rootkit后門結(jié)合的復(fù)合型后門,含有網(wǎng)絡(luò)連接模塊及Rootkit模塊,具有實(shí)現(xiàn)程序轉(zhuǎn)移及反向shell連接功能,并且可以通過vfs hook實(shí)現(xiàn)進(jìn)程的隱藏和root權(quán)限的保持。
5)RatHole是C/S類型的網(wǎng)絡(luò)連接型后門,由運(yùn)行于攻擊主機(jī)的連接程序Rat和運(yùn)行于后門主機(jī)的后門程序Hole組成,Rat和Hole程序間通過口令驗(yàn)證連接,不需要root權(quán)限運(yùn)行程序就可實(shí)現(xiàn)后門功能。
上述后門樣本的詳細(xì)信息如表1所示。
表1 后門樣本的類型、特征及行為Table 1 Types,characteristics and behaviors of backdoor samples
通過1.1節(jié)的分析可知,不同種類的后門有不同的功能,多種后門相互配合可以實(shí)現(xiàn)和保持攻擊者對(duì)后門主機(jī)的訪問和控制。例如Rootkit后門主要通過隱藏其文件、端口和進(jìn)程等方式實(shí)現(xiàn)對(duì)后門攻擊行為的隱藏。因此,對(duì)電力智能終端后門的檢測(cè),需要考慮到后門特性及電力系統(tǒng)的特點(diǎn)。
針對(duì)電力智能終端后門樣本量少的問題,本文不考慮使用需要大樣本數(shù)據(jù)集的機(jī)器學(xué)習(xí)等算法,而是基于搜集到的現(xiàn)有后門樣本,詳細(xì)分析其特性、行為及代碼特征,以進(jìn)行針對(duì)性地檢測(cè)。
由于電力智能終端運(yùn)行時(shí),其運(yùn)行的程序和執(zhí)行的功能是固定的,因此其系統(tǒng)狀態(tài)具有以下特點(diǎn):1)文件狀態(tài)周期性變化,即文件訪問對(duì)象固定、文件創(chuàng)建和刪除操作周期性出現(xiàn),且一般只針對(duì)固定目錄;2)網(wǎng)絡(luò)狀態(tài)基本保持不變,即端口開放固定,網(wǎng)絡(luò)流量周期性變化,通信對(duì)象固定、無異常網(wǎng)絡(luò)訪問;3)運(yùn)行進(jìn)程基本保持不變,即進(jìn)程運(yùn)行列表基本不變,端口開放情況基本不變。
因此,本文提出一種面向新型電力系統(tǒng)的智能終端后門檢測(cè)方法,方案如圖1所示。
圖1 面向新型電力系統(tǒng)的智能終端后門檢測(cè)方案Fig.1 The intelligent terminal backdoor detection scheme for modern power system
圖1中,基于代碼特征的靜態(tài)檢測(cè)是針對(duì)系統(tǒng)運(yùn)行代碼進(jìn)行靜態(tài)檢測(cè),包括字符串檢測(cè)和函數(shù)調(diào)用序列檢測(cè),能快速檢測(cè)到代碼中異常的功能字符串、函數(shù)調(diào)用序列等,檢測(cè)準(zhǔn)確率也較高。但是,基于特征碼的靜態(tài)檢測(cè)方法依賴樣本特征庫(kù)的完備程度,也不適用加密、多態(tài)、變形等后門變體或加殼程序。
因此,本文針對(duì)電力智能終端行為固定的特點(diǎn),進(jìn)一步提出了基于系統(tǒng)運(yùn)行狀態(tài)的動(dòng)態(tài)檢測(cè)方法,通過實(shí)時(shí)監(jiān)控智能終端運(yùn)行時(shí)系統(tǒng)的文件、網(wǎng)絡(luò)等狀態(tài),檢測(cè)系統(tǒng)是否發(fā)生異常行為,將對(duì)后門的檢測(cè)轉(zhuǎn)變?yōu)閷?duì)后門惡意行為的檢測(cè)。該方法不僅適用智能終端上線前和更新后,也適用運(yùn)行階段。
上述兩種方法對(duì)后門的檢測(cè)涵蓋智能終端的上線前、運(yùn)行時(shí)和更新后多階段,并且檢測(cè)方式和適用階段不同,可互為補(bǔ)充,以提高后門檢測(cè)準(zhǔn)確率?;诖a特征的靜態(tài)檢測(cè)方法可以在智能終端上線前對(duì)其運(yùn)行代碼做細(xì)致的安全檢測(cè),及時(shí)發(fā)現(xiàn)后門,避免上線后造成損失?;谶\(yùn)行狀態(tài)的動(dòng)態(tài)檢測(cè)方法則是在終端處于運(yùn)行態(tài)時(shí),實(shí)時(shí)監(jiān)控系統(tǒng)的運(yùn)行狀態(tài),可發(fā)現(xiàn)后門的惡意行為,適用靜態(tài)方法無法檢測(cè)到的加密、多態(tài)、變形等后門變體,以及不在代碼特征庫(kù)樣本范圍內(nèi)的后門。
由1.1節(jié)及表1可知,電力智能終端后門可能引起的異常行為包括反向shell、異常網(wǎng)絡(luò)連接請(qǐng)求、異常文件操作、異常指令等幾類。這些行為在代碼層面通常會(huì)呈現(xiàn)出一些特征,按照其存在形式,可分為字符串特征和函數(shù)調(diào)用序列特征。
字符串特征指后門代碼中的關(guān)鍵字符串,如Linux命令等;函數(shù)調(diào)用序列特征指程序調(diào)用的系統(tǒng)函數(shù)序列,如網(wǎng)絡(luò)端口監(jiān)聽、外部文件下載執(zhí)行等異常行為對(duì)應(yīng)的調(diào)用序列。分析后門樣本并總結(jié)得到智能終端后門異常行為的典型代碼特征,如表2所示。
表2 智能終端后門異常行為及其代碼特征Table 2 Abnormal behavior and code characteristics of intelligent terminal backdoor
1)字符串特征。
字符串特征是指智能終端后門為實(shí)現(xiàn)某些異常行為而在二進(jìn)制文件中留下的字符串,包括命令字符串和特定字符串。
命令字符串主要包括shell字符串和Linux命令字符串。shell字符串主要出現(xiàn)在反向shell連接異常行為中,可利用shell字符串對(duì)Unix/Linux的命令程序和服務(wù)進(jìn)行檢測(cè),查看其內(nèi)部是否被植入了反向shell的代碼。Linux命令字符串主要包括文件管理、文件傳輸、磁盤管理、網(wǎng)絡(luò)通信、系統(tǒng)管理及設(shè)備管理等各類Linux命令,它是異常指令的代碼特征。
特定字符串則是分析后門樣本中得到的提示或簽名信息或其他可疑字符串。
2)函數(shù)調(diào)用序列特征。
函數(shù)調(diào)用序列特征是指智能終端后門為實(shí)現(xiàn)某些異常行為而調(diào)用的函數(shù)的序列。表2中的函數(shù)調(diào)用序列特征說明如下。
dup2 + dup2 + dup2 + exec族調(diào)用序列可以重定向shell的標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出流,廣泛出現(xiàn)在所有的后門程序中,主要實(shí)現(xiàn)反向shell功能。
socket + bind + listen + accept調(diào)用序列實(shí)現(xiàn)網(wǎng)絡(luò)端口的監(jiān)聽,主要出現(xiàn)在Bind shell后門中,也是網(wǎng)絡(luò)連接中服務(wù)器端的函數(shù)調(diào)用序列。
socket + connect調(diào)用序列實(shí)現(xiàn)主動(dòng)向外連接,主要出現(xiàn)在ICMP shell后門中,也是網(wǎng)絡(luò)連接中客戶端的函數(shù)調(diào)用序列。
open + open + read + write調(diào)用序列可以實(shí)現(xiàn)文件的轉(zhuǎn)移,出現(xiàn)在Liinux后門中。
read + write + fexecve調(diào)用序列實(shí)現(xiàn)外部文件的下載和執(zhí)行,主要出現(xiàn)在ICMP-backdoor中。
后門程序在實(shí)現(xiàn)相應(yīng)的功能時(shí),通常是多種函數(shù)調(diào)用序列組合使用。例如,Bind shell后門通過端口監(jiān)聽接收攻擊主機(jī)發(fā)起的連接,再進(jìn)行反向shell連接,其函數(shù)調(diào)用序列特征則為監(jiān)聽端口+反向shell連接,即socket + bind + listen + accept + dup2 + dup2 + dup2 +exec族;ICMP shell后門通過解析ICMP包激活,向外連接至攻擊主機(jī),并進(jìn)行反向shell連接,其函數(shù)調(diào)用序列特征則為向外連接+反向shell連接,即socket + bind + listen + accept + dup2 + dup2 + dup2 +exec族;ICMP-backdoor從網(wǎng)絡(luò)下載ELF文件并執(zhí)行,其函數(shù)調(diào)用系列特征則為向外連接+外部文件執(zhí)行,即socket + connect + read + write + fexecve。
2.2.1 代碼特征庫(kù)
基于2.1節(jié)的異常行為代碼特征,根據(jù)特征對(duì)應(yīng)的異常行為的危害程度,為每個(gè)特征設(shè)定危險(xiǎn)等級(jí),以此構(gòu)建代碼特征庫(kù),包括字符串特征庫(kù)和函數(shù)調(diào)用序列特征庫(kù)。
1)字符串特征庫(kù)。
字符串特征庫(kù)內(nèi)存儲(chǔ)的信息包括字符串特征、字符串特征解釋、字符串特征對(duì)應(yīng)的異常行為和字符串特征的危險(xiǎn)等級(jí)等。字符串特征庫(kù)字段構(gòu)成如表3所示。
表3 字符串特征庫(kù)結(jié)構(gòu)Table 3 Structure of string feature database
2)函數(shù)調(diào)用序列特征庫(kù)。
函數(shù)調(diào)用序列特征庫(kù)內(nèi)存儲(chǔ)的信息包括函數(shù)調(diào)用序列特征、函數(shù)調(diào)用序列特征解釋、函數(shù)調(diào)用序列對(duì)應(yīng)的異常行為和函數(shù)調(diào)用序列的危險(xiǎn)等級(jí)。函數(shù)調(diào)用序列特征庫(kù)字段構(gòu)成如表4所示。
表4 函數(shù)調(diào)用序列特征庫(kù)結(jié)構(gòu)Table 4 Structure of function call sequence feature database
2.2.2 字符串特征檢測(cè)
字符串特征檢測(cè)的對(duì)象是可執(zhí)行程序。為了更快速全面地進(jìn)行檢測(cè),本文采用模式匹配的方法對(duì)可執(zhí)行程序代碼進(jìn)行字符串特征檢測(cè)。字符串特征檢測(cè)方法如算法1所示,其基本思路為,識(shí)別可執(zhí)行程序的所有字符串,利用哈希算法,快速查找字符串是否在特征庫(kù)中。
算法1字符串特征檢測(cè)1234567Input:stringFeatureLib,exeFile//字符串特征、可執(zhí)行文件Output:detectionResult//檢測(cè)結(jié)果strFeature←hash(stringFeatureLib);//將特征庫(kù)離散分布printableString←isPrint(exeFile);for string in printableStringif exist(string,strFeature) then//快速判斷是否存在detectionResult←append(getInfo(feature,str));endifendfor
2.2.3 函數(shù)調(diào)用序列特征檢測(cè)
函數(shù)調(diào)用序列特征與字符串特征性質(zhì)不同,字符串特征的字符必須是連續(xù)和固定的,字符串內(nèi)不能有其他的字符,而函數(shù)調(diào)用序列強(qiáng)調(diào)的是序列,即使序列中出現(xiàn)了其他函數(shù)調(diào)用,也不會(huì)影響到序列本身,因此檢測(cè)方法也不同。
函數(shù)調(diào)用序列檢測(cè)的對(duì)象是待檢測(cè)程序的函數(shù)調(diào)用序列列表,為了實(shí)現(xiàn)完整準(zhǔn)確的檢測(cè),本文采用模糊匹配方法,搜索程序的函數(shù)調(diào)用序列是否包含特征序列。
函數(shù)調(diào)用序列特征檢測(cè)方法如算法2所示,其基本思路為,判斷特征序列的函數(shù)在程序調(diào)用序列中是否全部出現(xiàn),且順序是否一致。
算法2函數(shù)調(diào)用序列特征檢測(cè)1234567891011121314151617Input:funcSeqList,funcSeqFeaLib//函數(shù)調(diào)用序列列表、函數(shù)調(diào)用序列特征庫(kù)Output:detectionResultfor funSeq in funcSeqListfor funcSeqFea in funcSeqFeaLib index←0; preNum←-1; clear(isVisited[]); curNum←findInUnvisited(funcSeqFea[index],fun-Seq); while curNum>preNumdo isVisited[curNum]←true;preNum←curNum;index←index+1; curNum←findInUnvisited(funcSeqFea[index],funSeq); endwhile if index>=size(funcSeqFea)then detectionResult←append(getInfo(funcSeqFea,fun-Seq));endif endforendfor
上述基于異常行為代碼特征的靜態(tài)檢測(cè)無法檢測(cè)加密、多態(tài)、變形等后門變體或加殼程序。此外,后門的某些行為沒有特定的字符串,也無法以規(guī)范的函數(shù)調(diào)用序列表示,如后門的隱藏行為。因此,為了充分發(fā)現(xiàn)電力系統(tǒng)中的后門,需要進(jìn)一步基于系統(tǒng)行為進(jìn)行動(dòng)態(tài)檢測(cè)。
傳統(tǒng)的基于系統(tǒng)行為的動(dòng)態(tài)檢測(cè)方法,通常需要修改系統(tǒng)代碼,如hook系統(tǒng)調(diào)用函數(shù),需要編譯并加載新的功能模塊,當(dāng)用于系統(tǒng)上線前檢測(cè),由于電力系統(tǒng)代碼非開源,這種方法顯然不適用。因此,本文提出基于系統(tǒng)運(yùn)行狀態(tài)的后門檢測(cè)方法,無需修改系統(tǒng)代碼即可進(jìn)行后門異常行為檢測(cè)。
文件狀態(tài)監(jiān)測(cè)對(duì)象是數(shù)據(jù)文件。為了保持對(duì)指定文件的狀態(tài)監(jiān)測(cè),又不過多占用計(jì)算資源,本文采用定時(shí)循環(huán)檢測(cè)的方式,以固定時(shí)間為周期,每一個(gè)周期針對(duì)文件狀態(tài)庫(kù)里的文件進(jìn)行一輪監(jiān)測(cè)。文件狀態(tài)監(jiān)測(cè)方法如算法3所示。
算法3文件狀態(tài)監(jiān)測(cè)1234567891011Input:fileStateLibOutput:monitorResultfilename,fileAddr,fileMD5,checkNum,checkTime←read(fileStateLib);//文件名、文件地址、文件MD5值、檢測(cè)次數(shù)、檢測(cè)時(shí)間for i←0 tosize(fileStateLib) oldFileMD5←fileMD5[i]; newFileMD5←calculateMD5OfFile(fileAddr[i]); if newFileMD5!=fileMD5[i]then//文件被修改monitorResult←append(getInfo(filename[i],fileAddr,newFileMD5)) endif checkNum[i]←checkNum[i]+1; checkTime[i]←getTime();endforwrite(fileStateLib,checkNum,checkTime);
3.2.1 網(wǎng)絡(luò)狀態(tài)
網(wǎng)絡(luò)狀態(tài)主要指端口開放、網(wǎng)絡(luò)流量及網(wǎng)絡(luò)訪問情況。電力系統(tǒng)運(yùn)行時(shí),其運(yùn)行的程序和執(zhí)行的功能是固定的,因此其網(wǎng)絡(luò)狀態(tài)基本保持不變,即端口開放固定,網(wǎng)絡(luò)流量周期性變化、無異常網(wǎng)絡(luò)訪問。在網(wǎng)絡(luò)狀態(tài)的監(jiān)測(cè)中,需要監(jiān)測(cè)系統(tǒng)中有無可疑進(jìn)程打開端口,網(wǎng)絡(luò)流量是否突然增大或減少,有無外部地址的網(wǎng)絡(luò)連接。
1)端口開放狀態(tài)可量化為端口開放總數(shù)及開放的端口號(hào)列表。
2)網(wǎng)絡(luò)流量狀態(tài)較為復(fù)雜,可分為兩個(gè)階段。第一個(gè)階段是日常運(yùn)行階段,此階段末端節(jié)點(diǎn)定時(shí)給主站上送測(cè)量值和信號(hào)量,網(wǎng)絡(luò)流量恒定。第二個(gè)階段是發(fā)布控制命令階段,此階段主站給末端節(jié)點(diǎn)下發(fā)命令,由末端節(jié)點(diǎn)執(zhí)行相應(yīng)操作,并將執(zhí)行情況上送給主站,會(huì)有網(wǎng)絡(luò)流量的激增,隨后緩慢下降到日常運(yùn)行狀態(tài)。
3)網(wǎng)絡(luò)訪問狀態(tài)可量化為網(wǎng)絡(luò)訪問信息四元組,即
3.2.2 網(wǎng)絡(luò)狀態(tài)監(jiān)測(cè)
1)端口開放狀態(tài)讀取與監(jiān)測(cè)。
為了實(shí)時(shí)監(jiān)測(cè)端口開放的狀態(tài),并且不占用過多計(jì)算資源,本文采取雙重檢測(cè)的方式對(duì)端口開放狀態(tài)進(jìn)行檢測(cè)。端口開放狀態(tài)檢測(cè)算法的具體步驟為:
步驟1:讀取系統(tǒng)初始狀態(tài)記錄模塊中的記錄端口開放總數(shù)PortNumber和記錄端口開放列表PortList,進(jìn)入循環(huán)定時(shí)監(jiān)測(cè)。
步驟2:每隔一個(gè)周期,讀取并計(jì)算一次系統(tǒng)實(shí)時(shí)端口開放總數(shù),并與PortNumber進(jìn)行比較。
步驟3:如果相同,則等待下一個(gè)周期的檢測(cè)。
步驟4:如果不相同,則依次讀取系統(tǒng)開放的每個(gè)端口,查找其是否在PortList中,如果不在,則輸出端口號(hào)及提示信息。
2)網(wǎng)絡(luò)流量狀態(tài)讀取與監(jiān)測(cè)。
由于電力系統(tǒng)運(yùn)行的不同階段中,網(wǎng)絡(luò)流量的特點(diǎn)不同,因此本文分階段對(duì)網(wǎng)絡(luò)流量狀態(tài)進(jìn)行監(jiān)測(cè),將其分為日常運(yùn)行和下發(fā)控制命令兩個(gè)階段執(zhí)行。
因網(wǎng)絡(luò)流量變動(dòng)性較大,對(duì)日常運(yùn)行狀態(tài)下的平均網(wǎng)絡(luò)流量dailyAvgTraffic和最大網(wǎng)絡(luò)流量dailyMaxTraffic的記錄要在運(yùn)行平穩(wěn)時(shí)選取,對(duì)控制命令下發(fā)階段的最大網(wǎng)絡(luò)流量exeMaxTraffic和恢復(fù)至日常運(yùn)行狀態(tài)的時(shí)間recoveryTime的記錄要在下發(fā)不同的指令時(shí)進(jìn)行統(tǒng)計(jì)選取。網(wǎng)絡(luò)流量狀態(tài)的讀取,可使用Linux下iftop命令查看并讀取,也可在電力系統(tǒng)交換機(jī)內(nèi)進(jìn)行監(jiān)測(cè)。
網(wǎng)絡(luò)流量狀態(tài)監(jiān)測(cè)方法如算法4所示,其基本思路為:首先判斷系統(tǒng)當(dāng)前狀態(tài),若是控制命令下發(fā)階段,則檢測(cè)網(wǎng)絡(luò)流量最大值和流量恢復(fù)平穩(wěn)所消耗時(shí)間是否正常;若是日常運(yùn)行階段,則檢測(cè)最大網(wǎng)絡(luò)流量和平均網(wǎng)絡(luò)流量是否正常。
算法4網(wǎng)絡(luò)流量狀態(tài)監(jiān)測(cè)12345678910111213Input:netTrafficLib,stateTimeOutput:monitorResultdailyAvgTraffic,dailyMaxTraffic,exeMaxTraffic,recover-Time←read(netTrafficLib);//日常網(wǎng)絡(luò)平均流量、日常網(wǎng)絡(luò)最大流量、控制命令下發(fā)階段網(wǎng)絡(luò)最大流量、恢復(fù)至日常狀態(tài)的時(shí)間maxTraffic←getMaxTraffic(stateTime);if controlCommand() then//控制命令階段 time←getRecoverTime(stateTime); if maxTraffic>exeMaxTrafficortime>2?recover-Time thenmonitorResult←append(getInfo(‘command’,maxTraf-fic,time)); endifelsethen//日常狀態(tài) aveTraffic←getAverageTraffic(stateTime); if maxTraffic>dailyMaxTrafficoraveTraffic>2?dailyAvgTraffic thenmonitorResult←append(getInfo(‘daily’,maxTraffic,aveTraffic)); endifendif
3)網(wǎng)絡(luò)訪問狀態(tài)讀取與監(jiān)測(cè)。
網(wǎng)絡(luò)訪問狀態(tài)的監(jiān)測(cè)對(duì)象是系統(tǒng)網(wǎng)絡(luò)訪問狀態(tài)信息。對(duì)網(wǎng)絡(luò)訪問狀態(tài)的讀取,可使用Linux下的netstat命令,查看并記錄所有網(wǎng)絡(luò)連接信息。網(wǎng)絡(luò)訪問狀態(tài)監(jiān)測(cè)算法的具體步驟為:
步驟1:讀入系統(tǒng)初始狀態(tài)記錄模塊中的所有網(wǎng)絡(luò)連接四元組信息
步驟2:每隔一個(gè)周期,讀取系統(tǒng)當(dāng)前的所有網(wǎng)絡(luò)連接的四元組信息;針對(duì)一條系統(tǒng)網(wǎng)絡(luò)連接信息,判斷該條信息是否在網(wǎng)絡(luò)訪問狀態(tài)庫(kù)中。
步驟3:如果在,則檢測(cè)下一條系統(tǒng)網(wǎng)絡(luò)連接四元組信息。
步驟4:如果不在,則系統(tǒng)出現(xiàn)異常網(wǎng)絡(luò)連接,輸出告警信息。
步驟5:如果當(dāng)前為最后一條網(wǎng)絡(luò)連接數(shù)據(jù),則程序終止,等待下一個(gè)周期的網(wǎng)絡(luò)訪問狀態(tài)監(jiān)測(cè),否則進(jìn)行下一條網(wǎng)絡(luò)連接信息的檢測(cè)。
隱藏行為包括文件隱藏、端口隱藏和進(jìn)程隱藏[14]。此類行為通常出現(xiàn)在Rootkit后門中,電力系統(tǒng)正常運(yùn)行時(shí)不應(yīng)存在隱藏行為,因此對(duì)隱藏行為的檢測(cè)可以發(fā)現(xiàn)系統(tǒng)的Rootkit后門。
3.3.1 文件隱藏檢測(cè)
文件隱藏通常與后門文件轉(zhuǎn)移行為相聯(lián)系,通過修改文件或文件夾名稱,可將文件轉(zhuǎn)移至隱藏文件夾下,或直接隱藏文件。
1)在文件/文件夾名稱前加上“.”即可在普通查看文件的方式下實(shí)現(xiàn)文件的隱藏,更具迷惑性的則直接以“..”或“...”作為文件或文件夾的名稱。對(duì)這類文件隱藏方式的檢測(cè),可采用ls-al命令顯示所有文件及文件夾,遍歷查找所有以“.”開頭的文件和文件夾。
2)修改ls命令程序,使ls命令在列出文件時(shí)對(duì)部分文件進(jìn)行隱藏。修改ls程序后會(huì)改變?cè)撁畛绦虻膍d5值,因此可在文件狀態(tài)監(jiān)測(cè)時(shí)發(fā)現(xiàn)此種形式的隱藏文件。
3.3.2 端口隱藏檢測(cè)
端口隱藏通常是后門在進(jìn)行網(wǎng)絡(luò)監(jiān)聽時(shí),用于隱藏自身進(jìn)程及監(jiān)聽的端口,以躲避運(yùn)維人員的檢測(cè)。
用戶查看端口一般使用netstat命令,該命令通過讀取并解析/proc/net/udp和/proc/net/tcp文件獲取TCP和UDP連接信息,后門可通過hook顯示函數(shù),如顯示TCP連接信息的tcp_seq_show()函數(shù),在顯示函數(shù)結(jié)果中刪除需要隱藏的端口,即可達(dá)到端口隱藏的目的。
因此,檢測(cè)隱藏端口要避免使用netstat命令,可通過如telnet連接、nmap工具、nc指令等對(duì)所有端口進(jìn)行遍歷來進(jìn)行。在對(duì)目標(biāo)終端進(jìn)行端口遍歷偵聽后,得到開放端口列表,利用3.2.2節(jié)中的端口開放狀態(tài)檢測(cè)算法,找出隱藏端口,輸出相關(guān)信息。
3.3.3 進(jìn)程隱藏檢測(cè)
進(jìn)程隱藏是Unix/Linux的Rootkit后門最主要的功能。Rootkit實(shí)現(xiàn)進(jìn)程隱藏的主要方式liangz及對(duì)應(yīng)的檢測(cè)方法如下所述。
1)通過修改或替換ps、top等進(jìn)程查看工具隱藏/proc/pid目錄下的進(jìn)程信息。此種方式與修改ls命令隱藏文件類似,會(huì)改變ps命令程序的md5值,因此可在文件狀態(tài)監(jiān)測(cè)時(shí)發(fā)現(xiàn)此種形式的進(jìn)程隱藏,也可讀取并遍歷/proc/pid中存儲(chǔ)的進(jìn)程信息,與ps命令執(zhí)行結(jié)果進(jìn)行對(duì)比,判斷是否存在進(jìn)程隱藏行為。
2)通過sys_get dents()系統(tǒng)調(diào)用進(jìn)行hook,攔截對(duì)/proc/pid虛擬文件系統(tǒng)的訪問和讀取,實(shí)現(xiàn)進(jìn)程對(duì)用戶的隱藏。對(duì)于此類進(jìn)程隱藏方式的檢測(cè),可通過比較用戶級(jí)進(jìn)程列表和內(nèi)核進(jìn)程列表的差異來獲取隱藏的進(jìn)程信息。其中,用戶級(jí)進(jìn)程列表可利用ps或cat/proc命令獲取;內(nèi)核進(jìn)程列表可利用Linux提供的kprobe調(diào)試技術(shù)獲取。
綜上,隱藏行為的分類、隱藏方式及對(duì)應(yīng)的檢測(cè)方法如表5所示。
表5 隱藏行為的隱藏方式及檢測(cè)方法Table 5 Hidden way and detection method of hidden behavior
本文選取1.1節(jié)后門樣本作為惡意樣本,同時(shí)選取Linux常見的命令程序作為良性樣本進(jìn)行對(duì)比分析,驗(yàn)證檢測(cè)方法的有效性和準(zhǔn)確性。惡意樣本包括Ping-back、ICMP、Prism、Liinux和RatHole共5類,由于Prism后門具有多種功能,因此編譯出4種形式,分別是Prism(ICMP模式)、Prism-static(Static模式)、Prism-iptables (ICMP模式+iptables功能)、Prism-static-iptables(STATIC模式+iptables功能),RatHole后門選取Hole程序作為樣本。良性樣本包括/bin文件夾下的所有Linux命令程序,共119個(gè)。
4.1.1 字符串特征檢測(cè)結(jié)果
字符串特征檢測(cè)方法的實(shí)驗(yàn)結(jié)果如表6所示,可見,針對(duì)不同后門樣本,算法能檢測(cè)出相應(yīng)的異常字符串。
表6 字符串檢測(cè)結(jié)果Table 6 Results of string feature detection
4.1.2 函數(shù)調(diào)用序列特征檢測(cè)結(jié)果
函數(shù)調(diào)用序列特征檢測(cè)方法的實(shí)驗(yàn)結(jié)果如表7所示,可見,針對(duì)不同后門樣本,算法能檢測(cè)出相應(yīng)異常行為的函數(shù)調(diào)用序列,但無法檢測(cè)出隱藏行為。這是因?yàn)檫@類行為沒有特定的字符串,也無法以規(guī)范的函數(shù)調(diào)用序列表示,需要使用基于系統(tǒng)運(yùn)行狀態(tài)的動(dòng)態(tài)檢測(cè)方法進(jìn)行檢測(cè)。
表7 函數(shù)調(diào)用序列檢測(cè)結(jié)果Table 7 Results of function call sequence detection
后門樣本的系統(tǒng)運(yùn)行狀態(tài)監(jiān)測(cè)結(jié)果如表8所示。由于條件限制,本文實(shí)驗(yàn)未能模擬整個(gè)電力系統(tǒng)環(huán)境,未得到電力系統(tǒng)日常運(yùn)行及下發(fā)命令階段的網(wǎng)絡(luò)流量情況,故未在表中列出。
表8 運(yùn)行狀態(tài)監(jiān)測(cè)結(jié)果Table 8 Results of running status monitoring
由表8可見,實(shí)驗(yàn)中對(duì)后門運(yùn)行狀態(tài)的監(jiān)測(cè),可以檢測(cè)出各類異常運(yùn)行狀態(tài),如網(wǎng)絡(luò)訪問情況和隱藏行為等,結(jié)果符合預(yù)期。
4.3.1 結(jié)果分析
本文方法的準(zhǔn)確率和誤報(bào)率如表9所示。其中,準(zhǔn)確率為后門樣本檢出的結(jié)果數(shù)量/后門樣本總數(shù)量;誤報(bào)率為非后門樣本檢出結(jié)果數(shù)量/樣本檢出結(jié)果數(shù)量。
表9 異常行為代碼特征檢測(cè)準(zhǔn)確率及誤報(bào)率Table 9 Accuracy and false positives rate of abnormal behavior code feature detection
從表9可見,由于代碼特征檢測(cè)方法無法檢測(cè)進(jìn)程隱藏這類隱藏行為,其準(zhǔn)確率為82.1%,誤報(bào)率為1.5%。而綜合代碼特征和運(yùn)行狀態(tài)的檢測(cè)方法,準(zhǔn)確率提升到98.5%,誤報(bào)率降低至0.8%,結(jié)果較為理想。
4.3.2 與現(xiàn)有工作的對(duì)比
現(xiàn)有方法中,由于可執(zhí)行路徑分析和基于虛擬機(jī)的檢測(cè)法無法計(jì)算準(zhǔn)確率,因此選取其余方法進(jìn)行對(duì)比實(shí)驗(yàn),結(jié)果如表10所示。
表10 與現(xiàn)有方法的對(duì)比Table 10 Comparison with existing methods
因智能終端計(jì)算和存儲(chǔ)資源有限,本文以計(jì)算和存儲(chǔ)資源開銷判定一個(gè)方法是否適用于電力系統(tǒng)?,F(xiàn)有方法中,可執(zhí)行路徑分析法適用性窄、實(shí)現(xiàn)復(fù)雜,基于虛擬機(jī)的檢測(cè)法資源開銷大,基于機(jī)器學(xué)習(xí)的檢測(cè)法需要大樣本數(shù)據(jù)集、資源開銷大,因此這3種方法均不適用電力系統(tǒng)場(chǎng)景。需要說明的是,由于缺少樣本數(shù)據(jù),基于機(jī)器學(xué)習(xí)的檢測(cè)方法實(shí)驗(yàn)使用的不是電力智能終端后門樣本數(shù)據(jù)。
由表10可知,在適用于電力智能終端的方法中,本文方法檢測(cè)結(jié)果優(yōu)于其他對(duì)比方法。
后門具有隱蔽性和潛伏性,是攻擊者達(dá)成攻擊目的的重要途徑。若電力系統(tǒng)智能終端存在后門,將極大地威脅電力系統(tǒng)的安全穩(wěn)定運(yùn)行。本文總結(jié)了電力智能終端及其使用的操作系統(tǒng),分析了智能終端后門的異常行為及代碼特征,針對(duì)電力智能終端的運(yùn)行特點(diǎn),提出了基于代碼特征和運(yùn)行狀態(tài)的、動(dòng)靜結(jié)合的后門檢測(cè)方法。本文方法從字符串特征和函數(shù)調(diào)用序列特征兩方面,對(duì)電力系統(tǒng)二進(jìn)制代碼進(jìn)行靜態(tài)檢測(cè),彌補(bǔ)了單特征檢測(cè)準(zhǔn)確率不高的缺陷;然后從文件狀態(tài)、網(wǎng)絡(luò)狀態(tài)和隱藏行為三方面,對(duì)電力智能終端后門異常行為進(jìn)行動(dòng)態(tài)檢測(cè),進(jìn)一步提高后門檢測(cè)準(zhǔn)確率。
實(shí)驗(yàn)結(jié)果表明,由于代碼特征檢測(cè)方法無法檢測(cè)進(jìn)程隱藏這類隱藏行為,其準(zhǔn)確率為82.1%,誤報(bào)率為1.5%。而綜合代碼特征和運(yùn)行狀態(tài)的檢測(cè)方法,準(zhǔn)確率提升到98.5%,誤報(bào)率降低至0.8%,結(jié)果較為理想。
本文研究針對(duì)Unix/Linux操作系統(tǒng),下一步將擴(kuò)展至嵌入式Linux和Windows操作系統(tǒng),即覆蓋所有的電力系統(tǒng)智能終端。此外,搜集更多不同類型的后門樣本,完善后門的異常行為、代碼特征和運(yùn)行狀態(tài)等,進(jìn)一步提升后門檢測(cè)方法的覆蓋率和準(zhǔn)確率。
附錄A
表A1 電力系統(tǒng)智能終端及其使用的操作系統(tǒng)Table A1 Power industrial control terminal and its operating system