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






















