池亞平 余宇舟 陳 穎
(北京電子科技學(xué)院 北京100070)
惡意軟件是當(dāng)今計(jì)算機(jī)系統(tǒng)的主要威脅之一[1]。同時(shí),現(xiàn)在針對(duì)SDN網(wǎng)絡(luò)的各類攻擊手段也越來越多。但是現(xiàn)有和SDN有關(guān)的惡意應(yīng)用程序研究大部分集中在利用軟件定義網(wǎng)絡(luò)控制與轉(zhuǎn)發(fā)分離的特點(diǎn),利用SDN特有的網(wǎng)絡(luò)架構(gòu)來解決傳統(tǒng)的惡意攻擊,而專門針對(duì)SDN特殊網(wǎng)絡(luò)網(wǎng)絡(luò)環(huán)境的惡意應(yīng)用程序研究還較少。
文獻(xiàn)[2]搭建了一個(gè)單獨(dú)的沙箱對(duì)惡意代碼進(jìn)行檢測,通過建立一個(gè)動(dòng)態(tài)分析環(huán)境,來觸發(fā)惡意代碼,促使其表現(xiàn)惡意行為。該檢測系統(tǒng)也有其明顯的局限性,因?yàn)樵谶@個(gè)系統(tǒng)中的SDN控制器本身也容易受到針對(duì)SDN模型的威脅和攻擊。如果控制器受到危害,則系統(tǒng)將無法正確執(zhí)行惡意軟件分析的功能。而且該方案建立的初衷是為了檢測針對(duì)普通計(jì)算機(jī)的惡意代碼而非針對(duì)SDN控制器的惡意代碼。文獻(xiàn)[3]提出了一個(gè)自動(dòng)分析SDN惡意應(yīng)用程序的框架SHIELD,通過研究SDN應(yīng)用的API調(diào)用情況,總結(jié)現(xiàn)有的良性和惡意應(yīng)用程序并提取其行為特點(diǎn)來進(jìn)行動(dòng)態(tài)檢測,但是有一個(gè)明顯的不足就是對(duì)于APT攻擊的檢測效果很差。文獻(xiàn)[4]采用域的方法,使用沙箱將控制器上重要的模塊放在不同的域里面,相互隔離,保證其中一個(gè)被感染不至于影響其他模塊。文獻(xiàn)[5]通過虛擬化技術(shù)隔離SDN應(yīng)用來保護(hù)控制平面,并采取嚴(yán)格的分離惡意SDN應(yīng)用程序的措施,允許策略檢查機(jī)制獨(dú)立于SDN控制器運(yùn)行,并給相關(guān)應(yīng)用的每一個(gè)行為和操作進(jìn)行定級(jí),通過判斷應(yīng)用的行為是否惡意來達(dá)到檢測惡意應(yīng)用程序和保護(hù)控制器的目的。
文獻(xiàn)[6]中提到運(yùn)用切片的方法檢測代碼漏洞,但是其只關(guān)注程序的參數(shù)調(diào)用等靜態(tài)特征,并沒有考慮程序的整體結(jié)構(gòu)特征。文獻(xiàn)[7]中提出了運(yùn)用切片的方法同時(shí)結(jié)合聚類算法對(duì)跨平臺(tái)的代碼進(jìn)行相似性檢測。文獻(xiàn)[8]和文獻(xiàn)[9]分別介紹了深度卷積神經(jīng)網(wǎng)絡(luò)在圖像分類、目標(biāo)檢測等多個(gè)計(jì)算機(jī)視覺任務(wù)中的廣泛應(yīng)用。
綜上所述,現(xiàn)有的對(duì)SDN惡意應(yīng)用程序的檢測方法并未對(duì)惡意應(yīng)用程序本身結(jié)構(gòu)進(jìn)行分析,并未深入到惡意應(yīng)用程序內(nèi)部關(guān)注其函數(shù)調(diào)用情況。而且普通端口的調(diào)用情況等動(dòng)態(tài)特征只有惡意行為觸發(fā)之后才能進(jìn)行樣本分析并提取規(guī)則,因此在準(zhǔn)確率和檢測及時(shí)性上有明顯的不足。程序靜態(tài)切片本質(zhì)上是一種數(shù)據(jù)提取分析方法,主要通過特定的逆向工具對(duì)整個(gè)代碼進(jìn)行遍歷,找到并截取想要分析的各類語句模塊。最后分析所截取的每一組程序語句,提取出想要的各類參數(shù)。
本文的主要?jiǎng)?chuàng)新點(diǎn)如下:
(1) 針對(duì)SDN控制器本身的安全問題,尤其是現(xiàn)在防護(hù)能力較薄弱的應(yīng)用層安全,首次將深度學(xué)習(xí)的方法與SDN惡意應(yīng)用程序檢測相結(jié)合。
(2) 將切片技術(shù)提取特征的方法運(yùn)用到惡意應(yīng)用程序檢測上,并首次將SDN惡意應(yīng)用向量特征重組為矩陣形式。
在這個(gè)部分,主要介紹OpenDaylight[10]控制器的攻擊場景。之所以選擇OpenDaylight控制器進(jìn)行分析,是因?yàn)槭紫人情_源并遵循Apache開源規(guī)范的,其次它也是時(shí)下最流行,應(yīng)用最廣的控制器。
同時(shí),我們在討論時(shí)不關(guān)注惡意應(yīng)用程序如何安裝到控制器上,并假定針對(duì)于每種控制器的惡意應(yīng)用程序已經(jīng)安裝到相應(yīng)控制器上。
針對(duì)Opendaylight的攻擊流程分析如圖1所示。
圖1 OpenDaylight控制器攻擊分析
(1) 惡意應(yīng)用程序訪問OpenDaylight的核心服務(wù)管理,獲取目標(biāo)應(yīng)用程序使用的服務(wù)信息。
(2) 惡意應(yīng)用程序?qū)h除目標(biāo)應(yīng)用程序使用的所有服務(wù),以使目標(biāo)應(yīng)用程序無法使用控制器提供的任何服務(wù)。
(3) 在惡意應(yīng)用程序刪除這些服務(wù)后,主機(jī)A向主機(jī)B發(fā)送報(bào)文,但沒有匹配的流規(guī)則,交換機(jī)會(huì)向控制器發(fā)送PACKET_IN流表。
(4) 目標(biāo)應(yīng)用程序無法處理PACKET_IN流表,因此控制器不能理解有關(guān)網(wǎng)絡(luò)的拓?fù)湫畔ⅰ?/p>
以上介紹了針對(duì)OpenDaylight控制器的攻擊方式,可以看到當(dāng)使用控制器控制大規(guī)模OpenFlow交換機(jī)時(shí),惡意應(yīng)用程序會(huì)被安裝到控制器上,將對(duì)SDN環(huán)境造成巨大的破環(huán)。
SDN應(yīng)用與傳統(tǒng)應(yīng)用的工作原理與觸發(fā)機(jī)制不同,SDN應(yīng)用通常是被數(shù)據(jù)轉(zhuǎn)發(fā)層的流表等事件所激活,但是普通的類似于安卓系統(tǒng)的惡意應(yīng)用則是由用戶、特定時(shí)間或者自動(dòng)激活。這集中體現(xiàn)在應(yīng)用樣本內(nèi)部函數(shù)的模塊和接口的巨大差異,也就為本方法提供了可能。
這些不同點(diǎn)也決定了我們應(yīng)該采取不同的檢測方法。針對(duì)SDN的惡意應(yīng)用與普通惡意應(yīng)用的區(qū)別如表1所示。
表1 針對(duì)SDN的惡意應(yīng)用與普通惡意應(yīng)用的區(qū)別
續(xù)表1
文獻(xiàn)[13]中提到程序切片提取特征在分析函數(shù)內(nèi)部調(diào)用關(guān)系、函數(shù)整體結(jié)構(gòu)等靜態(tài)特征方面有一定的優(yōu)勢。本方方法之所以采用模塊化切片的方式處理樣本,原因?yàn)橐韵聝牲c(diǎn):
(1) 只有對(duì)程序進(jìn)行模塊化切片處理,才能做到對(duì)惡意程序的函數(shù)調(diào)用等靜態(tài)特征向量提取的精細(xì)化處理,以便后面的深度學(xué)習(xí)。
(2) 對(duì)比實(shí)驗(yàn)發(fā)現(xiàn),相比于直接將控制流圖CFG(Control Flow Graph)染色后作為深度學(xué)習(xí)的圖片樣本,切片提取特征后生成的矩陣文檔樣本在檢測準(zhǔn)確率上提升4%,同時(shí)訓(xùn)練時(shí)間大幅降低。
方案總體框架如圖2所示。本方案的主要思想是將原始SDN惡意應(yīng)用程序轉(zhuǎn)化成可供深度學(xué)習(xí)的特征突出的矩陣樣本。本方案以深度學(xué)習(xí)為基礎(chǔ),將惡意應(yīng)用程序樣本按照模塊化進(jìn)行切片,提取特征向量后將其轉(zhuǎn)化為高維向量并重組成矩陣,最后將矩陣作為輸入,導(dǎo)入深度學(xué)習(xí)框架中。
圖2 方案總體框架
(1) 將應(yīng)用分為(正常,惡意)兩類。并利用逆向工具IDA,調(diào)用IDC模塊,處理原始樣本,生成GDL(Graph Description Language)文件。
(2) 調(diào)用IDA自帶的插件找到整個(gè)程序的入口函數(shù),獲取函數(shù)名。
(3) 遍歷整個(gè)函數(shù),對(duì)樣本按照(′UPX′,′UPX1′,′.text′, ′.idata′,′.rdata′,′.data′)等要素進(jìn)行模塊分組,即切片。
(4) 遍歷每個(gè)模塊中的函數(shù),提取出擁有特定函數(shù)名的函數(shù)。本方法尤其關(guān)注SDN惡意應(yīng)用程序特有的DataChangeListener()、FlowRuleModification()、SwitchFirmwareMisuse()、ReplayingKnownAttack()等模塊。
(5) 調(diào)用Python自帶的network模塊,根據(jù)GDL文件以模塊為單位生成控制流程圖,如圖3所示。圖3為邏輯關(guān)系圖,用以說明,并非用于深度學(xué)習(xí)的樣本。
圖3 生成的CFG流程圖示例
(6) 編寫getFuncCalls、getLogicInsts、getTransferInsts、getLocalVariables、getBasicBlocks、getBasicBlocks、getIncommingCalls、getIntrs等函數(shù)對(duì)整體結(jié)構(gòu)和切片進(jìn)行特征提取,如表2所示。
表2 切片特征提取參數(shù)設(shè)置
(7) 對(duì)每一個(gè)樣本的靜態(tài)函數(shù)所示進(jìn)行特征提取后,每一個(gè)切片都會(huì)生成如圖4所示的8維特征向量,然后將所有8維特征向量組成一個(gè)8×N維的矩陣。由于每個(gè)樣本的大小不一,因此N的大小并不確定,為了方便后面的深度學(xué)習(xí)實(shí)驗(yàn),因此需要對(duì)樣本進(jìn)行歸一化。本文采取的方法是設(shè)置閾值,即設(shè)置N=250,當(dāng)有樣本大于此值則省去多余部分,不足則添零,因此得到8×250的矩陣。
圖4 函數(shù)調(diào)用特征提取示例
(8) 將每一個(gè)矩陣(如圖5所示)保存成一個(gè)文檔,并對(duì)文檔進(jìn)行編號(hào)和標(biāo)記,最后將其作為深度學(xué)習(xí)樣本。
圖5 生成的矩陣樣本
本方案在谷歌的深度學(xué)習(xí)框架Tensorflow和調(diào)用接口Keras的基礎(chǔ)上搭建深度卷積神經(jīng)網(wǎng)絡(luò),根據(jù)以往的經(jīng)驗(yàn)總結(jié),調(diào)試各項(xiàng)參數(shù)。
現(xiàn)在關(guān)于卷積神經(jīng)網(wǎng)絡(luò)中的各個(gè)參數(shù)的設(shè)置沒有固定的方法,更沒有所謂最優(yōu)的方法,因此以下參數(shù)的選擇是在參考文獻(xiàn)[17-18]中給出的設(shè)置方法后,再加上自己的理解所設(shè)定的。stride為步長;filter為濾波器(也稱卷積核);kernel-Size為卷積核大小;padding為same時(shí)表示填充零,此時(shí)賦值1,為valid時(shí)表示不填充,賦值0;outp代表經(jīng)過池化層后的輸出,outc代表經(jīng)過卷積層的輸出。
outp=inlength/stride
(1)
(2)
本方法不適宜采用層數(shù)過深和卷積核過多的神經(jīng)網(wǎng)絡(luò)模型。主要有如下兩個(gè)原因:(1) 考慮到惡意應(yīng)用程序的檢測要兼顧準(zhǔn)確率和時(shí)間效率;(2) 由于現(xiàn)階段的樣本數(shù)量不夠多,復(fù)雜的網(wǎng)絡(luò)對(duì)小樣本學(xué)習(xí)很容易造成過擬合現(xiàn)象。
表3為本文深度學(xué)習(xí)框架結(jié)構(gòu)及各層參數(shù)詳細(xì)說明:關(guān)于步長的選擇,AlexNet多采用較大的卷積核,減小了層數(shù),VGG多采用3×3的卷積核,表明在結(jié)構(gòu)相似的情況下,網(wǎng)絡(luò)越深,性能越好。卷積層的步長如果太長,將會(huì)損失大量特征,因此取步長為2。池化層的步長和卷積核的參數(shù)采用的是前人的經(jīng)驗(yàn)總結(jié)。關(guān)于過濾器的選擇,設(shè)置的依據(jù)主要考慮的是實(shí)驗(yàn)平臺(tái)的文本處理能力。關(guān)于卷積核的大小,本方法主要采用文獻(xiàn)[15]介紹的卷積核的大小3×3。同時(shí)也考慮了式(2)的計(jì)算最終結(jié)果能是整數(shù),所以其中采用了2×2的卷積核。關(guān)于padding的選擇主要為了能夠使整體結(jié)構(gòu)更加合理和優(yōu)化而選擇的補(bǔ)零策略。在解決樣本太少而導(dǎo)致的過擬合問題和收斂性問題時(shí),主要采用不同激活函數(shù)和采用正則化手段Dropout。
表3 卷積神經(jīng)網(wǎng)絡(luò)各層參數(shù)設(shè)置
將所有樣本編號(hào)放入同一目錄下,將80%的樣本作為訓(xùn)練集放入深度學(xué)習(xí)框架中進(jìn)行學(xué)習(xí),將20%的樣本作為測試集對(duì)模型的準(zhǔn)確率進(jìn)行檢測。
本方案優(yōu)勢如下:
(1) 以往對(duì)于惡意代碼的特征提取主要關(guān)注其行為、標(biāo)簽、程序包名、啟動(dòng)Activity名稱、權(quán)限信息等易被隱藏或者偽造的特征,而本方案是對(duì)惡意應(yīng)用程序的控制流程圖這類難以偽造的樣本進(jìn)行檢測,大大增加了樣本的真實(shí)性和可用性。
(2) 相比于文獻(xiàn)[6],本方案的特征選取不僅關(guān)注了函數(shù)級(jí)別的調(diào)用和跳轉(zhuǎn)關(guān)系,同時(shí)還關(guān)注了程序的整體結(jié)構(gòu)特征,對(duì)于樣本的描述將更加準(zhǔn)確。
(3) 卷積神經(jīng)網(wǎng)絡(luò)作為一種深度學(xué)習(xí)模型,具有分層學(xué)習(xí)特征的能力。研究表明,通過卷積神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)得到的特征相對(duì)于人工設(shè)計(jì)特征具有更強(qiáng)的判別能力和泛化能力。
(4) 切片矩陣由于先將樣本的靜態(tài)特征數(shù)值化,因此相比于直接將惡意應(yīng)用程序的CFG圖片作為深度學(xué)習(xí)的樣本,更能凸顯惡意應(yīng)用程序內(nèi)部的調(diào)用關(guān)系、結(jié)構(gòu)特點(diǎn)等靜態(tài)特征,同時(shí)相比于圖片樣本,僅僅包含數(shù)據(jù)的文檔還明顯縮短了深度學(xué)習(xí)的時(shí)間,提高了效率。
IDA是目前最好的一款靜態(tài)反編譯軟件,它具有交互式、可編程、可擴(kuò)展、多處理器的特點(diǎn),并且可以交叉Windows或Linux MacOS平臺(tái)主機(jī)來分析程序,IDA Pro已經(jīng)成為分析敵意代碼的標(biāo)準(zhǔn)并讓其自身迅速成為攻擊研究領(lǐng)域的重要工具。它支持?jǐn)?shù)十種CPU指令集其中包括Intel x86、x64、MIPS、PowerPC、ARM、Z80、68000、c8051等[19]。
Keras是一個(gè)高層神經(jīng)網(wǎng)絡(luò)API,由純Python(其版本是:Python 2.7-3.6)編寫而成并支持Tensorflow、Theano以及CNTK后端。Keras具有高度模塊化、極簡和可擴(kuò)充等特性,支持CNN和RNN。本次實(shí)驗(yàn)所用環(huán)境配置如表4所示。
表4 實(shí)驗(yàn)環(huán)境配置
樣本來源有兩種:一種是從github開源社區(qū)找到的12個(gè)樣本,另一種是參考文獻(xiàn)[3]中研究團(tuán)隊(duì)分享的20個(gè)樣本。
實(shí)驗(yàn)結(jié)果如圖6-圖8所示,其中l(wèi)oss代表損失值,acc代表測試的準(zhǔn)確率,val_acc代表測試集的準(zhǔn)確率。本方法的損失值最后定在0.408 6,能控制在1以內(nèi),表明擬合良好,本方法的準(zhǔn)確率最后定在93.75%。若增大樣本數(shù)量和循環(huán)次數(shù),可使得結(jié)果更理想。同時(shí),隨著現(xiàn)在深度卷積神經(jīng)網(wǎng)絡(luò)的不斷發(fā)展,網(wǎng)絡(luò)層數(shù)越來越多,訓(xùn)練時(shí)間更長,消耗資源更多,準(zhǔn)確率會(huì)有一定提升,但是過擬合現(xiàn)象更嚴(yán)重,因此本文的卷積神經(jīng)網(wǎng)絡(luò)在VGG和AlexNet的基礎(chǔ)上,針對(duì)本方法樣本的特點(diǎn),設(shè)計(jì)了一種適合SDN惡意應(yīng)用程序檢測的神經(jīng)網(wǎng)絡(luò),并對(duì)每一層的參數(shù)進(jìn)行了調(diào)整,兼顧了準(zhǔn)確率和效率,取得了更好的效果。
圖6 AlexNet網(wǎng)絡(luò)架構(gòu)實(shí)驗(yàn)結(jié)果
圖7 VGG網(wǎng)絡(luò)架構(gòu)實(shí)驗(yàn)結(jié)果
圖8 表3中的神經(jīng)網(wǎng)絡(luò)架構(gòu)實(shí)驗(yàn)結(jié)果
不同樣本數(shù)量的實(shí)驗(yàn)比較結(jié)果如表5所示。本文采用10樣本、20樣本和32樣本的實(shí)驗(yàn)對(duì)比。實(shí)驗(yàn)結(jié)果表明隨著實(shí)驗(yàn)樣本的增多損失值不斷降低,檢測最高準(zhǔn)確率不斷提高,但是隨著循環(huán)次數(shù)增多,準(zhǔn)確率將有5%左右的降低,分析是由于樣本不足,欠擬合導(dǎo)致的,如果樣本足夠多,將使結(jié)果更加理想。實(shí)驗(yàn)結(jié)果符合預(yù)期,證明了本實(shí)驗(yàn)的可行性。
表5 樣本數(shù)量與實(shí)驗(yàn)結(jié)果的趨勢實(shí)驗(yàn)
表6 與文獻(xiàn)3中檢測時(shí)間比較 s
在對(duì)相同惡意應(yīng)用程序采用不同方法進(jìn)行比較。如表6所示,與文獻(xiàn)[3]中提到的針對(duì)于SDN惡意應(yīng)用程序檢測時(shí)間進(jìn)行比較,本方法設(shè)定樣本訓(xùn)練循環(huán)100次(epochs=100),測試集循環(huán)1次。對(duì)于OpenDaylight的樣本訓(xùn)練一次耗時(shí)24 ms,對(duì)于Floodlight樣本訓(xùn)練耗時(shí)49 ms,因此最終檢測耗時(shí)為2.424 s和4.949 s,本實(shí)驗(yàn)所用時(shí)間并未考慮讀取樣本所花時(shí)間,只計(jì)算訓(xùn)練和測試時(shí)間。綜上所述,本實(shí)驗(yàn)結(jié)果明顯優(yōu)于文獻(xiàn)[3]。同時(shí)文獻(xiàn)[3]并沒有如本文給出對(duì)于SDN惡意應(yīng)用程序的檢測準(zhǔn)確率,只給出了平均準(zhǔn)確時(shí)間,因此所得的結(jié)果明顯不夠嚴(yán)謹(jǐn)和準(zhǔn)確。由于與SDN惡意應(yīng)用程序檢測相關(guān)的文獻(xiàn)較少,在根據(jù)現(xiàn)有資料進(jìn)行比較分析過后,本實(shí)驗(yàn)?zāi)芨玫赝瓿蓯阂鈶?yīng)用程序檢測功能。
本課題通過深度學(xué)習(xí)的方法,在SDN的惡意應(yīng)用程序檢測方面達(dá)到了一定的目的,并取得了較理想的效果。然而因?yàn)楝F(xiàn)在關(guān)于SDN惡意應(yīng)用程序的相關(guān)樣本還較少,準(zhǔn)確率最高能達(dá)到93.75%左右。
SDN作為一種新型網(wǎng)絡(luò)架構(gòu),是未來網(wǎng)絡(luò)的發(fā)展趨勢。但是現(xiàn)在針對(duì)于其安全性的研究還相對(duì)滯后,本文為SDN惡意應(yīng)用程序的檢測提供了一種新的方法,對(duì)SDN的安全防護(hù)具有參考意義。
由于現(xiàn)在針對(duì)SDN網(wǎng)絡(luò)的惡意應(yīng)用程序還較少,因此檢測準(zhǔn)確率不夠高。隨著后續(xù)研究的推進(jìn),在收集大量SDN惡意應(yīng)用程序樣本之后,可繼續(xù)優(yōu)化和完善本檢測方法,并對(duì)本方法進(jìn)行驗(yàn)證。對(duì)于切片提取的特征,由于樣本大小不同,提取特征多少也不同,本方案現(xiàn)在采用的方法是設(shè)置一個(gè)閾值,若樣本維數(shù)大于8×250,則刪掉多余部分,不足則補(bǔ)零,但是這樣的處理方式過于片面、簡單。而且本方案對(duì)于向量如何堆疊和排列成矩陣還有待進(jìn)一步研究,并作出數(shù)學(xué)方面嚴(yán)謹(jǐn)?shù)耐茖?dǎo)和證明。