池亞平 余宇舟 陳 穎
(北京電子科技學院 北京100070)
惡意軟件是當今計算機系統的主要威脅之一[1]。同時,現在針對SDN網絡的各類攻擊手段也越來越多。但是現有和SDN有關的惡意應用程序研究大部分集中在利用軟件定義網絡控制與轉發分離的特點,利用SDN特有的網絡架構來解決傳統的惡意攻擊,而專門針對SDN特殊網絡網絡環境的惡意應用程序研究還較少。
文獻[2]搭建了一個單獨的沙箱對惡意代碼進行檢測,通過建立一個動態分析環境,來觸發惡意代碼,促使其表現惡意行為。該檢測系統也有其明顯的局限性,因為在這個系統中的SDN控制器本身也容易受到針對SDN模型的威脅和攻擊。如果控制器受到危害,則系統將無法正確執行惡意軟件分析的功能。而且該方案建立的初衷是為了檢測針對普通計算機的惡意代碼而非針對SDN控制器的惡意代碼。文獻[3]提出了一個自動分析SDN惡意應用程序的框架SHIELD,通過研究SDN應用的API調用情況,總結現有的良性和惡意應用程序并提取其行為特點來進行動態檢測,但是有一個明顯的不足就是對于APT攻擊的檢測效果很差。文獻[4]采用域的方法,使用沙箱將控制器上重要的模塊放在不同的域里面,相互隔離,保證其中一個被感染不至于影響其他模塊。文獻[5]通過虛擬化技術隔離SDN應用來保護控制平面,并采取嚴格的分離惡意SDN應用程序的措施,允許策略檢查機制獨立于SDN控制器運行,并給相關應用的每一個行為和操作進行定級,通過判斷應用的行為是否惡意來達到檢測惡意應用程序和保護控制器的目的。
文獻[6]中提到運用切片的方法檢測代碼漏洞,但是其只關注程序的參數調用等靜態特征,并沒有考慮程序的整體結構特征。文獻[7]中提出了運用切片的方法同時結合聚類算法對跨平臺的代碼進行相似性檢測。文獻[8]和文獻[9]分別介紹了深度卷積神經網絡在圖像分類、目標檢測等多個計算機視覺任務中的廣泛應用。
綜上所述,現有的對SDN惡意應用程序的檢測方法并未對惡意應用程序本身結構進行分析,并未深入到惡意應用程序內部關注其函數調用情況。而且普通端口的調用情況等動態特征只有惡意行為觸發之后才能進行樣本分析并提取規則,因此在準確率和檢測及時性上有明顯的不足。程序靜態切片本質上是一種數據提取分析方法,主要通過特定的逆向工具對整個代碼進行遍歷,找到并截取想要分析的各類語句模塊。最后分析所截取的每一組程序語句,提取出想要的各類參數。
本文的主要創新點如下:
(1) 針對SDN控制器本身的安全問題,尤其是現在防護能力較薄弱的應用層安全,首次將深度學習的方法與SDN惡意應用程序檢測相結合。
(2) 將切片技術提取特征的方法運用到惡意應用程序檢測上,并首次將SDN惡意應用向量特征重組為矩陣形式。
在這個部分,主要介紹OpenDaylight[10]控制器的攻擊場景。之所以選擇OpenDaylight控制器進行分析,是因為首先它是開源并遵循Apache開源規范的,其次它也是時下最流行,應用最廣的控制器。
同時,我們在討論時不關注惡意應用程序如何安裝到控制器上,并假定針對于每種控制器的惡意應用程序已經安裝到相應控制器上。
針對Opendaylight的攻擊流程分析如圖1所示。

圖1 OpenDaylight控制器攻擊分析
(1) 惡意應用程序訪問OpenDaylight的核心服務管理,獲取目標應用程序使用的服務信息。
(2) 惡意應用程序將刪除目標應用程序使用的所有服務,以使目標應用程序無法使用控制器提供的任何服務。
(3) 在惡意應用程序刪除這些服務后,主機A向主機B發送報文,但沒有匹配的流規則,交換機會向控制器發送PACKET_IN流表。
(4) 目標應用程序無法處理PACKET_IN流表,因此控制器不能理解有關網絡的拓撲信息。
以上介紹了針對OpenDaylight控制器的攻擊方式,可以看到當使用控制器控制大規模OpenFlow交換機時,惡意應用程序會被安裝到控制器上,將對SDN環境造成巨大的破環。
SDN應用與傳統應用的工作原理與觸發機制不同,SDN應用通常是被數據轉發層的流表等事件所激活,但是普通的類似于安卓系統的惡意應用則是由用戶、特定時間或者自動激活。這集中體現在應用樣本內部函數的模塊和接口的巨大差異,也就為本方法提供了可能。
這些不同點也決定了我們應該采取不同的檢測方法。針對SDN的惡意應用與普通惡意應用的區別如表1所示。

表1 針對SDN的惡意應用與普通惡意應用的區別

