朱元慶, 李賽飛, 李洪赭
(西南交通大學 信息科學與技術學院, 成都 611756)
根據賽門鐵克在2019年發布的互聯網安全報告[1]來看, “Living off the land, Lotl”的攻擊技術存在上升的趨勢, 已然成為目前網絡安全威脅中的主流模式. 此外根據該報告所述的情況, 這種類型的攻擊在2018年飆升了78%. 報告中還提到2018年發現的4個新的威脅群體中, 有兩個是使用Lotl技術被發現的. 近些年來越來越多的威脅群體喜歡使用這類技術[1]. Lotl技術將其活動隱藏在合法的系統進程中, 讓攻擊者保持足夠的隱匿, 例如大量使用PowerShell、Cmd等工具. 這些程序作為系統工具存在, 其本身并不具有主動攻擊性, 攻擊者利用其兩面性來進行威脅. 2017年Petya的變種勒索軟件大規模襲擊世界各國組織. 其利用的漏洞與勒索軟件WannaCry利用的漏洞相同, 區別是Petya通過使用Windows管理工具WMI、命令行等工具遠程執行一系列系統級的命令來實現相關功能[2]. 在此過程中攻擊者使用系統工具執行既定策略達到目的, 將惡意行為隱藏在系統活動中逃避了現有安全產品的檢測.雖然這些行為不會被安全產品探測到, 卻被系統日志記錄了起來. 研究從主機日志提取惡意行為的模型對現有安全問題極具現實意義.
雖然分析用戶系統日志中的威脅和入侵不是新的趨勢, 卻是入侵檢測中研究最多的領域之一. 現階段針對主機日志中的惡意行為研究主要集中在以下的幾種研究方向. 研究方向一是通過構造檢測規則或使用啟發式的算法來檢測日志數據. 近年來MIRTE公司推出了ATT & CK模型, 其目標是創建網絡攻擊中已知的攻擊策略、戰術與技術的詳盡列表, 對每一種戰術的意義影響、利用方式以及檢測數據來源做了詳盡闡述[3].研究人員可以根據該框架的知識制定每種技術的檢測規則[4]. 文獻[5]中利用檢測規則提取出日志中的惡意活動, 映射到攻擊策略, 抽象出策略層的場景圖. 使用祖先節點覆蓋的概念來評估節點之間依賴強度, 實現了不同攻擊技術之間的關聯, 進而提取出其中的攻擊序列. 文獻[6]中利用系統日志構建起源圖, 使用規則檢測出攻擊的及其所處階段, 通過信息流之間的相關性, 在圖中將惡意事件關聯成攻擊路徑.
上述文獻中基于規則來發現多步攻擊的研究, 檢測精度高, 誤報率低, 但基于規則的檢測對于未知威脅的檢測能力受限. 因此, 主機日志中的惡意行為研究方向二, 對事件日志壓縮找出其中攻擊序列. 文獻[7]通過對系統日志進行壓縮, 刪除其中未對系統造成持久影響的事件, 例如進程運行時產生的沒有被其他進程訪問的臨時文件, 提取出日志中的重要行為. 文獻[8]進一步提出動態污點分析的日志壓縮方案, 通過追蹤污點在主機中的擴散, 將此過程中的調用保存下來達到壓縮目的, 分析后可得到惡意行為[9].
研究方向三: 有研究人員將機器學習與日志分析結合, 利用機器學習強大的分類能力尋找日志中潛在的惡意模式. 文獻[10]中利用邏輯回歸等機器學習算法給日志社區中的惡意行為提取特征, 通過社區檢測算法發現日志中的惡意社區, 完成攻擊序列的發現. 機器學習的研究方法擁有對異常威脅模式強大的發現能力, 對于新型威脅有更好的檢測能力.
綜上機器學習方法的優勢, 本文利用機器學習在Sysmon[11]日志的基礎上提出一種基于來源圖的框架,關注日志中事件行為. 將多種事件日志統一提取解析[10],具體提取內容第2節所述. 以進程為實體建立無向圖,結合圖中進程與文件操作等事件, 使用分類效果更好的XGBoost算法進行有監督分類, 預測惡意事件概率值作為圖中邊的權重, 進而得到一個無向加權圖, 使用社區發現算法找出其中的惡意攻擊社區[12-14]. 最后在MIRTE ATT & CK提供的評估數據集[15,16]上進行驗證. 實驗顯示使用XGBoost結合社區發現的模型, 檢測結果更穩定, 效果更好, 具體實驗如下文詳述.
對于Lotl類型的攻擊行為, 其使用的是就地取材式的戰術策略, 傳統以惡意文件為載體的安全檢測不再奏效, 因此研究的重點應轉移到攻擊行為上來. 對于每一條日志來講, 其記錄的是單一的動作行為或事件信息. 為了關注攻擊行為的上下文關系, 我們使用基于圖的模型來表達這種關系. 所以日志中提取的事件數據以圖的數據模型進行存儲, 其示意圖如圖1所示.

