為什麼安全類AI模型準確性普遍虛高


為什麼安全類AI模型準確性普遍虛高

越來越多的商業產品使用AI/ML算法來檢測威脅和漏洞,但大家的使用體驗往往與廠商宣稱的AI模型的高指標不符,與傳統方案比起來,似乎也沒什麼太大的區別。

筆者也訓練過一些安全類模型,其在線上表現情況,明顯比測試情況要差。為什麼會出現這種情況呢?本文將對此問題進行深入探討。

“準確率”不準確

準確率(ACC)是評價模型的重要指標,意為正確分類的樣本數量與總樣本數的比例。這裡把惡意樣本定義為正樣本,正常的樣本(非惡意樣本)定義為負樣本。

TP:(True Postive) 實際為惡意樣本,並且被正確檢測為惡意樣本的數量。

TN:(True Negative) 實際為正常樣本,並且被正確檢測為正常樣本的數量。

ALL:全部的樣本數量

那麼準確率的定義是:

ACC = (TP+TN )/ALL

如果你要識別各種動物的模型,你能很容易的從互聯網上抓取大量動物圖片,並使各種動物比例保持1:1。放到線上,用戶上傳的各類動物的圖片比例也基本保持一致,至少不會有數量級的差別。這種情況下,測試集中各種動物比例保持為1:1,測得的ACC值是有參考價值的。

但是在安全領域不同,正常的樣本很容易獲取,但惡意樣本數量極少。

當一個數據集裡,正常樣本遠大於惡意樣本時,有:TN >> TP 推導出 TN/ALL >> TP/ALL 。

根據計算ACC的公式

ACC = (TP+TN )/ALL = TP/ALL + TN/ALL

由於TN/ALL >> TP/ALL,也就是說這種情況下,TN/ALL基本上決定了 ACC值。

舉個例子,我要測試一款WAF的準確率。抓取了一份真實的流量作為測試集,這份測試集包含10000個HTTP請求樣本,但是隻有100個攻擊請求,其餘9900個是正常業務的流量。我不小心關閉了WAF的所有策略,這樣不管是攻擊流量還是正常流量,一律當作正常流量放行。測試結果:(0+9900)/10000 = 99%。這樣一個ByPass狀態的WAF,準確率ACC竟然高達99%,這簡直是個笑話。

因此,在不知道測試樣本分佈比例的情況下,只看ACC指標是沒有意義的。如果樣本比例不均勻,應當參考AUC指標。

混淆“驗證集”和“測試集”

有時模型在測試集上表現很好,卻在線上使用的時候一塌糊塗。這有可能是模型的“泛化”能力不強,而由於訓練集和測試集的同質化嚴重,因此各種指標都無法如實反應模型的真實水平。(泛化,是指模型對於沒有見過的新樣本的分類能力)

我們從一個機器學習常用的函數說起,Sklearn的tain_test_split函數。

為什麼安全類AI模型準確性普遍虛高

它的邏輯是先將數據集隨機打亂,然後按某個固定比例將數據集分為兩個互補的子集。人們習慣把其中一個子集叫做訓練集,用於訓練模型,另一個子集,用於初步驗證模型效果,叫做驗證集,又因為它有輔助調參的作用,也叫開發集。這兩份子集來源於一個數據集,因此相似度極高、同質化嚴重。我看了很多安全類的項目,直接把驗證集當作測試集,把驗證集的指標當作模型的最終指標發佈,這樣是不嚴謹的,這樣的指標也是嚴重虛高的。

如果我們把測試集當作高考的話,那麼驗證集就是模擬考試。模擬考試的題都是自己老師出的,老師上課講過的題型,和平時作業題很像,考試環境也很好,容易考出高分。但高考會出現陌生的題型,考試環境也不熟悉,分數就不一定高。

我曾經做過一個實驗,用CNN擼了一個檢測SQL注入的模型。正樣本是在一個mysql注入點上,用sqlmap的盲注、延時、聯合、報錯這四種注入手段,進行爆庫、表、字段、內容,記錄所有payload,形成正樣本,同時採集等量正常數據作為負樣本,形成數據集。用tain_test_split切割為訓練集和驗證集。

結果在驗證集上表現非常優秀,ACC=100% TPR=100% (TPR=TP/所有正樣本 =1-漏報率)

然後我製作了第一份測試集,記錄了sqlmap通過這個注入點讀寫文件的payload。結果依舊: TPR=100%。說明模型還是有一定“泛化”能力,但是畢竟都是sqlmap生成的數據,依舊與訓練集存在不少相似特徵。

於是我又做了第二份測試集,使用Pangolin、Havij、WVS分別針對mysql和mssql注入點進行攻擊,生成了一份數據,測試結果立馬下降到:TPR=91%。這還不包括payload變形,相信在線上環境,這個指標會進一步下降。

驗證集上指標虛高是因為與訓練集相似度高。同理,如果測試集與訓練集來自同一個源,儘管是兩份不同的數據集(例如SQLMAP脫庫和操作文件兩種攻擊數據),也會造成指標偏高。綜上,測試集與訓練集的相似度越高,指標就越(偏)高;測試集越是複雜多樣,測試指標就會越低、越接近真實水平。

“誤報”的放大

如圖是某款NTA的白皮書,其宣稱的誤報率是0.01128。

為什麼安全類AI模型準確性普遍虛高

這個誤報率算是比較低的。如果是在其他領域,這是一個合格的模型。因為其他領域中,每一類樣本出現的概率大致相同。

但是在安全領域內不一樣,在線上環境中,正常樣本的數量要遠遠大於惡意樣本數量,其差距何止幾個數量級。例如對於IDS/IPS來說,攻擊流量遠遠小於業務本身的正常流量;對於殺毒軟件/EDR來講,病毒文件的數量遠遠小於各種正常軟件的文件。