續表1
文獻[13]中提到程序切片提取特征在分析函數內部調用關系、函數整體結構等靜態特征方面有一定的優勢。本方方法之所以采用模塊化切片的方式處理樣本,原因為以下兩點:
(1) 只有對程序進行模塊化切片處理,才能做到對惡意程序的函數調用等靜態特征向量提取的精細化處理,以便后面的深度學習。
(2) 對比實驗發現,相比于直接將控制流圖CFG(Control Flow Graph)染色后作為深度學習的圖片樣本,切片提取特征后生成的矩陣文檔樣本在檢測準確率上提升4%,同時訓練時間大幅降低。
方案總體框架如圖2所示。本方案的主要思想是將原始SDN惡意應用程序轉化成可供深度學習的特征突出的矩陣樣本。本方案以深度學習為基礎,將惡意應用程序樣本按照模塊化進行切片,提取特征向量后將其轉化為高維向量并重組成矩陣,最后將矩陣作為輸入,導入深度學習框架中。

圖2 方案總體框架
(1) 將應用分為(正常,惡意)兩類。并利用逆向工具IDA,調用IDC模塊,處理原始樣本,生成GDL(Graph Description Language)文件。
(2) 調用IDA自帶的插件找到整個程序的入口函數,獲取函數名。
(3) 遍歷整個函數,對樣本按照(′UPX′,′UPX1′,′.text′, ′.idata′,′.rdata′,′.data′)等要素進行模塊分組,即切片。
(4) 遍歷每個模塊中的函數,提取出擁有特定函數名的函數。本方法尤其關注SDN惡意應用程序特有的DataChangeListener()、FlowRuleModification()、SwitchFirmwareMisuse()、ReplayingKnownAttack()等模塊。
(5) 調用Python自帶的network模塊,根據GDL文件以模塊為單位生成控制流程圖,如圖3所示。圖3為邏輯關系圖,用以說明,并非用于深度學習的樣本。

圖3 生成的CFG流程圖示例
(6) 編寫getFuncCalls、getLogicInsts、getTransferInsts、getLocalVariables、getBasicBlocks、getBasicBlocks、getIncommingCalls、getIntrs等函數對整體結構和切片進行特征提取,如表2所示。

表2 切片特征提取參數設置
(7) 對每一個樣本的靜態函數所示進行特征提取后,每一個切片都會生成如圖4所示的8維特征向量,然后將所有8維特征向量組成一個8×N維的矩陣。由于每個樣本的大小不一,因此N的大小并不確定,為了方便后面的深度學習實驗,因此需要對樣本進行歸一化。本文采取的方法是設置閾值,即設置N=250,當有樣本大于此值則省去多余部分,不足則添零,因此得到8×250的矩陣。

圖4 函數調用特征提取示例
(8) 將每一個矩陣(如圖5所示)保存成一個文檔,并對文檔進行編號和標記,最后將其作為深度學習樣本。

圖5 生成的矩陣樣本
本方案在谷歌的深度學習框架Tensorflow和調用接口Keras的基礎上搭建深度卷積神經網絡,根據以往的經驗總結,調試各項參數。
現在關于卷積神經網絡中的各個參數的設置沒有固定的方法,更沒有所謂最優的方法,因此以下參數的選擇是在參考文獻[17-18]中給出的設置方法后,再加上自己的理解所設定的。stride為步長;filter為濾波器(也稱卷積核);kernel-Size為卷積核大小;padding為same時表示填充零,此時賦值1,為valid時表示不填充,賦值0;outp代表經過池化層后的輸出,outc代表經過卷積層的輸出。
outp=inlength/stride
(1)
(2)
本方法不適宜采用層數過深和卷積核過多的神經網絡模型。主要有如下兩個原因:(1) 考慮到惡意應用程序的檢測要兼顧準確率和時間效率;(2) 由于現階段的樣本數量不夠多,復雜的網絡對小樣本學習很容易造成過擬合現象。
表3為本文深度學習框架結構及各層參數詳細說明:關于步長的選擇,AlexNet多采用較大的卷積核,減小了層數,VGG多采用3×3的卷積核,表明在結構相似的情況下,網絡越深,性能越好。卷積層的步長如果太長,將會損失大量特征,因此取步長為2。池化層的步長和卷積核的參數采用的是前人的經驗總結。關于過濾器的選擇,設置的依據主要考慮的是實驗平臺的文本處理能力。關于卷積核的大小,本方法主要采用文獻[15]介紹的卷積核的大小3×3。同時也考慮了式(2)的計算最終結果能是整數,所以其中采用了2×2的卷積核。關于padding的選擇主要為了能夠使整體結構更加合理和優化而選擇的補零策略。在解決樣本太少而導致的過擬合問題和收斂性問題時,主要采用不同激活函數和采用正則化手段Dropout。