圖1 日志實體無向圖示意圖
節點(node): 正在建模的日志對象實體(例如: 進程名、文件名等);
邊(edge): 對象實體之間關系特征向量(例如: 父子進程、文件操作等);
元數據(matedata): 節點、邊的特性或參數(例如:進程ID、命令行、哈希值等).
整個算法模型的基礎是日志中事件數據建立的社區網絡圖, 之后的邊權重分配與社區發現也是在此基礎上對數據進行處理. Sysmon作為一款微軟官方提供的日志工具[11], 監控系統的動態行為, 生成事件日志.從Sysmon日志數據中解析出圖中節點所需字段如表1所示. 主要包括進程創建(process creation)、進程終止(process termination)、文件創建(file create)與刪除(file delete)等事件記錄. 在所有事件的類型中又可以劃分為關聯事件與信息事件, 其中的關聯事件是指提供兩個實體之間聯系的事件, 主要包括內容如表2所示.

表1 預定義日志實體格式

表2 關聯事件列表
表2的關聯事件中Event ID1與Event ID 11的日志格式如圖2所示, 更多類型日志詳細格式可查閱官方文檔[11]. 其中Event ID 1記錄的是進程創建事件, 主要的日志字段包括進程ID (ProcessGuid)、父進程ID(ParentProcessGuid)、創建時間戳(UtcTime)、進程映像(Image)、父進程映像(ParentImage)、進程原始文件名(OriginalFileName)、命令行(CommandLine)以及進程哈希值(Hashes)等字段; EventID 11跟蹤的是文件創建事件, 其主要字段包括進程ID (ProcessGuid)和目標文件名(TargetFilename)等.

圖2 EventID 1和EventID 11的日志格式
根據表2中列出的關聯事件日志類型及其關聯字段, 將表2中的關聯事件提取出統一的日志實體格式,模型以ProcessGuid字段作為日志實體的節點字段, 其他提取的相關日志字段作為該節點的元數據. 提取出如表1的預定義日志實體字段及該字段的來源.
多類型的日志格式經過統一提取后, 形成表1所示日志實體格式, 此時的日志實體集合作為無向圖G0中的節點集合V.
日志解析之后通過觀察節點集合V中任意兩個日志實體 (Nodea,Nodeb)的元數據字段之間存在的關系, 例如兩個實體是否存在父子進程、兄弟進程的關系, 進程映像文件是否相同, 路徑是否存在關聯等等特征, 選取出如表3中所示的20維關系特征. 迭代產生節點之間的關系向量集合, 作為無向圖G0中的邊集合E. 在Sysmon日志中ProcessID字段存在復用情況, 使用唯一值ProcessGuid來表示進程實體.
關于表3中實體間的關系向量,f0和f19表示事件時間關系, 實體a、b之間的時間差是否小于間隔Δ,是則該項為1, 否則為0.f1-f4項表示實體a和b之間的進程關系, 以f1、f2為例, 當實體a的ProcessGuid等于實體b的ProcessGuid, 說明兩個實體屬于同一個進程,f2表示實體a、b屬于同一個父進程創建的兄弟進程, 如果成立該項為1, 否則為0; 同理f5表示兩個日志實體是否來自同一主機;f6-f9表示實體中進程映像的關系;f10-f13表示兩個實體之間進程命令的關系;f14表示進程實體的原始文件名, 該項可以檢測進程重命名情況;f15表示當前日志實體所在路徑, 對于惡意活動中的文件掃描行為, 提取文件操作之間的關系;f16表示實體間的哈希值是否一致;f17、f18表示文件創建過程中路徑與文件名的關系.

