惡意代碼檢測工具 — Mathematics Malware Detected Tools

  • 2019 年 10 月 31 日
  • 筆記

Mathematics Malware Detected Tools

重要:由於缺少測試數據,部分結論可能不正確。更多更準確的結論,還需要進行大量實驗。

概述

mmdt(Mathematics Malware Detected Tools)是一款基於數學方法的最簡單的類「機器學習」工具。該工具通過數學方法對目標對象進行處理,生成相應的標準「指紋」,通過對指紋的處理,實現「機器學習」中的「分類」、「聚類」方法。
並在此基礎上,從「分類」衍生出惡意代碼檢測功能,從「聚類」衍生出惡意代碼同源樣本挖掘功能。

備註:

  1. 對該工具而言,分類、聚類之間唯一的區別是有無已知標籤,除此之外完全一樣。
  2. 這裡「分聚類」的意思已經幾乎等價於機器學習中的分聚類,類似的,分類需要有已知的訓練集,聚類則不需要。

工具特點

工具特點如下:

  1. 還原最古老、原始、簡單的機器學習過程,
  2. 實現從數據到信息的轉換,適用於最真實的大數據場景
  3. 檢測過程高效、快捷,支持多級索引,實現毫秒級處理
  4. 單機模式對百萬級數量的特徵實現毫秒級的檢索、匹配
  5. 實現100%「見過即可查」,將檢出問題簡單轉化為數據問題,數據越多,檢出越多
  6. 不用擔心數據災難,維度災難等問題。
  7. 支持幾乎所有文件格式

工具目的

可參考著名工具ssdeep的目的及意義。

該工具相對於ssdeep的優勢:

  1. 處理結果的記憶屬性:提供處理結果存儲功能,實現對歷史數據的回溯。
  2. 對大數據的支持:單機版支持百萬級別的特徵數量,100萬條特徵所佔磁盤空間不足100M。
  3. 快速高效的匹配:增加多級索引模式,支持更高效快速的檢索、匹配。
  4. 完整的使用流程:傻瓜式的適用方式,類似於常規機器學習過程,設置標籤,配置參數,提供訓練集,即可以自動化的生成最小規則庫(機器學習中的最小模型)
  5. 智能的學習過程:學習結果實時反饋,避免重複學習。

原理概要

通過壓縮算法對文件進行縮放,生成標準文件、使用哈希函數對標準文件進行處理,得到「分片」哈希(指紋)。詳細內容參見後續論文(撰寫論文中)。

原理不夠,表情包湊。

完全一樣的約束條件下,能推論出一個特解。我的狀態:

弱化(減少)約束條件之後,面對新的數學問題時,我的狀態:

在群里請教大佬數學問題時,我的狀態:

配置參數說明

main.ini

主配置文件,用於配置執行相關功能時的參數選項。

[version]  auto-add=0                     // function-type=3時生效,用於分類「訓練模型」時(是否自動更新模型)0:不更新,非0:更新  auto-move=0                    // 用於聚類時是否移動文件,0:不移動,非0:移動  function-type=3                // 選擇功能,2:相似度計算比較,3:分類訓練/掃描,4:聚類  normalization-standar=100      // 歸一化標準,默認100  scan-level=10                  // 掃描覆蓋率,取值在[0, 5]之間時越大覆蓋率越高,準確性越低,其他值為默認掃描,覆蓋率最低,準確性最高  first-level=60                 // 方式1的準確度,取值在[0, 100]之間,越低越準確,覆蓋率越低  second-level=50                // 方式2的準確度,取值在[0, 100]之間,越低越準確,覆蓋率越低  accury-level=3                 // 計算相似度方式,取值為1、3,取值為1時使用低精度方式,取值為3時使用高精度方式  thresold=0.5                   // 判定閾值  classify-id=-1                 // 分類「訓練模型」是生效,需要給定當前這批文件的標籤  max-cluster-number=1000        //支持最大聚類數量  max-file-size=20971520         //支持最大處理文件大小20M,超過的截斷處理  rule-file=rule.db              // 規則庫(模型存儲)  label-file=classify-label.ini  // 標籤配置文件

classify-label.ini

標籤配置文件,用於分類(掃描)時,將id轉成對應的字符串,節約存儲空間。詳細使用參考使用場景

