1. 程式人生 > >學點算法搞安全之SVM

學點算法搞安全之SVM

padding 這一 ray 傳統 learning 性價比 alert 精準 部分

前言

  在企業安全建設專題中偶爾有次提到算法的應用,不少同學想深入了解這塊,所以我專門開了一個子專題用於介紹安全領域經常用到的機器學習模型,從入門級別的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 svm

  X = [[0, 0], [1, 1]] y = [0, 1]

  clf = svm.SVC()

  clf.fit(X, y)

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

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

數據搜集&數據清洗

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

特征化

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

技術分享技術分享

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

  • 標準化

  • 均方差縮放

  • 去均值

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

技術分享技術分享

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

def get_len(url):

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()

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)

數據訓練

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

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

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

模型驗證

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

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

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.ini

/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註入等帶有代碼註入特性的攻擊的特點導致的。

總結

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

學點算法搞安全之SVM