一、 背景概述
目前安全運維中告警過多,告警原始指標難以直接區分實際重要性。結合安全運維值守工作的現場調查情況,我們曾提出兩個猜想:
1、人類專家在分析防護告警時,是在關注某種與攻擊相關的、抽象層次很高的概念;
2、最能夠反映這個抽象概念的資訊,位於告警載荷或原始網路流量中。
如果猜想屬實,我們只要做出一個能夠從告警載荷中提取出這種抽象概念的自動系統,即可實現自動化的高價值告警篩選。本文將以此為目標,對以上兩個猜想進行驗證。
二、 關鍵在於攻擊意圖
在第一個猜想中,我們需要先弄清楚最核心的問題:這種“與攻擊相關的、抽象層次很高的概念”到底是什麼?
筆者整理了一些以往的告警和人工研判記錄。受限於篇幅,這裡只給出兩個比較典型的案例供讀者參考:
上面屬於被判定為誤報的告警。下面則是一個真實入侵事件中的告警記錄:
稍加品味,細心的讀者可能會注意到,人工分析告警的過程,其實是在試圖解釋“為什麼會出現告警所描述的網路活動?”
即,首先假定所有網路活動都存在某種內在意圖,包括業務意圖和攻擊意圖。如果告警所指示的網路活動能夠基於某種攻擊意圖做出合理解釋,即可據此判定告警危害程度。反之,如果找不到合理的攻擊意圖來解釋網路活動,或者基於某種業務意圖解釋起來更加合理,就可以將告警認定為誤報。
網路活動並非自然發生的,而是人為設計才會產生的。實戰中,決心堅定的攻擊者即使遭遇挫折也不會輕易停手,此時具體攻擊行為是否成功已不那麼重要。關注網路活動背後的內在意圖,其實是一個非常高效的思路。
因此,自動化告警篩選應當對告警所指示的網路行為的內在意圖進行評估。相比於業務意圖,我們暫時先著重於攻擊意圖評估的實現。
三、 攻擊意圖的表示
想要實現告警篩選過程的自動化,僅僅知道攻擊意圖能夠反映告警危害程度是不夠的。我們必須用一種具體的、整齊的結構去表示攻擊意圖。
但這確實是一個難題。攻擊意圖這個概念太抽象了,其種類數量相當於所有網路攻擊可能達到的結果的數量總和。複雜的資訊系統中自然會有同樣複雜的網路攻擊,因此,攻擊意圖的可能性空間很大,以有限集合對攻擊意圖進行列舉並非易事。
此外,攻擊意圖的評價維度也並不單一。假設一個場景,攻擊者在已經確定網站存在RCE漏洞的情況下,利用該漏洞向網站上傳了一個WebShell:
從攻擊物件的角度看,其攻擊意圖應為“控制WEB應用伺服器”
從CIA三要素的角度看,其攻擊意圖應為“破壞系統完整性”
從攻擊收益的角度看,其攻擊意圖尚無法定論,攻擊者可能只是一個愉快犯,也可能是竊取敏感資料的黑產分子
幸運的是,經過長期摸索和實踐,我們最終找到了一種透過二維向量表示攻擊意圖的方法。
具體而言,我們透過“試探性程度”和“利用性程度”兩個量化的連續值來表示一個攻擊意圖。其中,試探性程度表示攻擊行為有多麼想要確定漏洞是否存在,利用性程度表示攻擊行為有多麼想要構成實際危害:
不難發現,這種表示方法幾乎完全限定在漏洞利用的場景中,連C&C後門、使用者對釣魚郵件的點選等,都被視為特殊的程式碼執行漏洞。由於只關注攻擊鏈中的單一階段,攻擊意圖的可能性空間顯著縮小,最終找到了兩個普遍可以被衡量的維度。
實驗表明,限定在告警篩選問題中,這種表示方法確實能夠發揮一定作用。將攻擊意圖劃分為四個象限,其中第二象限(低試探性&高利用性)的告警往往實際危害最大,其次是第一象限(高試探性&高利用性)的告警。
四、 告警載荷的特徵提取
接下來,我們需要驗證前述的第二個猜想,試試看能否根據告警載荷來確定攻擊意圖。專家似乎很容易就能做到這一點,所以原理上多半是可行的。
但自動化實現只能接受統一格式的輸入資料,而對告警載荷的結構化表示也是一個難題。告警載荷通常是一組二進位制流資料,各種網路協議混雜其間,內容結構千奇百怪,根本找不到統一規律。
這導致現有的資料分析方法用於告警篩選時,普遍只關注告警的規則型別、源、目的、時間等結構化屬性,最多隻是將告警載荷的一些統計特徵(長度、熵值等)納入特徵提取,而對告警載荷的原始資料內容避之唯恐不及。
針對這一點,我們進行了大量嘗試,但至今也未能找到非常好的特徵提取方法。目前實驗中效果“還算湊合”的告警載荷特徵,是一種針對已知模式的詞頻向量。
具體來說,就是對告警載荷內容中的各種常見模式進行計數統計,將每種模式在告警載荷中出現的次數作為特徵向量。這些常見模式包括但不限於:檔案路徑、IP地址、域名、URL、作業系統命令、指令碼函式名、SQL系統表名、以及一些常見的混淆方法等。
在大多數情況下,一個告警載荷只會出現少數幾種模式,因此特徵向量普遍比較稀疏:
對於沒有加密或壓縮的網路協議,這種統計方法效果尚可,尤其是對文字欄位較多的協議(如HTTP)效果基本達標。此外,這些常見模式都不針對特定的漏洞利用方法,理論上是不需要經常更新的。實驗表明,這種詞頻向量確實與攻擊意圖存在強關聯。
不過這種方法的弊端也很明顯,即需要大量人力投入去反覆最佳化正規表示式。由於告警載荷中內容混雜,表示式既不能過於嚴格,也不能過於鬆散,編寫起來頗有難度。
舉例來說,現有模型中僅“檔案路徑”一項就包含4個特徵維度,用到13個正規表示式,其中最長的一個如下:
即使是如此複雜的表示式組合,仍然時常會出現誤識別和漏識別,想要用資料分析方法自動形成特徵提取就更加困難了。我們也嘗試過在告警載荷二進位制序列上執行一些NLP中的新詞發現方法,但效果普遍較差。
五、 特徵提取中的注意事項
直接對原始告警載荷進行模式匹配的話,很容易漏掉關鍵資訊。在統計過程中,需要識別並遞迴解析告警載荷中的特殊編碼。常見的編碼包括多重URL編碼、XML編碼、十六進位制編碼、Base64編碼、“\”字串轉義編碼、CHR/CHAR編碼等。
萬幸的是,大部分編碼資料塊都有明顯的特殊結構,進行匹配之後有針對性地遞迴解析即可。原始告警載荷和所有解碼結果都需要進行模式匹配,為防止同一內容被重複計數,模型內需要實現一個去重機制,確保模式匹配到多個相同值時只計一次詞頻。
實驗表明,特徵選取並非越多越好,多餘特徵的加入反而會導致模型效果下降。雖然不能排除這個情況也與具體模型選取有關,但在多次實驗中,刪除多餘特徵維度都能提高模型表現。
目前大致可以確定的“多餘特徵”主要包括:HTTP請求方法、HTTP響應碼、Content-Type、SQL關鍵字。與之相對,也有一些特徵維度似乎起到了較大的作用,它們主要包括:檔案路徑、作業系統執行類命令、非源非目的外網IP。然而,其中的具體關聯關係目前尚不明確。
進一步實驗表明,一些已知存在關聯的特徵維度,可以組合之後新增新維度,能夠在一定程度上提高模型表現。例如,檔案路徑和檔案操作類命令應當是存在內在聯絡的,IP地址/域名和網路操作類的指令碼函式也應當是存在內在聯絡的。
組合的新維度並不需要非常複雜,通常只要對相關原始特徵維度求取一個最小值即可。雖然從實際觀察來看,組合特徵的誤識別很多(告警載荷中同時出現檔案操作命令和檔案路徑,並不代表命令的操作物件就一定是這個路徑),但模型效果確實有所提高,而其中原理目前尚不明確。
六、 結語
至此,我們已經確定了輸入資料(告警載荷)和輸出資料(攻擊意圖)的結構化表示法,已經具備了應用資料分析方法的基礎,可以認為告警篩選的自動化實現確實是可行的。
目前在暫不考慮模型遷移的情況下,在特定生產網路環境中採集一週約2300萬條告警,執行取樣並人工標註約500條後,Top10高評分告警中涉及真實關鍵攻擊的比例能夠達到80%以上。
雖然仍然無法完全消除低價值告警,但相比於目前的大多數告警篩選方法已有很大提高。