金逸靈
(四川大學(xué)網(wǎng)絡(luò)空間安全學(xué)院,成都610065)
區(qū)別于虛擬硬件資源的傳統(tǒng)虛擬化技術(shù),容器實(shí)現(xiàn)了一種操作系統(tǒng)級(jí)別的虛擬主機(jī)環(huán)境。然而,由于容器資源隔離性低和共享內(nèi)核的特性給云平臺(tái)引入了新的安全風(fēng)險(xiǎn)。容器中的惡意軟件能夠通過(guò)容器或宿主機(jī)的漏洞篡改容器自身的服務(wù),攻擊共駐容器,甚至可以逃逸至宿主機(jī)威脅整個(gè)云平臺(tái)的安全。故針對(duì)容器中的惡意軟件進(jìn)行檢測(cè),維護(hù)云平臺(tái)和租戶數(shù)據(jù)安全具有重要的現(xiàn)實(shí)意義。
現(xiàn)階段針對(duì)惡意軟件的檢測(cè)主要分為動(dòng)態(tài)檢測(cè)和靜態(tài)檢測(cè)兩種方法。文獻(xiàn)[1]針對(duì)虛擬機(jī)進(jìn)程的I/O序列,采用馬爾科夫鏈模型構(gòu)建正常行為基線,以此檢測(cè)虛擬機(jī)中的惡意逃逸進(jìn)程。文獻(xiàn)[2]通過(guò)采集進(jìn)程的系統(tǒng)調(diào)用數(shù)據(jù),基于長(zhǎng)短期記憶神經(jīng)網(wǎng)絡(luò)構(gòu)建了一個(gè)語(yǔ)言分類模型,取得了較好的檢測(cè)效果。以上方法都屬于動(dòng)態(tài)檢測(cè),即針對(duì)進(jìn)程運(yùn)行產(chǎn)生的行為數(shù)據(jù)進(jìn)行檢測(cè),雖然這類方法具有較高的精確度,但因需采集動(dòng)態(tài)數(shù)據(jù),導(dǎo)致引入了較大的性能損耗。另一種方法是靜態(tài)檢測(cè),文獻(xiàn)[3]結(jié)合圖像分析技術(shù)與惡意軟件變種檢測(cè)技術(shù),將整個(gè)惡意軟件映射為灰度圖像,并基于紋理指紋實(shí)現(xiàn)特征提取,以此檢測(cè)惡意軟件。文獻(xiàn)[4]同樣基于圖像紋理,但采用了CNN(Convolutional Neural Network,卷積神經(jīng)網(wǎng)絡(luò))自動(dòng)提取軟件特征,用于惡意軟件的檢測(cè)。以上方法都屬于傳統(tǒng)主機(jī)環(huán)境下的惡意軟件檢測(cè),然而云環(huán)境下的容器與主機(jī)環(huán)境不同,其中的惡意軟件不僅可以存在于容器鏡像中,也可在運(yùn)行的容器中動(dòng)態(tài)加載,因此不可直接移植主機(jī)惡意軟件檢測(cè)方案。
針對(duì)現(xiàn)階段研究工作的不足,為實(shí)現(xiàn)容器環(huán)境下的惡意軟件檢測(cè),本文提供了一套針對(duì)容器的惡意軟件靜態(tài)檢測(cè)系統(tǒng),旨在惡意軟件運(yùn)行前進(jìn)行檢測(cè),從源頭阻斷其攻擊行為,降低檢測(cè)過(guò)程給容器運(yùn)行帶來(lái)的性能損耗。
容器中惡意軟件靜態(tài)檢測(cè)系統(tǒng)設(shè)計(jì)如圖1所示。系統(tǒng)首先采用無(wú)代理方式提取容器鏡像或容器系統(tǒng)中的待測(cè)軟件,然后識(shí)別待測(cè)軟件的可執(zhí)行代碼段,進(jìn)而采用圖像生成技術(shù)將代碼字節(jié)流轉(zhuǎn)換為灰度圖像,最后基于CNN自動(dòng)提取惡意軟件的多維圖像特征,構(gòu)建檢測(cè)模型用于惡意軟件檢測(cè),并將檢測(cè)出的惡意軟件和具體的容器信息輸出到檢測(cè)日志。
圖1 檢測(cè)系統(tǒng)架構(gòu)
Docker通過(guò)層存儲(chǔ)來(lái)管理多層只讀鏡像層和讀寫容器層,通過(guò)存儲(chǔ)驅(qū)動(dòng)來(lái)管理各層內(nèi)容,通過(guò)層的元數(shù)據(jù)存儲(chǔ)來(lái)管理各層的元數(shù)據(jù)。本文以最新的Docker默認(rèn)使用的存儲(chǔ)驅(qū)動(dòng)Overlay2為例,簡(jiǎn)述無(wú)代理提取容器中待測(cè)軟件方法。
圖2 容器與OverlayFS的分層關(guān)系
容器與OverlayFS的分層關(guān)系如圖2所示,其中鏡像層對(duì)應(yīng)Lowerdir,容器層對(duì)應(yīng)Upperdir,容器中可見(jiàn)的文件系統(tǒng)為聯(lián)合掛載點(diǎn)Merged。在內(nèi)核的處理中,用于掛載的各層之間存在層次關(guān)系,主要表現(xiàn)為:上下層同名目錄合并、上下層同名文件覆蓋和僅存在于Lowerdir的文件寫時(shí)拷貝,所以需要分層處理各層內(nèi)容,獲得正確的容器視角下的文件內(nèi)容。無(wú)代理提取容器中待測(cè)軟件的流程如下:
(1)根據(jù)輸入的容器鏡像或容器的唯一標(biāo)識(shí),篩選出元數(shù)據(jù)中的Lowerdir和Upperdir路徑;
(2)將Lowerdir和Upperdir按照層次關(guān)系進(jìn)行格式拼接作為掛載時(shí)的Lowerdir,并新建一個(gè)空的Upperdir;
(3)根據(jù)Docker系統(tǒng)信息獲得存儲(chǔ)驅(qū)動(dòng)類型,將拼接的Lowerdir和空的Upperdir聯(lián)合掛載到一個(gè)臨時(shí)的容器視角目錄;
(4)篩選臨時(shí)目錄下的可執(zhí)行文件,將其絕對(duì)路徑傳給特征抽取模塊,待其分析結(jié)束后,取消掛載臨時(shí)目錄。
ELF(Executable Linkable Format,可執(zhí)行鏈接格式)可執(zhí)行文件內(nèi)部具有section結(jié)構(gòu),section是存儲(chǔ)具體的代碼和數(shù)據(jù)的地方,其由一組section表進(jìn)行索引。其中,section表的起始地址位于ELF文件頭,.text、.init、.fini等是存放代碼的 section,這些 section具有可執(zhí)行標(biāo)志位。
本文針對(duì)指定的ELF文件,通過(guò)軟件readelf分析其內(nèi)部組織結(jié)構(gòu)以得到可執(zhí)行代碼在ELF文件中的位置分布,然后提取所有可執(zhí)行section,并將可執(zhí)行的代碼字節(jié)流放入N*M的矩陣中,以此形成一張N*M大小的灰度圖像,其中,矩陣的每一個(gè)元素代表ELF文件的一個(gè)字節(jié),同時(shí)也對(duì)應(yīng)著灰度圖像中的一個(gè)像素點(diǎn)。但因存在經(jīng)過(guò)加殼或被惡意修改過(guò)的ELF文件,其ELF文件頭被破壞、section表信息被刪除,這將導(dǎo)致readelf無(wú)法得到完整的section信息。針對(duì)該問(wèn)題,本文使用readelf得到ELF文件的入口點(diǎn),進(jìn)而計(jì)算出入口點(diǎn)在ELF文件中的偏移entry_offset,那么從entry_offset開(kāi)始一直到文件末尾file_end的內(nèi)容[entry_offset,file_end]便是需要提取出來(lái)的內(nèi)容,然后根據(jù)提取內(nèi)容的大小選定適當(dāng)?shù)膱D像寬度,最后將ELF文件內(nèi)容填入圖片,不足額空間填充0,得到最終的灰度圖像。
基于由惡意軟件和正常軟件轉(zhuǎn)換的灰度圖像,構(gòu)造CNN模型進(jìn)行惡意軟件的識(shí)別與檢測(cè)。由于不同軟件生成的灰度圖像尺寸不一,為進(jìn)行模型的訓(xùn)練,本文對(duì)圖片進(jìn)行了縮放。圖3為縮放至96×96大小所構(gòu)建的CNN模型結(jié)構(gòu),其中,CNN網(wǎng)絡(luò)具有5層卷積層CONV,每層卷積層的卷積核Filter數(shù)目與大小均已標(biāo)出,卷積之后使用ReLU激活函數(shù)進(jìn)行修正,之后進(jìn)行最大池化Pool,第5層卷積層之后為一個(gè)全連接層NN,其使用512個(gè)神經(jīng)元,之后為Dropout層減少網(wǎng)絡(luò)過(guò)擬合的可能性,最后為Softmax層進(jìn)行類別判定。
圖3 CNN模型結(jié)構(gòu)
實(shí)驗(yàn)環(huán)境:宿主機(jī)CPU型號(hào)為Intel Xeon E5-2658 v2,主頻為2.40GHz,物理內(nèi)存為256GB,操作系統(tǒng)為64位CentOS7,內(nèi)核版本為3.10.0,Docker版本為18.03.0-ce,深度學(xué)習(xí)框架為TensorFlow 2.0.0。
實(shí)驗(yàn)數(shù)據(jù)集:隨機(jī)選取3764個(gè)Linux系統(tǒng)應(yīng)用作為良性樣本集,3482個(gè)VirusShare中的惡意ELF作為惡意樣本集,共計(jì)7246個(gè)樣本,并將各類樣本集按照8:2的比例隨機(jī)分為訓(xùn)練樣本集和測(cè)試樣本集。
評(píng)價(jià)標(biāo)準(zhǔn):使用準(zhǔn)確率(Accuracy,ACC)、檢測(cè)率(Detection Rate,DR)和誤報(bào)率(False Alarm Rate,F(xiàn)AR)評(píng)價(jià)模型的檢測(cè)性能。定義如下:
其中,TP是正確分類為惡意軟件的惡意樣本數(shù),TN是正確分類為良性軟件的良性樣本數(shù),F(xiàn)P是錯(cuò)誤分類為惡意軟件的良性樣本數(shù),F(xiàn)N是錯(cuò)誤分類為良性軟件的惡意樣本數(shù)。
為說(shuō)明系統(tǒng)的檢測(cè)功能有效性,本文通過(guò)調(diào)節(jié)模型迭代次數(shù),得到如表1所示的檢測(cè)結(jié)果,其中Train表示模型訓(xùn)練時(shí)間。
表1 模型迭代次數(shù)與檢測(cè)性能關(guān)系
由表1可知,在迭代次數(shù)為200時(shí),模型訓(xùn)練時(shí)間最長(zhǎng),為1414.37s,但此時(shí)的檢測(cè)效果最優(yōu),準(zhǔn)確率高達(dá)94.75%,檢測(cè)率為94.83%,誤報(bào)率為5.32%。
實(shí)時(shí)檢測(cè)過(guò)程中需要首先針對(duì)目標(biāo)ELF文件生成對(duì)應(yīng)灰度圖像,再將灰度圖像輸入已訓(xùn)練好的模型中進(jìn)行檢測(cè),因此系統(tǒng)的時(shí)間效率主要由灰度圖像生成時(shí)間 模型檢測(cè)時(shí)間兩部分決定。為評(píng)估系統(tǒng)在實(shí)時(shí)檢測(cè)過(guò)程中的時(shí)間效率,本文隨機(jī)選取了100KB~1000KB大小ELF文件中的10個(gè)樣本進(jìn)行分析,統(tǒng)計(jì)每種文件大小生成灰度圖像的平均時(shí)間,結(jié)果如表2所示。
表2 ELF文件大小與灰度圖像生成時(shí)間關(guān)系
由表2可知,ELF文件越大,生成灰度圖像的時(shí)間越久,但在ELF文件大小為1000KB時(shí),灰度圖像生成時(shí)間也在1s左右。由于系統(tǒng)檢測(cè)時(shí)間主要由灰度圖像生成時(shí)間和模型檢測(cè)時(shí)間決定,為評(píng)估系統(tǒng)的平均檢測(cè)效率,本文還測(cè)試了模型的檢測(cè)時(shí)間,針對(duì)一個(gè)96×96大小的灰度圖像而言,模型檢測(cè)時(shí)間為0.0038s,故系統(tǒng)的總體時(shí)間效率是可接受的。
除了測(cè)試系統(tǒng)的時(shí)間效率,本文同時(shí)采用Unix-Bench基準(zhǔn)測(cè)試工具,評(píng)估系統(tǒng)對(duì)被檢測(cè)容器性能的影響,部分測(cè)試結(jié)果如圖4所示。
圖4 UnixBench性能測(cè)試
在未部署檢測(cè)系統(tǒng)時(shí),UnixBench測(cè)試總評(píng)分為2477.3,部署檢測(cè)系統(tǒng)后為2422.8,故檢測(cè)系統(tǒng)給被檢測(cè)容器引入了2.20%的性能損耗。由圖4可知,部署檢測(cè)系統(tǒng)對(duì)容器的影響主要表現(xiàn)在字符串處理、啟動(dòng)shell腳本和文件傳輸方面,原因在于將ELF文件轉(zhuǎn)換為灰度圖像時(shí)需要分析所有可執(zhí)行代碼段。
本文針對(duì)當(dāng)前容器環(huán)境下惡意軟件檢測(cè)研究中存在的問(wèn)題,提出了一種基于卷積神經(jīng)網(wǎng)絡(luò)的容器中惡意軟件靜態(tài)檢測(cè)方法。該方法在容器外部的宿主機(jī)用戶層實(shí)現(xiàn)對(duì)目標(biāo)容器中待測(cè)軟件的靜態(tài)檢測(cè),具有較好的可移植性和安全性,在將軟件轉(zhuǎn)換為灰度圖像時(shí),僅處理可表征軟件行為的可執(zhí)行代碼段,以此縮短灰度圖像生成時(shí)間,提升檢測(cè)效率,還通過(guò)卷積神經(jīng)網(wǎng)絡(luò)自動(dòng)提取圖像的多維局部特征,有效提高了檢測(cè)精度,可在一定程度上保障容器和云平臺(tái)的安全。