轉載|學點演算法搞安全之SVM

雖然是我寫的,但是畢竟先在Freebuf發了,尊重版權要。原文地址為:

學點演算法搞安全之SVM - FreeBuf.COM | 關注黑客與極客

前言

在企業安全建設專題中偶爾有次提到演算法的應用,不少同學想深入了解這塊,所以我專門開了一個子專題用於介紹安全領域經常用到的機器學習模型,從入門級別的SVM、貝葉斯等到HMM、神經網路和深度學習(其實深度學習可以認為就是神經網路的加強版)。

規則VS演算法

傳統安全幾乎把規則的能力基本發揮到了極致,成熟企業的WAF、IPS、殺毒甚至可以達到兩個九以上的準確度,很好的做到了」我知道的我都能攔截」。但是規則都是基於已有的安全知識,對於0day甚至被忽略的Nday,基本沒有發現能力,即所謂的」我不知道我不知道」,這時候演算法或者說機器學習就發揮作用了,機器學習的優勢就是可以從大量的黑白樣本中,挖掘潛在的規律,識別出異常,然後通過半自動或者人工的分析,進一步確認異常是誤報還是漏報。總之,精準判斷入侵,不是機器學習的長項,識別漏報是一把好手。

scikit-learn

scikit-learn是聞名遐邇的機器學習庫,具有豐富的模型支持以及詳細的在線文檔,支持python語言,開發周期短,特別適合原理驗證。

環境支持為:

  • Python (>= 2.6 or >= 3.3),
  • NumPy (>= 1.6.1),
  • SciPy (>= 0.9).

安裝命令為:

pip install scikit-learn

SVM支持向量機

SVM是機器學習領域使用最廣泛的演算法之一,通常用來進行模式識別、分類以及回歸分析,它特別適合安全世界裡面的非黑即白,所以我們重點介紹分類相關的知識。

假設只有二維的特徵向量,我們需要解決一個分類問題,需要通過將正常用戶和黑客區分開來,如果確實可以通過一條直線區分,那麼這個問題成為可以線性可區分(linear separable),如果不行則成為不可線性區分(linear inseparable)。討論最簡單的情況,假設這個分類問題是可以線性區分的,那麼這個區分的直線成為超平面,距離超平面最近的樣本成為支持向量(Supprot Verctor)。

如上圖,對於不可線性區分的情況,需要升級到更高的平面進行區分,比如二維平面搞不定就需要升級到三維平面來區分,這個升級就需要依靠核函數。

監督學習與無監督學習

監督學習(supervised learning)簡單講是拿標記過的數據去訓練;無監督學習(unsupervised learning)簡單講是拿沒有標記的數據去訓練,SVM訓練時需要提供標記,所以屬於監督學習。

監督學習的一般步驟

示例

在二維平面假設只有兩個訓練樣本[[0, 0 ], [1, 1]],對應的標記分別為 [0, 1],需要你預測 [2., 2.]的標記,代碼實現為:

from sklearn import svmX = [[0,0], [1,1]]y = [0,1]clf = svm.SVC()clf.fit(X, y) n

print clf.predict([[2.,2.]])

運行結果是array([1]),符合預期,下面以常見的XSS檢測來說明下SVM的簡單應用。

數據搜集&數據清洗

由於我們的例子比較簡單,把上述兩個步驟合併即可,準備數量相等的正常web訪問日誌和XSS攻擊的web日誌,最簡單的方法是參考我以前的文章《基於WAVSEP的靶場搭建指南》,使用WVS等掃描器僅掃描XSS相關漏洞即可獲取XSS攻擊的web日誌。

特徵化

實踐中數據搜集&數據清洗是最費時間的,特徵化是最燒腦的,因為世界萬物是非常複雜的,具有很多屬性,然而機器學習通常只能理解數字向量,這個從現實世界的物體轉變成計算世界的數字的過程就是特徵化,也叫向量化。比如要你特徵化你前女友,你總不能說漂亮、溫柔這些詞,需要最能代表她的特點的地方進行數字化,下面是一個舉例:

你會發現各個向量之間的數據範圍差別很大,一個月消費能力可能就幹掉其他特徵對結果的影響了,雖然現實生活中這個指標確實影響很大,但是不足以幹掉其他全部特徵,所以我們還需要對特徵進行標準化,常見的方式為:

  • 標準化
  • 均方差縮放
  • 去均值

回到XSS的問題上,我們需要針對web日誌進行特徵化,以下特徵是個舉例:

特徵提取的示例代碼如下:

def get_len(url):n