表3 卷積神經網絡各層參數設置
將所有樣本編號放入同一目錄下,將80%的樣本作為訓練集放入深度學習框架中進行學習,將20%的樣本作為測試集對模型的準確率進行檢測。
本方案優勢如下:
(1) 以往對于惡意代碼的特征提取主要關注其行為、標簽、程序包名、啟動Activity名稱、權限信息等易被隱藏或者偽造的特征,而本方案是對惡意應用程序的控制流程圖這類難以偽造的樣本進行檢測,大大增加了樣本的真實性和可用性。
(2) 相比于文獻[6],本方案的特征選取不僅關注了函數級別的調用和跳轉關系,同時還關注了程序的整體結構特征,對于樣本的描述將更加準確。
(3) 卷積神經網絡作為一種深度學習模型,具有分層學習特征的能力。研究表明,通過卷積神經網絡學習得到的特征相對于人工設計特征具有更強的判別能力和泛化能力。
(4) 切片矩陣由于先將樣本的靜態特征數值化,因此相比于直接將惡意應用程序的CFG圖片作為深度學習的樣本,更能凸顯惡意應用程序內部的調用關系、結構特點等靜態特征,同時相比于圖片樣本,僅僅包含數據的文檔還明顯縮短了深度學習的時間,提高了效率。
IDA是目前最好的一款靜態反編譯軟件,它具有交互式、可編程、可擴展、多處理器的特點,并且可以交叉Windows或Linux MacOS平臺主機來分析程序,IDA Pro已經成為分析敵意代碼的標準并讓其自身迅速成為攻擊研究領域的重要工具。它支持數十種CPU指令集其中包括Intel x86、x64、MIPS、PowerPC、ARM、Z80、68000、c8051等[19]。
Keras是一個高層神經網絡API,由純Python(其版本是:Python 2.7-3.6)編寫而成并支持Tensorflow、Theano以及CNTK后端。Keras具有高度模塊化、極簡和可擴充等特性,支持CNN和RNN。本次實驗所用環境配置如表4所示。

表4 實驗環境配置
樣本來源有兩種:一種是從github開源社區找到的12個樣本,另一種是參考文獻[3]中研究團隊分享的20個樣本。
實驗結果如圖6-圖8所示,其中loss代表損失值,acc代表測試的準確率,val_acc代表測試集的準確率。本方法的損失值最后定在0.408 6,能控制在1以內,表明擬合良好,本方法的準確率最后定在93.75%。若增大樣本數量和循環次數,可使得結果更理想。同時,隨著現在深度卷積神經網絡的不斷發展,網絡層數越來越多,訓練時間更長,消耗資源更多,準確率會有一定提升,但是過擬合現象更嚴重,因此本文的卷積神經網絡在VGG和AlexNet的基礎上,針對本方法樣本的特點,設計了一種適合SDN惡意應用程序檢測的神經網絡,并對每一層的參數進行了調整,兼顧了準確率和效率,取得了更好的效果。

圖6 AlexNet網絡架構實驗結果

圖7 VGG網絡架構實驗結果

圖8 表3中的神經網絡架構實驗結果
不同樣本數量的實驗比較結果如表5所示。本文采用10樣本、20樣本和32樣本的實驗對比。實驗結果表明隨著實驗樣本的增多損失值不斷降低,檢測最高準確率不斷提高,但是隨著循環次數增多,準確率將有5%左右的降低,分析是由于樣本不足,欠擬合導致的,如果樣本足夠多,將使結果更加理想。實驗結果符合預期,證明了本實驗的可行性。

表5 樣本數量與實驗結果的趨勢實驗

表6 與文獻3中檢測時間比較 s
在對相同惡意應用程序采用不同方法進行比較。如表6所示,與文獻[3]中提到的針對于SDN惡意應用程序檢測時間進行比較,本方法設定樣本訓練循環100次(epochs=100),測試集循環1次。對于OpenDaylight的樣本訓練一次耗時24 ms,對于Floodlight樣本訓練耗時49 ms,因此最終檢測耗時為2.424 s和4.949 s,本實驗所用時間并未考慮讀取樣本所花時間,只計算訓練和測試時間。綜上所述,本實驗結果明顯優于文獻[3]。同時文獻[3]并沒有如本文給出對于SDN惡意應用程序的檢測準確率,只給出了平均準確時間,因此所得的結果明顯不夠嚴謹和準確。由于與SDN惡意應用程序檢測相關的文獻較少,在根據現有資料進行比較分析過后,本實驗能更好地完成惡意應用程序檢測功能。
本課題通過深度學習的方法,在SDN的惡意應用程序檢測方面達到了一定的目的,并取得了較理想的效果。然而因為現在關于SDN惡意應用程序的相關樣本還較少,準確率最高能達到93.75%左右。
SDN作為一種新型網絡架構,是未來網絡的發展趨勢。但是現在針對于其安全性的研究還相對滯后,本文為SDN惡意應用程序的檢測提供了一種新的方法,對SDN的安全防護具有參考意義。
由于現在針對SDN網絡的惡意應用程序還較少,因此檢測準確率不夠高。隨著后續研究的推進,在收集大量SDN惡意應用程序樣本之后,可繼續優化和完善本檢測方法,并對本方法進行驗證。對于切片提取的特征,由于樣本大小不同,提取特征多少也不同,本方案現在采用的方法是設置一個閾值,若樣本維數大于8×250,則刪掉多余部分,不足則補零,但是這樣的處理方式過于片面、簡單。而且本方案對于向量如何堆疊和排列成矩陣還有待進一步研究,并作出數學方面嚴謹的推導和證明。