而這個NTA 宣稱的1.128%的誤報,看似很低,設想如果網絡中每秒建立10個會話,那麼平均不到10秒就會產生一個誤報。顯然如果單獨使用這個模型會造成“車禍現場”般的用戶體驗。但這並不意味著這是個失敗的NTA,我們要看它後續對於誤報的處理,如果在模型後面串聯了二次確認的邏輯,能將誤報降低到可接受的範圍,也未嘗不是一個好產品。

因此,由於安全場景的特殊性,即便很小的誤報率也會被無限“放大”。用戶看不到分母,只能看到結果。儘管誤報多不代表誤報率高,但誤報過多確實影響用戶體驗和用戶信任。

訓練集的侷限性

最理想的訓練集,並不一定是越多越好,而是儘可能多地涵蓋真實世界發生的每一種情況。然而真實情況是,採集的樣本不可能包含每一種情況,或多或少的都會存在侷限性,這是不可避免的。但是有些侷限性是人為的錯誤導致,是可以避免的。

公司在客戶現場部署了某個以DGA算法為賣點的NTA,跑了幾個月幾十頁誤報,一條有效告警都沒有。於是我決定自己寫個DGA檢測算法,期間參考了不少AI檢測DGA的文章,發現了一個幾乎所有項目的通病:負樣本喜歡採用Alexa Top N的域名。

Alexa Top N的域名都是正常域名,這點毋庸置疑,作為負樣本似乎沒什麼問題。卻忽略一個問題:Alexa排名靠前的都是高質量域名,網絡中高質量的域名畢竟是少數,大量小企業和個人沒有足夠的預算投入在域名上,只給程序解析用的域名取名更加隨意。低質量域名與高質量域名的統計特徵區別很大,高質量域名長度短,常見一到兩個單詞或拼音,或是純數字,便於記憶。低質量域名較長,常見字母和數字混合,拼音縮寫,中英混合等。需要注意的是,DGA生成的域名也大都是低質量域名。如果用低質量的正常域名去測試模型的話,實際誤報率應比理論值高。

我們以這個項目為例:

https://www.freebuf.com/articles/network/153345.html

該模型的ACC 97%~98% AUC 99.6%,是一個不錯的模型,文章沒有說明誤報率FPR是多少,一般有FPR < 100%-ACC,因此估計誤報率不會超過3%。但是負樣本使用Alexa Top 50w進行訓練,有很大的侷限性。下面我們測一下模型對低質量域名的誤報情況。我在公司辦公網出口進行抓包一小時,提取所有域名。為了保證測試集都是低質量的域名,排除了Alexa Top 100萬的,去掉了gov.cn和edu.cn結尾的,去重後共有26個域名,全部都是正常域名。模型取0.5作為閾值。檢測結果如下:

為什麼安全類AI模型準確性普遍虛高

在這個26個樣本的測試集,總共4條誤報, 誤報率15%。遠高於理論值。

很多朋友在採集樣本的時候,首先想到的是,我怎麼能用最低的成本收集更多的樣本,而很少有人去想,用這種方式採集的樣本是不是隨機抽樣,收集的樣本是否具備共同的特徵。儘管任何數據集都會存在一定侷限性,但這種錯誤無疑把這種侷限性放大了,使得模型的實際指標下降嚴重。如果說樣本採集是對真實世界的抽樣,那麼我們應當儘可能的保證這是個隨機抽樣,而不是侷限在某個範圍內的抽樣。

特徵數量水分大

特徵數量不是評價模型的指標,但確實可以從側面反映出模型的水平。有位大牛說過:“數據和特徵決定了機器學習的上限,而模型和算法只是逼近這個上限而已”。

經常見到AI產品介紹中這樣寫:“本產品採集了目標的了幾千個特徵,詳細的描述了每一個細節”。這種描述往往讓人驚訝,明明不復雜的一個東西,哪來的這麼多特徵。嘿嘿,秘密就在於One-Hot編碼上。

One-hot又稱獨熱編碼,可對特徵進行擴充,提升模型的非線性能力,是神經網絡最常用的編碼方式。

舉個例子,我們描述一個人的性別,可以用三個編碼描述:[是男的, 是女的,無性別者]。命中的編碼置1,其餘為0。男的就是[1,0,0],女的就是[0,1,0]。這樣一個特徵就可以擴展為三個維度。

性別是離散型的特徵,如果是連續型的數字,那麼可以無限擴展。例如我們描述一個人的年齡,用一個維度足夠,18歲就是[18]。那麼用one-hot編碼:[是不是0歲,是不是1歲,是不是2歲,… …,是不是大於100歲]。這樣一個年齡特徵,可以擴展成101個維度。

所以,“人”理解的特徵,和給“機器”表述用的特徵是有區別的,混淆兩者的概念是宣傳需要,應注意分辨。

說點別的

我們感受不到AI帶給安全的改變,還有一個可能原因,就是傳統的方案的指標本來就不低,只是以前很少用ACC AUC這些高大上的指標去評價他們,也沒有人去做AI與傳統方案的橫向對比測試。

在有些領域,如web攻擊檢測,基於規則和策略的傳統方案准確率也不差,卻非要用AI方案再做一遍,最後準確性可能會提升了幾個百分點,但是投入的研發成本卻比傳統方案增加了很多。如果用多投入的這些成本去優化傳統的規則和策略,會不會提升效果更明顯?似乎沒有人做過調研,AI似乎成了目的而不是方法。總有一天,AI的熱度會降下去,大家對它也會有一個客觀的看法。


原文鏈接:https://www.anquanke.com/post/id/201282


分享到:


相關文章: