本項目將簡介本子計畫於第一年度的系統建置情況,將分別介紹實際佈建狀況、系統 架構、工作流程、系統實作、效能分析。經由以上的介紹可突顯本計畫將不只著力於新興 技術的研究,更注重實務的系統開發。
實際佈建
本子計畫於第一年度100年實際架設Windows惡意程式行為分析雲端平台,並建置 於國立交通大學網路安全實驗室內,以進行第一年度的雲端分析平台研究。本平台利 用市面上能夠採買之高效能運算個人電腦,以節省開發成本。利用這些高運算量來實 現「基於虛擬機器技術之動態程式行為分析」以及「高可靠性惡意程式樣本雲端儲存 系統」。在動態程式行為分析部分,透過整合本實驗室所開發之惡意程式分析模組,
有效地利用此平台的運算效能。而雲端樣本儲存系統,則可以大量的儲存已知或是分 析過可疑的惡意樣本,以供往後的研究、查詢。此平台已經透過產學合作之關係,正 與調查局、中華電信、趨勢科技、交通大學資訊服務中心等相關產業合作。進行實務 性質的惡意程式分析,以提供多樣化的病毒分析研究。
圖 表 7WINDOWS 惡 意 程 式 分 析 雲 端 平 台 實 際 佈 建
21
圖 表 8 網 頁 資 料 爬 取 子 系 統 , 可 蒐 集 網 頁 上 的 資 料 進 行 分 析
22
系統架構
本分析平台主要由三個部分所組成:一)檔案來源子系統、二)儲存子系統、三)
分析器管理子系統。在檔案來源子系統中,本子系統需要接收大量的檔案作為分析的 對象,以分析並取得各種不同型態的惡意軟體。本系統實做一個 PushTask 之函式庫,
此 API 可將任意檔案輸入本系統進行分析,並指定該檔案的優先權。此 PushTask 函 式庫先產生檔案的工作識別(UID),在將此 UID 放入 Redis 中,並將檔案內容存入 Cassandra 中,將檔案輸入我們的系統中。利用此 API 為基礎,我們實做了兩種檔案 來源系統:網頁爬取系統和批次檔案輸入。在儲存系統方面,由於此研究已經被探討 多年,市面上也有大量的資料庫可以應用於本分析平台上。為了節省開發時間以及維 護方便,經過深入地了解以及搜索之後,我們選擇了兩個現有的資料庫系統 Cassandra 和 Redis,透過修改程式、設定檔案和內部些許的程式碼,快速地達到本分析平台所 需要的儲存能力。Cassandra 是一套分散式的資料庫系統,在分析平台中用來儲存未 分析的檔案內容以及分析完的結果。Redis 是一單機的資料庫系統。在分析平台中以 佇列(Queue)的模式來儲存未分析的檔案的工作識別號碼。在分析器管理子系統中,
藉著可以掛載多個分析器的能力。同時進行多個分析器的分析,以取得更準確的結 果。因此我們需要建構一套分析器管理子系統來管理各種不同的分析器,讓各種不 同輸入輸出的分析器能正常運作於本系統中。
圖 表 9 基 於 機 器 碼 之 WINDOWS惡 意 程 式 行 為 分 析 雲 端 平 台 系 統 架 構 圖
23
工作流程
本系統主要的流程可分為兩部分(如圖表 14),彼此間連繫的管道是透過儲存子系 統,詳細如下:
1.由檔案來源子系統至儲存子系統:負責將檔案存入系統中,同時產生後續分析所需的 工作識別。此處的檔案來源目前有三種:使用者上傳、硬碟讀取和Crawler。
2. 由儲存子系統至分析器管理子系統:負責處理未分析的檔案。首先至儲存子系統中的 Redis拿取工作識別後,再去向Cassandra拿取檔案來進行分析,之後儲存結果。
圖 表 10 基 於 機 器 碼 之 WINDOWS惡 意 程 式 行 為 分 析 雲 端 平 台 工 作 流 程
24
invokeAnalysis.rb 啟動分析器,之後拿取未分析檔案 進行分析。
圖表 21
putToRedis.rb Analysis input 元件將取得檔案 的 TaskID 存入 Redis,並且依據 不同的檔案來源給予不同的優先 權。
圖表 18
putToCassandra.rb Analysis input 元件將檔案放入 Cassandra。
圖表 19
getTaskID.rb invokeAnalysis.rb 取得存放在 Redis 內的 TaskID。
圖表 22
getFileContent.rb invokeAnalysis.rb 用 TaskID 至 Cassandra 取得相對應的檔案。
圖表 24
saveReportToCassandra.rb 分析器將分析結果存入 Cassandra。
圖表 26
getReportFromCassandra.rb 將分析器分析完的結果取出。 圖表 25
25
圖 表 11 SECMAP.RB之 虛 擬 碼
本平台的運行主要下的指令如圖表 15,我們將所有系統指令包裝成一個執行檔案。並且會有許 多個元件,可以互相的配合執行。圖表 15 的./secmap 是整合本系統個元件主要執行程式,透 過此介面可以快速啟動、停止下列四個系統主要元件(role):1.)cassandra,本系統中用來儲 存大量資料的分散式資料庫、 2.)dispatcher,用於儲存工作與分配的佇列、3.)nutch,為本 系統來爬取網路資料的元件及 4.)各種 analyzer,掛載於本系統的不同分析器。starttable 和 stoptable 是兩個 Hash 資料結構,將系統元件的名稱對應到一字串值。此介面利用 starttable 將啟動系統儲存及網路爬取元件的所需執行的動作儲存,並利用 stoptable 將停止 系統儲存及網路爬取元件的動作儲存,並根據所取得的參數執行相對應的動作。透過使用 starttable 和 stoptable,可以同時啟動多個不同的元件。例如: ./secmap start cassandra redis,便可以一次將 cassandra 和 redis 運行起來。
以下將對上圖做詳述:
(一) 參數介紹:
cmd:代表所要執行的動作,分為 start 和 stop 兩種指令。
roles[] :執行指令的目標元件的陣列,共有 cassandra、nutch、dispatcher、
analyzer(以名稱區別)
(二) 判別執行指令是’start’或是’stop’。
(三) 對 roles 裡面的各個元件,根據所要執行的指令(stop 或 start),查詢並執行其對應 (starttable 或 stoptable)的指令。
26
startnutch.sh 負責在主節點將 nutch crawler 啟動並透過 map-reduce 的機制將爬取網頁的工 作自動化分配至各附屬節點上。由於 nutch 原本提供的爬網功能包含許多我們系統不需要的部 分,如:製作索引、建構搜尋網頁,因此我們直接利用 nutch 提供的 API 執行爬網的功能,能 提高 nutch 爬網的效率,增加每天搜尋過的網頁數量。
以下將對圖表 16做詳述:
(一)參數介紹:
Seed:為一包含多個網址檔案,代表系統欲抓取的起始網頁(seed)。
(二) nutch_inject_seed
nutch_inject_seed 負責將這些網頁輸入待爬取資料庫(crawldb),以便 nutch 之後 由這些網頁開始爬取網頁。圖()是 seed 檔案的範例。
(三) nutch_generate_URLs、nutch_get_download_filename
此函數由帶爬取資料庫中選取前若干組網頁資料,在本系統中預設是抓取 100,000 組 網 頁 資 料 , 產 生 一 組 待 爬 取 清 單 (fetch list) 。 並 將 產 生 的 清 單 名 稱 傳 給 nutch_fetch_files 作為輸入。
(四) nutch_fetch_files
根據取得的待爬取清單,利用 mapreduce 將檔案分配至各台 slave 上面做爬取的動作。
而個別 slave 在抓取到可執行檔後,便會執行 NutchSlave.rb 將檔案儲存到資料庫 中。
(五) nutch_update_URLs
將在 nutch_fetch_files 找出來的新連結加入待爬取資料庫,並更新已爬取網頁的資 訊
圖 表 12 STARTNUTCH.SH之 虛 擬 碼
27
圖 表 13NUTCH 之 原 始 碼 物 件 以 及 NUTCHSLAVE.RB
當我們在主節點執行 nutch 後,主節點(nutch master)便會自動將所需執行的工作分配至附屬 節點(slave)做網頁爬取的動作。我們改寫 nutch 的程式碼,在做網頁爬取的部分我們加入了 NutchSlaveCrawler() , 此 函 數 利 用 JAVA 提 供 的 Runtime 及 Process 函 式 庫 去 執 行 NutchSlave.rb,並將爬取下來的網頁檔名做為其參數。NutchSlave.rb 負責將檔案上傳至我們 系統。
以下將對圖表 17(NutchSlave.rb)做詳述:
(一)參數介紹:
filename:Nutch 所抓取下來的檔案名稱。
(二) 首先呼叫 generateSecmapUID,計算出檔案的 MD5 以及 SHA1 值,再加上檔案本身大 小作為其唯一識別(UID)回傳。
(三) 接著利用 loadCommandsTable()取得各個函式庫的位置。
(四) 透過 commandsTable,NutchSlave.rb 先執行 putToCassandra 將檔案內容及屬性存入 分散式惡意樣本資料庫內。
(五) 最後利用 putToRedis 將檔案的唯一識別輸入特定優先權的工作佇列,等待分析器處 理。
28
圖 表 14 PUTTOREDIS.RB之 虛 擬 碼
此程式 putToRedis.rb 是用於將 taskUID 根據不同的優先順序(priority)存入 Redis Queue 中。另外,本系統針對不同的分析器都產生一組 Redis Queue(針對不同的 priority)。EX: 有 分析器 A 和分析器 B,兩種分析器,並同時有 3 種優先序,因此一共有 6 個 Redis Queue。
以下將對圖表 18做詳述:
(一)參數介紹:
priority: 代表這筆資料的優先序,同時也是 Redis Queue 命名的一部分。
taskUID: 由分析檔案所產生的 ID,而產生方法則是將檔案內容作 MD5 以及 SHA1,並 將兩者相連最後連上檔案大小而得。
(二) 連線到 Redis server,其中的變數 REDIS_ADDR 和 REDIS_PORT 分別代表 IP 以及 port,
EX:1.2.3.4 和 10001。
將此 taskUID 透過 redis.rpush 放入所有分析器相對應優先序的 Queue 中,以上述的 A B 分析 器為例,當優先序為 3 時,則會將 taskUID 放入 A3 以及 B3 的 Queue 中。
29
圖 表 15 PUTTOCASSANDRA.RB 之 虛 擬 碼
此程式 putToCassandra.rb 的作用是將取得的檔案名稱、取得的時間、檔案的來源以及檔案 內容存入資料庫中。
以下將按步驟解說,如圖表 19所示:
(一) 首先,透過 parseToHashTable 先從 ARGV[] 內取出檔案的基本資料,有檔案名稱、來 源和取得時間。
(二) 再來,連線至資料庫,其中 CassandraHosts.pickAtRandom()是用來連到不同的資料 庫,回傳的值是任一資料庫的 IP 地址,目的是為了流量能夠均勻分到每一台分散式 的資料庫上。
(三) 取出檔案資料。
(四) 針對檔案內容透過 generateSecmapUID()產生相對應的 ID,而產生方法則是將檔案內 容作 MD5 以及 SHA1,並將兩者相連最後再連上檔案大小而得。
(五) 最後透過 client.insert 來對資料庫的相對應欄位(super column:SUMMARY 和 column name:content…etc)填入相對的值(value)。
30
圖 表 16ANALYZERINVOKER之 虛 擬 碼
AnalyzerInvoker 負責將分析器運行起來,自動從系統取得檔案並執行分析,最後再將結果存 回系統。分析器只要放置於特定目錄(如:~/analysis),並且具有 config 檔案並設定啟動分 析器的方式以及報告儲存的位置,便可以整合進我們系統。以下將對圖表 20做詳述:
(一)參數介紹:
analyzerName:所要執行的分析器名稱
AnalyzerInvoker 會先執行 loadCommandsTable 取得各個 API 的位置。
(二) 執行 readAnalyzerConfig,此函數分析分析器 config 設定,記錄分析器執行方式及 報告位置。執行 getTaskID API,此 API 會連線至 redis 工作佇列,取得指定分析器 所需要分析的檔案 UID。
(三) 透過檔案的 UID,我們可以利用 getFileContent 從 cassandra 取得檔案內容,並儲 存於本地端。
(四) 根據分析 config 取得的執行方式,AnalyzerInvoker 可以利用 invokeAnalysis API 將分析器執行起來,並將待分析檔案傳給分析器做為參數,
(五) 最後呼叫 saveReportToCassandra 將分析報告儲存回 Cassandra 資料庫。