金逸靈
(四川大學網絡空間安全學院,成都610065)
區別于虛擬硬件資源的傳統虛擬化技術,容器實現了一種操作系統級別的虛擬主機環境。然而,由于容器資源隔離性低和共享內核的特性給云平臺引入了新的安全風險。容器中的惡意軟件能夠通過容器或宿主機的漏洞篡改容器自身的服務,攻擊共駐容器,甚至可以逃逸至宿主機威脅整個云平臺的安全。故針對容器中的惡意軟件進行檢測,維護云平臺和租戶數據安全具有重要的現實意義。
現階段針對惡意軟件的檢測主要分為動態檢測和靜態檢測兩種方法。文獻[1]針對虛擬機進程的I/O序列,采用馬爾科夫鏈模型構建正常行為基線,以此檢測虛擬機中的惡意逃逸進程。文獻[2]通過采集進程的系統調用數據,基于長短期記憶神經網絡構建了一個語言分類模型,取得了較好的檢測效果。以上方法都屬于動態檢測,即針對進程運行產生的行為數據進行檢測,雖然這類方法具有較高的精確度,但因需采集動態數據,導致引入了較大的性能損耗。另一種方法是靜態檢測,文獻[3]結合圖像分析技術與惡意軟件變種檢測技術,將整個惡意軟件映射為灰度圖像,并基于紋理指紋實現特征提取,以此檢測惡意軟件。文獻[4]同樣基于圖像紋理,但采用了CNN(Convolutional Neural Network,卷積神經網絡)自動提取軟件特征,用于惡意軟件的檢測。以上方法都屬于傳統主機環境下的惡意軟件檢測,然而云環境下的容器與主機環境不同,其中的惡意軟件不僅可以存在于容器鏡像中,也可在運行的容器中動態加載,因此不可直接移植主機惡意軟件檢測方案。
針對現階段研究工作的不足,為實現容器環境下的惡意軟件檢測,本文提供了一套針對容器的惡意軟件靜態檢測系統,旨在惡意軟件運行前進行檢測,從源頭阻斷其攻擊行為,降低檢測過程給容器運行帶來的性能損耗。
容器中惡意軟件靜態檢測系統設計如圖1所示。系統首先采用無代理方式提取容器鏡像或容器系統中的待測軟件,然后識別待測軟件的可執行代碼段,進而采用圖像生成技術將代碼字節流轉換為灰度圖像,最后基于CNN自動提取惡意軟件的多維圖像特征,構建檢測模型用于惡意軟件檢測,并將檢測出的惡意軟件和具體的容器信息輸出到檢測日志。

圖1 檢測系統架構
Docker通過層存儲來管理多層只讀鏡像層和讀寫容器層,通過存儲驅動來管理各層內容,通過層的元數據存儲來管理各層的元數據。本文以最新的Docker默認使用的存儲驅動Overlay2為例,簡述無代理提取容器中待測軟件方法。

圖2 容器與OverlayFS的分層關系
容器與OverlayFS的分層關系如圖2所示,其中鏡像層對應Lowerdir,容器層對應Upperdir,容器中可見的文件系統為聯合掛載點Merged。在內核的處理中,用于掛載的各層之間存在層次關系,主要表現為:上下層同名目錄合并、上下層同名文件覆蓋和僅存在于Lowerdir的文件寫時拷貝,所以需要分層處理各層內容,獲得正確的容器視角下的文件內容。無代理提取容器中待測軟件的流程如下:
(1)根據輸入的容器鏡像或容器的唯一標識,篩選出元數據中的Lowerdir和Upperdir路徑;
(2)將Lowerdir和Upperdir按照層次關系進行格式拼接作為掛載時的Lowerdir,并新建一個空的Upperdir;
(3)根據Docker系統信息獲得存儲驅動類型,將拼接的Lowerdir和空的Upperdir聯合掛載到一個臨時的容器視角目錄;
(4)篩選臨時目錄下的可執行文件,將其絕對路徑傳給特征抽取模塊,待其分析結束后,取消掛載臨時目錄。
ELF(Executable Linkable Format,可執行鏈接格式)可執行文件內部具有section結構,section是存儲具體的代碼和數據的地方,其由一組section表進行索引。其中,section表的起始地址位于ELF文件頭,.text、.init、.fini等是存放代碼的 section,這些 section具有可執行標志位。
本文針對指定的ELF文件,通過軟件readelf分析其內部組織結構以得到可執行代碼在ELF文件中的位置分布,然后提取所有可執行section,并將可執行的代碼字節流放入N*M的矩陣中,以此形成一張N*M大小的灰度圖像,其中,矩陣的每一個元素代表ELF文件的一個字節,同時也對應著灰度圖像中的一個像素點。但因存在經過加殼或被惡意修改過的ELF文件,其ELF文件頭被破壞、section表信息被刪除,這將導致readelf無法得到完整的section信息。針對該問題,本文使用readelf得到ELF文件的入口點,進而計算出入口點在ELF文件中的偏移entry_offset,那么從entry_offset開始一直到文件末尾file_end的內容[entry_offset,file_end]便是需要提取出來的內容,然后根據提取內容的大小選定適當的圖像寬度,最后將ELF文件內容填入圖片,不足額空間填充0,得到最終的灰度圖像。
基于由惡意軟件和正常軟件轉換的灰度圖像,構造CNN模型進行惡意軟件的識別與檢測。由于不同軟件生成的灰度圖像尺寸不一,為進行模型的訓練,本文對圖片進行了縮放。圖3為縮放至96×96大小所構建的CNN模型結構,其中,CNN網絡具有5層卷積層CONV,每層卷積層的卷積核Filter數目與大小均已標出,卷積之后使用ReLU激活函數進行修正,之后進行最大池化Pool,第5層卷積層之后為一個全連接層NN,其使用512個神經元,之后為Dropout層減少網絡過擬合的可能性,最后為Softmax層進行類別判定。

