Jadeite:基于行為和深度學習的Java惡意軟件檢測新方法
其實不難發現,由于Java本身是一門較為安全的語言,所以針對Java安全相關的研究,如:Java漏洞挖掘和Java惡意代碼檢測,相對來說比較少,通過現有的檢測和分析方法就能夠達到一個不錯的檢測效果。
在惡意代碼檢測領域,將惡意代碼轉換成圖像,配合圖像處理技術進行檢測是一種常用的手段。然而,如果直接將惡意代碼的二進制文件轉換成圖像,可能導致代碼的語義丟失。
本文提出了一種新的基于行為的Java程序轉換方法,用于基于深度學習的惡意軟件分類。通過基于字節碼級別的過程間API調用靜態捕獲Java程序的行為,將這些行為轉換成圖像,利用圖像處理模型(CNN)實現對惡意代碼的檢測。為降低模型受代碼混淆等技術的影響,作者還從字節碼文件中提取了一組額外的特征。
模型已開源:https://github.com/sridhar-research-lab/jadeite。
圖1是Jadeite模型的方法框架。Jadeite以JAR形式的Java字節碼作為輸入,由3個部分組成:(1)字節碼轉換引擎,(2)特征提取引擎和(3)基于CNN的分類引擎。
Fig. 1 方法框架
(1)字節碼轉換引擎
目標是將字節碼轉換成灰度圖。
首先,從JAR文件中提取出字節碼,然后使用Soot將字節碼轉換成Jimple中間語言(一種三地址碼);接著基于Heros從Jimple構建過程間控制流圖(ICFG)。由于生成的JAR文件的過程間控制流圖很大,所以需要對其進行裁剪以降低模型受維數災難和過擬合問題的影響。具體來說,通過刪除如變量賦值、變量初始化等瑣碎質量,僅保留API調用指令(盡可能保證API指令的調用順序),降低ICFG的復雜性。
接著,將ICFG用鄰接矩陣表示,矩陣中的每個元素的值存在于[0, 255]中。A[i, j]表示API調用指令i與API調用指令j之間存在一條邊。如果A[i, j]的值大于255,表示API調用指令i與API調用指令j之間的邊數大于255,則說明可能存在循環或者遞歸的情況,因此需要將該值設置為255。基于ICFG的鄰接矩陣,生成灰度圖,圖的維數為矩陣的維數。
(2)特征提取引擎
特征提取引擎的框架如圖2所示,目標是使用Jarhead從輸入的字節碼中提取一組額外的特征,減低檢測模型受代碼混淆技術的影響。
Jarhead主要提取兩種特征:混淆特征和行為特征。具體來說,Jarhead從字節碼的反匯編代碼中提取統計信息來表示混淆特征,如:是否存在Java對象的特定實例,字符串長度等;行為特征包括下載和執行外部文件等。Jarhead從Java直接碼中總共提取42個特征,而本文模型梯度推進算法(gradient boosting algorithm)從這42個特征中選擇出20個特征,如表1所示。本文所用到的特征可以分為兩大類:已知存在漏洞的函數(如:MidiSystem.getSoundbank),下載和執行行為(如:java.net.URL)。
Fig. 2 特征提取引擎框架
Tab. 1 額外特征
(3)基于CNN的分類引擎
基于CNN的分類引擎需要接收字節碼轉換引擎獲得的灰度圖和特征提取引擎提取的特征,因此需要對這兩種輸入進行組合。圖3是作者探究的幾種不同的輸入組合方式。
- Image Load:僅使用灰度圖作為輸入;
- Single Load:同時使用灰度圖和特征作為輸入,將灰度圖展開成1維向量,然后將特征拼接到其后;
- Double Load:同時使用灰度圖和特征作為輸入,分別使用不同的網絡對二者進行處理,然后將處理的結果進行拼接(這個就類似于推薦系統中的雙塔模型)。
Fig. 3 CNN網絡構架及輸入組合方式
實驗結果及混淆矩陣分別如圖4和5所示。
Fig. 4 實驗結果
Fig. 5 混淆矩陣