表3 日志實體間關系特征
經過上述過程的關聯, 我們將實體集合V中的任意兩個實體間關系提出, 作為兩個實體(Nodea,Nodeb)之間的邊. 所以該圖可表示為式(1), 其示意如圖1所示.

其中,

日志解析之后生成了事件關聯圖G0, 其中包括正常良性日志社區與惡意日志社區. 因為惡意行為與良性行為在父子進程、兄弟進程、文件操作等行為上存在差異, 受到社交網絡分類的啟示, 在事件關聯圖G0上使用社區發現算法發現G0中的惡意行為社區.
社區檢測Louvain算法[17]適用于大規模網絡結構中快速發現其中的社區模塊. 該算法社區發現效果較好, 復雜度較低和計算速度更快. Louvain算法本身是一種基于模塊度的社區發現算法. 其中模塊度的概念由Newman[18]提出, 作為一種在復雜網絡圖中評估社區劃分情況的數學指標, 其定義為式(3):

其中,Ai,j表示頂點i與j之間的權重,ki與kj分別表示連接到點i與點j的權重和,m是圖中所有節點的邊權重總和, δ (ci,cj)的ci與cj表示頂點i和j所屬的社區,其中如果ci=cj, 則δ (ci,cj)=1, 反之δ (ci,cj=0)[17]. 之后進一步將式(3)化簡, 可以得到式(4)所示形式, 其中Σin表 示為網絡圖社區內部邊權值總和, Σtot為與網絡圖社區內節點相連的外部邊的權值總和.

算法過程主要分為兩個階段: 首先算法初始化認為網絡中每個節點都是一個獨立的模塊. 在第一階段的迭代過程中, 對于每一個頂點i, 將其依次分配到相鄰頂點j, 計算式(5)所示的分配前后模塊度變化 ΔQ.如果此過程中最大的 ΔQ>0, 則將頂點i分配到最大ΔQ對應頂點j的社區, 否則不做任何變化, 直到所有節點所屬的社區不再發生變化.

算法的第二階段迭代之前, 先將第一階段中的子社區整體看作一個超節點, 該社區內的節點到其他社區內節點的連接看作為超節點的邊. 由此創建出新的圖后, 將算法第一階段應用于新圖. 直到整個圖的模塊度不再發生變化后, 算法結束, 此時就產生了最終的社區. 上述過程如算法1所示.

算法1. 社區發現Louvain算法輸入: network G=(V, E)輸出: network G′=(V′, E′)1. G.V:{node 0, node 1,…, node n}2. for i in G.V do 3. for j in iadjacent_node do 4. 根據式 (5)計算Max (ΔQ)5. if Max (ΔQ)>0 do?6. icommunity of j 7. if G change do 8. G.V={community 0, …, community m}9. goto step 2 10. else do 11. G′=G
由式(4)可知, 社區內的權重越大于社區間的權重時, 模塊度越大. 如果將良性日志和惡意日志分為不同的社區, 社區內部邊的權重越大于社區間邊的權重, 兩種不同社區的發現效果才會越好. 但如果直接在2.1節中生成的無向圖中使用社區檢測時. 社區檢測算法此時認為圖中每一條邊的權重都是1. 觀察發現惡意行為社區與良性社區之間存在著很多邊的連接, 這種情況降低了社區內的集群密度, 影響到了社區發現算法的有效性. 針對這種情況我們對邊的特征向量應用分類算法, 得出向量隸屬于惡意社區的概率, 以此概率作為該邊的權重, 將2.1節生成的無向圖G0轉換為無向加權圖G1. 使得圖中邊滿足式(6)所示條件:

