為什么機器學習解決網絡安全問題總是失?。赫務勌卣骺臻g
本文的所有內容與作者的日常工作無關,其觀點也僅代表作者個人意見,與作者的雇主無關。
近年來網絡安全從業者紛紛神往機器學習的魔力,加之深度學習在圖像、NLP等領域的成功,大家都想在此尋求一發銀彈。不過作者在安全業界沒有看到太多如虎添翼的機器學習案例,更多的是對生產環境里金玉其外的模型效果的失望,“模型誤報太多了,運營沒法處理”,“就這兩個獨檢結果還不如我寫兩條規則”,“PPT上說深度學習、自我演化,實際都是 if-else”等等。為什么機器學習解決網絡安全問題總是失敗呢?
機器學習模型在解決網絡安全問題時效果不好的原因大致可以歸結為這幾類:
- 錯誤的特征定義和樣本標記
- 算法的脆弱,工程的脆弱,運營的脆弱
- 錯誤的評價標準以及錯誤的優化方向
- 誤解機器學習就是人工智能算法的全部
我們先從特征空間和樣本標記談起。
什么是合理的特征空間
圖像識別問題的特征就是一張張圖里的像素,NLP特征就是文本里的文字,那么網絡安全類的特征就是每一條 WAF 攻擊記錄的字符,每一個惡意軟件二進制文件的字節碼,這樣對嗎?
合理的描述問題本質的特征空間可以讓模型輕松解決問題,而錯誤的選擇了特征空間會讓問題難度成倍上升。不妨看這個例子:如果問大家,心算 5765760 加上 2441880 等于多少,任何一個學過基本算數的人都會毫不費力的答出 8207640。但如果是心算 5765760 乘以 2441880 呢?這幾乎可以難倒一片小伙伴。這是因為十進制不是乘法友好的表示方法,因為我們選錯了特征空間,所以問題就人為的變難了。對乘法更友好的表示方法是因式分解,如果把題目換成“ 11*12*13*14*15*16
乘以 17*18*19*20*21
“這個等價問題的話,它的答案甚至比之前的加法還簡單。
一個異曲同工的例子是 malconv
深度學習檢測惡意軟件,類似的基于字節碼的卷積方法并不能學到正確的特征空間。Raff et al 等作者的 “Malware Detection by Eating a Whole EXE” 使用二進制文件本身作為輸入,試圖利用卷積網絡從 010101 這樣的原始字節碼特征空間構建一個端到端的惡意軟件靜態檢測分類模型 malconv
,它在自己論文的測試集上可以達到 90% 以上的 AUC。然而,拋開其對新樣本和對抗樣本檢測時極不穩定的表現,“DeepMalNet: Evaluating shallow and deep networks for static PE malware detection” 這篇文章引入新的測試集對比了 malconv
等多個深度模型以及論文作者自建的隨機森林模型后發現,通過手工構建特征工程的隨機森林模型也幾乎可以達到并超過 malconv
的效果。究其原因,卷積網絡在原始字節碼上并不會學習到合適的特征空間,論文中展示的有效性更多是碰巧的結果。Fireeye 的研究人員 Coull et al 的文章 “Activation Analysis of a Byte-Based Deep Neural Network for Malware Classification”表明了 malconv
的卷積結果其實是把靜態二進制文件的文件頭信息當作當作主導特征,而由指令跳轉組合對模型預測分類的權重極小,其后續改進 EMBER malconv
也延續了類似特性,具體的分析和解釋可以參見 Bose et al “Explaining AI for Malware Detection: Analysis of Mechanisms of MalConv”。如果加以使用一定的領域知識工具,比如獲取函數導出表、利用一些動態特征比如沙箱采集的函數調用序列,或者使用靜態反編譯得到指令集序列,將原始二進制轉換到這些更能表征軟件運行時行為的特征空間當作輸入數據集,其機器學習模型的表現比 malconv
類僅用字節碼卷積方法的穩定的多,分類效果也更好,請有興趣的小伙伴閱讀相關參考文獻并繼續調研。
同樣的道理,我們也不能期望有一個精準的端到端的模型在不需要切分和篩選 token 的情況下,僅基于原始的 WAF 記錄即可預測攻擊,也不能期望一個模型學習到 DGA 的字符組合方式并精確分類甚至生成新的 DGA 域名,更不能幻想有一個深度學習模型讀入任意 HTTPS 數據流即可精確預測其對應的網站。市面上的機器學習模型在解決這些問題上的失敗均證明了選擇合適特征空間的重要性:模型在錯誤的特征空間上可能因為碰巧適應特定數據集而產生所謂“好結果”,但這些結果不夠穩定也遠不足以支撐生產環境和產品的質量。
為什么模型效果和特征空間相關
大家經常提到的“機器學習”指的是基于樣本的統計學習,它學習的結果是樣本在其特征空間分布的統計期望。我們可以借用一句古詩“橫看成嶺側成峰”來理解特征空間對模型判別的影響。如果特征空間并不能描述造成樣本分布的本質原因,其特征的數值分布就不能提供足夠的判別能力,直觀地說,模型只能“橫看”到一連串的“嶺”而不能“側看”獨立的“峰”,那么模型頂多在“嶺”上大概劃分個差不多的樣子以適應現有數據集,于是,它“不識廬山真面目”的丟失了“峰”所代表的實質特征。
特征空間與樣本標記方法也有關聯。基于樣本的統計學習有一條實戰經驗,再好的模型也只能盡可能學會人工的標記。網絡安全從業者常常認為,“模型只能學會我規則標記的樣本,要這破模型有何用呢?” 據本文作者觀察,很多模型的工作均掉入“標記樣本僅為標記原始樣本”這一誤區,而有經驗的數據科學家會標記與表征空間對應的樣本,它可以是原始樣本在新空間的映射,比如各種關聯圖模型里學習到的向量表示,也可以是原始樣本的拆分,比如基于匯編碼區塊的惡意文件檢測等,這些合理的樣本選擇和標記跳出了原始樣本的局限,并使用更簡單可靠的模型解決問題。
如何尋找正確的特征空間
有些特征顯而易見,有些特征需要絞盡腦汁。“嶺”和“峰”的區別不僅限于同一個數據集里的特征選擇或者特征超平面的轉換,更重要的拋開“顯而易見”“想當然”的特征,尋求能夠描述樣本分布本質原因的特征。一個典型的例子是前一篇博客“為什么 LSTM 檢測 DGA 是無用功”里提到的一類 LSTM 檢測 DGA 的算法,它們的特征空間為每個域名的相鄰字符串組合,LSTM 模型事倍功半的去擬合可以產生這些相鄰字符組合模式的未知函數,這遠遠超過了 LSTM 這個淺模型的學習能力。事實上,現在還沒有一個足夠聰明的網絡結構可以在小數據集上學習到包含異或、移位等復雜操作的函數。多數 DGA 的本質特征為由 DGA 算法產生域名序列,按照多個域名的序列映射到嵌入空間或利用其共同出現的概率可以更好的對其行為建模,利用簡單的圖嵌入模型或者鄰接矩陣計算即可達到很好的 DGA 檢測效果。
尋找正確的特征空間并沒有一勞永逸的辦法,暫時也沒有更高的人工智能的輔助或自動化,它需要的是數據科學家對現有模型的分類原理有深入的理解,也從數據模型的角度對安全領域的基礎知識有根本的認識。因為本文作者看到過太多建立在錯誤的假設和特征空間的工作,所以建議數據科學家在頭腦中保留這個問題并在解決問題過程中反復提醒自己:
”這個特征空間可不可以表征問題的實質?“
總結
網絡安全方向的數據算法模型不像機器視覺類問題有清晰直接的樣本定義。它更像語音和空間控制類的問題:它要求該領域的數據科學家對領域知識有更深入的了解,探尋 可以表征問題實質 的特征空間,并聰明的將問題從其表面映射到實質的特征空間。加以合適的樣本標記方法描述這些特征的分布,而非迷信深度學習帶來天降神力,我們可以找到更合適辦法去解決問題。
本文分析的是網絡安全方向的建模在算法方向上失敗的主要原因,我們還有若干話題,比如從系統上理解和處理模型的脆弱性等等,這些在以后的文章里都會談到。不只是網絡安全從業者,很多領域的研究人員和工程師也過分專注于模型本身,而忽略了建模是個系統工程問題,尋找更多更好的樣本、更能描述本質的特征、對預測錯誤的處理等都是這個系統里重要的步驟。本文作者希望由此提起大家對系統和工程的關注,讓機器學習和其他人工智能算法在網絡安全領域發揮真正的作用。