圖3 CNN模型結構
實驗環境:宿主機CPU型號為Intel Xeon E5-2658 v2,主頻為2.40GHz,物理內存為256GB,操作系統為64位CentOS7,內核版本為3.10.0,Docker版本為18.03.0-ce,深度學習框架為TensorFlow 2.0.0。
實驗數據集:隨機選取3764個Linux系統應用作為良性樣本集,3482個VirusShare中的惡意ELF作為惡意樣本集,共計7246個樣本,并將各類樣本集按照8:2的比例隨機分為訓練樣本集和測試樣本集。
評價標準:使用準確率(Accuracy,ACC)、檢測率(Detection Rate,DR)和誤報率(False Alarm Rate,FAR)評價模型的檢測性能。定義如下:

其中,TP是正確分類為惡意軟件的惡意樣本數,TN是正確分類為良性軟件的良性樣本數,FP是錯誤分類為惡意軟件的良性樣本數,FN是錯誤分類為良性軟件的惡意樣本數。
為說明系統的檢測功能有效性,本文通過調節模型迭代次數,得到如表1所示的檢測結果,其中Train表示模型訓練時間。

表1 模型迭代次數與檢測性能關系
由表1可知,在迭代次數為200時,模型訓練時間最長,為1414.37s,但此時的檢測效果最優,準確率高達94.75%,檢測率為94.83%,誤報率為5.32%。
實時檢測過程中需要首先針對目標ELF文件生成對應灰度圖像,再將灰度圖像輸入已訓練好的模型中進行檢測,因此系統的時間效率主要由灰度圖像生成時間 模型檢測時間兩部分決定。為評估系統在實時檢測過程中的時間效率,本文隨機選取了100KB~1000KB大小ELF文件中的10個樣本進行分析,統計每種文件大小生成灰度圖像的平均時間,結果如表2所示。

表2 ELF文件大小與灰度圖像生成時間關系
由表2可知,ELF文件越大,生成灰度圖像的時間越久,但在ELF文件大小為1000KB時,灰度圖像生成時間也在1s左右。由于系統檢測時間主要由灰度圖像生成時間和模型檢測時間決定,為評估系統的平均檢測效率,本文還測試了模型的檢測時間,針對一個96×96大小的灰度圖像而言,模型檢測時間為0.0038s,故系統的總體時間效率是可接受的。
除了測試系統的時間效率,本文同時采用Unix-Bench基準測試工具,評估系統對被檢測容器性能的影響,部分測試結果如圖4所示。

圖4 UnixBench性能測試
在未部署檢測系統時,UnixBench測試總評分為2477.3,部署檢測系統后為2422.8,故檢測系統給被檢測容器引入了2.20%的性能損耗。由圖4可知,部署檢測系統對容器的影響主要表現在字符串處理、啟動shell腳本和文件傳輸方面,原因在于將ELF文件轉換為灰度圖像時需要分析所有可執行代碼段。
本文針對當前容器環境下惡意軟件檢測研究中存在的問題,提出了一種基于卷積神經網絡的容器中惡意軟件靜態檢測方法。該方法在容器外部的宿主機用戶層實現對目標容器中待測軟件的靜態檢測,具有較好的可移植性和安全性,在將軟件轉換為灰度圖像時,僅處理可表征軟件行為的可執行代碼段,以此縮短灰度圖像生成時間,提升檢測效率,還通過卷積神經網絡自動提取圖像的多維局部特征,有效提高了檢測精度,可在一定程度上保障容器和云平臺的安全。