return len(url)

def get_url_count(url):

if re.search((http://)|(https://), url, re.IGNORECASE) :

return 1

else:

return 0

def get_evil_char(url):

return len(re.findall("[<>, "/]", url, re.IGNORECASE))

def get_evil_word(url):

return len(re.findall("(alert)|(script=)(%3c)|(%3e)|(%20)|(onerror)|(onload)|(eval)|(src=)|(prompt)" ,url,re.IGNORECASE))

數據標準化使用如下代碼即可:

min_max_scaler = preprocessing.MinMaxScaler()n

x_min_max=min_max_scaler.fit_transform(x)

數據打標

這一步非常容易,因為我們已經清楚知道哪些是XSS哪些不是。

數據拆分

這一步是為了隨機把數據區分成訓練組和測試組,通常直接使用cross_validation.train_test_split即可,通常使用40%作為測試樣本,60%作為訓練樣本,這個比例可以根據自己需要調節。

x_train, x_test, y_train, y_test = cross_validation.train_test_split(x,y, test_size=0.4, random_state=0)n

數據訓練

使用scikit-learn的SVM模型即可,SVM用於分類的模型稱為SVC,我們使用最簡單的核函數linear

clf = svm.SVC(kernel=linear , C=1).fit(x, y)n

joblib.dump(clf,"xss-svm-200000-module.m")

模型驗證

通過載入訓練後的模型,針對測試集合進行預測,將預測結果與打標結果比對即可。

clf=joblib.load("xss-svm-200000-module.m")n

y_test=[]

y_test=clf.predict(x)

print metrics.accuracy_score(y_test, y)

測試環節我們在一個各有200000個樣本黑白模型上訓練,在一個各有50000個樣本的黑白測試集上校驗,任何黑白預測錯都判斷為錯誤,最後運行結果準確度率為80%,對於機器學習而言,僅依靠模型優化,這個比例已經很高了。通過在更大的數據集合上進行訓練(比如大型CDN&雲WAF集群的日誌),進一步增加特徵個數以及增加後面環節的自動化或者半自動化的驗證,可以進一步提高這個比例,最後準確率我們做到了90%以上。下圖是特徵擴展的舉例,大家可以根據實際情況增加。

異常數據

通過SVM我們識別出了異常數據,經過人工確認,除了變形的XSS以外,還有不少其他攻擊行為,由於測試時只打開了XSS的規則簽名,所以其他攻擊行為沒有攔截,也進入了白樣本,舉例如下:

/.|./.|./.|./.|./.|./.|./.|./.|./.|./.|./.|./windows/win.inin

/index.php?op=viewarticle&articleid=9999/**/union/**/select/**/1331908730,1,1,1,1,1,1,1--&blogid=1

/index.php?go=detail&id=-99999/**/union/**/select/**/0,1,concat(1331919200,0x3a,512612977),3,4,5,6,7,8,9,10,11,12,13,14,15,16

/examples/jsp/num/.|./.|./.|./.|./.|./.|./.|./.|./.|./.|./.|./.|./windows/win.ini

/cgi-bin/modules/tinymce/content_css.php?templateid=-1/**/union/**/select/**/1331923205,1,131076807--

/manager/ajax.php?rs=__exp__getfeedcontent&rsargs[]=-99 union select 1161517009,2,1674610116,4,5,6,7,8,9,0,1,2,3 --

我們推測,機器從XSS樣本裡面學習的攻擊特徵可能部分覆蓋了SQL注入等帶有代碼注入特性的攻擊的特點導致的。

總結

不少人問過我,」什麼樣的情況下可以用演算法?」。這個沒有一個統一的答案,我認為在規則、沙箱都做的比較到位的情況下,可以試著使用機器學習;如果是已知漏洞都沒有很好的防禦和檢測的話,使用機器學習確實性價比低。汽車在剛出來的時候沒有馬車快,但是是選擇造一輛更快的馬車還是選擇造屬於未來的汽車,這個見仁見智。

更多內容歡迎閱讀我的新書 《Web安全之機器學習入門》

京東:item.jd.com/12158965.ht

噹噹:product.dangdang.com/25


推薦閱讀:

機器學習實戰之準備(一)
沒想到你是這樣的「兔子」---kNN
斯坦福大學機器學習 CS229 課程講義翻譯-Markdown 版本-第三章
矽谷之路23:機器學習真人面試
」CNN是空間上的深度網路,RNN是時間上的深度網路「這句話怎麼理解?

TAG:网络安全 | 机器学习 | 深度学习DeepLearning |