[version]  version=1.0.0    [owner]  name=mmdt    [label_name]  -1=Unknown              // id: -1 保留值,映射為 Unknown  0=Clean                 // id: 0 保留值,映射為 Clean  1=Sality                // id: 1 自增,映射為 Sality(病毒名)  ...                     // 後續依次自增

cmd參數

參數意義見main.ini

Version: 1.0.0  Options:      --help,                   -h,show help info.      --auto-add,               -a,auto add rule.      --auto-move,              -b,auto move cluster.      --function-type,          -f,function type.      --normalization-standard, -n,normalization standard.      --scan-level,             -l,scan level.      --first-level,            -d,first level.      --second-level,           -e,second level.      --classify-id,            -j,classify id.      --thresold,               -p,thresold value.      --compare-file,           -c,comare file.      --max-cluster-number,     -m,max cluster number.      --ini-file,               -i,ini file      --label-file,             -o,label file      --rule-file,              -r,rule file      --target,                 -t,target

使用場景

本段落主要說明工具的用法以及怎麼用。不同的使用場景需要配置不同的參數。

目前考慮到使用場景具體包括:

  1. 分類場景,惡意代碼檢測
  2. 聚類場景,自動同源性的化惡意代碼挖掘
  3. 相似度計算場景,如計算可執行文件相似度、計算源代碼相似度、計算webshell相似度、計算宏代碼相似度、計算圖片相似度

分類場景

生成特徵庫(模型「訓練」)

對有標籤樣本提取特徵,生成指紋,融入特徵庫。

執行命令如下:

  1. ./mmdt -f 3 -a 1 -j 1 -r rule.db -o classify-label.ini -t /Users/ddvv/gitcode/mmdt/tmp/test/Sality/
  2. ./mmdt -f 3 -a 1 -j 2 -r rule.db -o classify-label.ini -t /Users/ddvv/gitcode/mmdt/tmp/test/Berbew/
  3. ./mmdt -f 3 -a 1 -j 3 -r rule.db -o classify-label.ini -t /Users/ddvv/gitcode/mmdt/tmp/test/Gandcrab/
  4. …(依次對其他文件夾進行處理,生成庫文件[「模型」])
-f: 3表示採用掃描/訓練模式  -a: 1表示自動存儲滿足條件的指紋  -j: 1表示標籤id  -r: 特徵庫文名稱  -o: 標籤文件  -t: 目標對象,可以是單個文件,也可以是目錄(目錄必須帶上最後的斜桿)

可執行文件檢測

執行命令:

  1. ./mmdt -f 3 -r rule.db -o classify-label.ini -t /Users/ddvv/gitcode/mmdt/tmp/test/Wabot/
  2. ./mmdt -f 3 -r rule.db -o classify-label.ini -t /Users/ddvv/gitcode/mmdt/tmp/test/Gandcrab/

輸出檢出情況。

total number: 表示一共掃描的文件個數  scanned number: 表示本工具能處理的文件個數  can't recognize number: 表示本公舉不能處理的文件個數  add rule number: 表示添加的規則數  total classify number: 表示能識別的文件總數  checkout classify ratio: 表示識別率  total run : 表示本次程序執行時間

非可執行文件檢測(與PE文件檢測完全一致)

執行命令:

  1. 掃描宏:./mmdt -f 3 -r rule.db -o classify-label.ini -t /Users/ddvv/gitcode/mmdt/tmp/test/Macros/
  2. 掃描11882漏洞利用:./mmdt -f 3 -r rule.db -o classify-label.ini -t /Users/ddvv/gitcode/mmdt/tmp/test/CVE-2017-11882/

聚類場景

惡意代碼聚類

對51個文件,共計9個大類進行聚類,執行命令:

  1. 聚類,並將同類移動到同一個文件夾下:./mmdt -f 4 -b 1 -m 1000 -t /Users/ddvv/gitcode/mmdt/tmp/test/All/
-f: 4表示採用聚類模式  -b: 1表示自動移動同源文件到相同目錄  -m: 表示本次聚類支持的最大類別數量  -t: 目標對象,可以是單個文件,也可以是目錄(目錄必須帶上最後的斜桿)

結果如下:

51個樣本聚類數量29類。從截圖信息可以看出,mmdt_000是CVE-2018-0802類型,共計8個樣本

相似度計算場景

用於計算文件間的相似度。

惡意文件相似度計算

計算Gandcrab_2和其他文件之間的相似度,執行命令:

./mmdt -f 2 -c /Users/ddvv/gitcode/mmdt/tmp/test/Gandcrab/Gandcrab_2 -t /Users/ddvv/gitcode/mmdt/tmp/test/All/

-f: 2表示採用計算相似度模式  -c: 表示比較的目標對象(只能是文件,不能是文件夾)  -t: 表示目標對象,可以是單個文件,也可以是目錄(目錄必須帶上最後的斜桿)

結果如下:



計算CVE-2018-0802_1和其他文件之間的相似度:執行命令:

./mmdt -f 2 -c /Users/ddvv/gitcode/mmdt/tmp/test/CVE-2018-0802/CVE-2018-0802_1 -t /Users/ddvv/gitcode/mmdt/tmp/test/All/

結果如下:

源代碼相似度計算

對ssdeep中不同commit間的engine.cpp源碼進行相似度計算,原始差異如下圖:

執行命令(歸一化標準設置為500),

./mmdt -f 2 -n 500 -c /Users/ddvv/gitcode/mmdt/tmp/test/source/engine_new.cpp -t /Users/ddvv/gitcode/mmdt/tmp/test/source/engine_old.cpp

相似度計算結果如下:

webshell相似度計算

對webshell進行相似度計算,原始差異如下圖:

執行命令(歸一化標準設置為默認100),

./mmdt -f 2 -c /Users/ddvv/gitcode/mmdt/tmp/test/webshell/php1 -t /Users/ddvv/gitcode/mmdt/tmp/test/webshell/

相似度計算結果如下:

宏代碼相似度計算

對宏代碼進行相似度計算,原始差異如下圖:

執行命令(歸一化標準設置為默認100),

./mmdt -f 2 -c /Users/ddvv/gitcode/mmdt/tmp/test/Macros/Macros_3 -t /Users/ddvv/gitcode/mmdt/tmp/test/Macros/

相似度計算結果如下:

其他使用場景

通過一些參數優化等方式,有可能也能利用在相似圖像查找上面。

原圖如下:

執行命令(歸一化標準設置為210),

./mmdt -f 2 -k 3 -n 210 -c /Users/ddvv/gitcode/mmdt/tmp/test/Img/img1.jpeg -t /Users/ddvv/gitcode/mmdt/tmp/test/Img/

相似度計算結果如下:

惡意代碼檢測

對314個惡意樣本使用同一參數(見main.ini文件),進行測試統計(樣本來源參考malware-samplesAPT-Sample)。

標籤名 樣本數量 規則數量 規則/樣本數量比率
Clean 5 4 0.800
Sality 3 2 0.667
Berbew 4 4 1.000
Gandcrab 6 3 0.500
Malex 3 1 0.333
Wabot 3 3 1.000
CVE-2017-11882 7 5 0.714
CVE-2018-0802 16 4 0.250
Macros 4 3 0.750
Malware 78 71 0.910
APT 185 171 0.924
總計 314 271 0.863

RS比率=規則/樣本數量比率

可推導出的結論包括:

  1. RS比率越低表示識別效果越好
  2. RS比率與惡意樣本類型相關
  3. RS比率高低與配置參數相關
  4. 放大數據集,RS比率會降低

其他

為什麼不開源代碼?

主要還是如下兩個原因:

  1. code水平很差,代碼太丑,暫時不好意思開源
  2. 這個工具是論文的驗證demo,需要完成論文後,才方便開源

為什麼提供該工具?

出於兩方面的原因考慮:

  1. 主要希望能換取更多的合法數據(樣本),進行測試
  2. 次之希望有大佬能提供測試結果,能引用到論文中。

未來是否對這個工具的改進?

會。比如考慮支持以下一些場景和功能:

  1. 結合動態技術,對內存做運算,生成指紋,進行匹配
  2. 增加C/S,B/S模式,增加緩存機制,以支持更大數據集提供更好的特徵子集
  3. 智能配置文檔生成,更優支持更多的文件類型

Github地址

Github — ddvv

壓縮包解壓碼

解壓碼:mmdt