其中,win表示的是社區內邊ein對應的權重,wtot表示的是社區之間邊etot對應的權重. 在使用XGBoost算法對事件關聯圖G0中 的邊進行分類訓練之前, 假設G0共有n條邊, 記為ei=xi,yi,i∈[1,n], 其中xi作為邊的特征向量,yi為該邊對應的標簽, 其取值如式(7)所示:

XGBoost是一個樹集成模型, 將多個弱分類器一起組合成一個強分類器, 這也是其相比傳統模型分類能力更強的原因. 將多顆樹的預測結果進行結合, 獲得比單一的樹更加優越的泛化能力. 在XGBoost中的目標函數如式(8)表示:

目標函數由第一部分訓練損失和第二部分正則化組成, 式中是第t次的預測值, 其與t-1次預測值存在式(9)所示關系, Ω (f)是正則化部分, 定義了每棵樹的復雜度, 其具體定義參考文獻[19]:

目標函數通過二階泰勒展開沿著梯度下降的方向優化損失, 優化速度大大加快. 將損失函數關于的一階偏導和二階偏導帶入進一步化簡[19], 最終得到的目標函數為:

式(10)也被稱為打分函數, 是衡量樹結構好壞的標準, 其值越小, 表示這樣的樹結構越好. 有了上述的打分函數, 最終就可以求出樹的最佳結構. 在本次實驗中的二分類問題使用對數損失函數, 如式(11)所示:

對式(7)所示標記的n條訓練邊采用k折交叉驗證的方式進行學習, 以此提高學習效果, 最終將XGBoost算法對于每條邊屬于社區內部邊的預測作為該邊的權重, 從而完成無向加權圖G1的 建立. 此時G1將作為社區發現的輸入, 利用社區發現Louvain算法發現G1存在的惡意社區.
上述模型的整體復雜度分析分為3步. 首先, 在日志解析與關聯階段中需要提取任意兩個日志之間特征關系, 其時間復雜度為 O (M2), 其中M為日志實體數.緊接著在權重分配過程中, XGBoost使用精確貪心算法建樹的時間復雜度是O (Kd‖x‖0log2n), 但可以將特征項排序并存儲為Block結構對算法進行優化, 在計算過程中復用該結構, 而不用每次都對特征項排序. 經過這樣的優化后, 特征項排序復雜度將會均分到權重分配過程中, 此時該部分時間復雜度變為 O (Kd‖x‖0). 上述中K為XGBoost中樹的總數,d為樹的最大深度,‖x‖0表示訓練邊集中非缺失值樣本的數量. 模型最后的惡意社區發現中, 算法中先將節點合并為社區相當于對圖中邊進行遍歷, 時間復雜度為O (n), 之后為得到最大模塊度不斷迭代k次, 所以算法總復雜度為O (nk). 上述n表示圖中邊向量個數. 整個模型復雜度為3個階段的復雜度疊加所得O (M2+Kd‖x‖0+nk). 作為對比實驗使用SVM、邏輯回歸與XGBoost在權重生成階段進行對比, 其時間復雜度對比使用算法運行時間指標來衡量, 具體實驗對比如第4節所述.
實驗使用Python實現, 利用已有的科學計算庫對MITRE ATT & CK提供的APT29以及APT3的仿真攻擊結果進行檢測. 在ATT & CK提供的日志數據集[15,16]中, 主要是使用Sysmon采集的主機日志數據. 實驗的整體流程如圖3所示.

圖3 關鍵階段與工作流程圖
在實驗的階段1中, 從如圖2中所示的原始日志中將實驗涉及的關聯事件日志解析為表2的日志實體格式. 此時原始日志清洗預處理之后, 所有的日志實體格式統一. 為了階段2的關聯特征提取, 經過多次實驗確定了表3中的實體間關系, 其中具體每條關系的意義如上文所述. 由于特征提取過程中只關注于實體間關系并歸一化, 所以提取到的特征已進行了泛化. 解析到的日志實體與提取到的特征關系向量, 組成了實驗階段2的輸入數據無向圖G0, 其結構如圖1所示.
實驗階段2中主要是解決無向圖G0中邊權重分配G0經過權值分配生成無向加權圖G1, 如圖4所示.問題. 為了提高社區內的集群聚集度, 減少社區間的聯系. 將階段1中提取到的特征向量作為輸入, 利用2.3節中XGBoost算法進行分類. 實驗關注XGBoost算法對于特征向量的預測值, 以此預測值作為邊的權重. 為了提高XGBoost的學習效果, 使用10折交叉驗證的學習方法對訓練集進行優化. 作為對比, 實驗使用傳統的學習算法邏輯回歸和SVM算法[20]與之對比, 具體實驗效果對比如下文所示. 在實驗階段2之后, 無向圖

圖4 無向加權圖G 1示意圖
實驗階段3中, 將社區檢測Louvain算法應用在圖G1上, 利用2.2節中所述的模塊度對圖中存在的社區進行發現. 找出原始日志中隱藏的惡意日志社區. 階段3的輸出為圖5所示實體名與所屬社區的對應表.

圖5 階段3輸出格式
根據在實驗過程的最終輸出的實體名與所屬社區的對應表, 對于分類結果通常有以下幾種評價標準, 準確率(Accuracy)、精確率(Precision)、召回率(Recall)以及F1分數, 但F1分數指標綜合算法的精確率指標和召回率指標, 評價更為全面. 上述指標的計算公式如式(12)到式(15)所示:

實驗采用F1分數對實驗結果進行評估, 其中XGBoost算法最終社區發現效果最好,F1分數明顯高出另外兩種算法, 受表3中特征提取時間間隔Δ 影響不明顯, 性能穩定, 可以有效的檢測出惡意社區中父子進程及文件操作行為. 另外邏輯回歸和SVM算法最后的社區檢測效果不是很好, 在APT29與APT3模擬數據集的實驗過程中F1分數受特征提取時間間隔Δ 的影響波動較大. 具體數據如圖6, 圖7所示.

圖6 APT29社區發現F1分數圖

圖7 APT3社區發現F1分數圖
在對3種不同的權重分配算法最后的社區檢測精度進行評估之后, 考慮到算法復雜度的對比, 實驗采用運行時間指標來對比評估本文模型與另外兩種算法的復雜度. 控制模型日志預處理與社區發現階段相同,所以復雜度的差距在于權重分配階段. 因此實驗在APT29數據上對比了不同的特征提取間隔下3種權重分配算法的運行時間. 如2.4節所述, 由于XGBoost算法使用Block塊對特征項排序優化, 在運行上相比于另外兩種算法更高效. 對比數據如圖8所示, 時間單位為秒.

圖8 APT29權重分配算法運行時間對比圖
最后在實驗中發現的部分惡意行為序列. 例如,(1)雙擊帶有惡意負載的3aka3.doc文檔, 生成3aka3.scr惡意進程, 之后派生出Cmd與Powershell進程建立C2通道連接到192.168.0.5, 完成對受害主機1的初始登錄. (2)在受害主機上進行文件收集等工作, 利用Powershell執行文件收集與壓縮命令對后綴為xlxs、doc、pdf、png等的文件進行遍歷、加密和壓縮生成Draft.Zip與working.zip. (3)生成新的更高權限的Powershell進程, 執行文件與進程的發現任務, 利用Get-Process等命令發現主機中的進程, 加載Netapi32.dll來探測系統接口. (4)刪除上述過程中生成的Draft.Zip與working.zip文件, 銷毀收集活動痕跡. 之后結合橫向移動等一系列步驟完成對主機的侵害.
通過實驗評估證明了XGBoost與社區檢測算法結合在檢測主機日志惡意行為中的價值. 關注父子進程鏈及其文件等操作, 提取出日志實體之間的社區圖關系, 通過社區發現算法檢測其中惡意社區. 在邊權重分配過程中使用XGBoost集成學習算法與邏輯回歸、SVM算法對比, 結果表明基于XGBoost與社區發現的主機攻擊行為檢測模型具有良好的檢測效果, 對于Lotl技術有更好的檢測能力. 但是, 在實驗過程中日志關系之間的生成與訓練過程可以進一步優化, 使得模型運行更加快速和高效.