通過機器學習識別惡意 URLs
一、主要內容
識別惡意url,即將url分爲正常的url和惡意url。屬於機器學習中的二分類問題。本次實驗使用邏輯迴歸[1]和 SVM 機器學習方法建立監測模型,對未知URLs進行惡意檢測。
二、實驗整體思路
-
分別拿到正常請求和惡意請求的數據集。
-
對無規律的數據集進行處理得到特徵矩陣。
-
使用邏輯迴歸方式使用特徵矩陣訓練檢測模型。
-
最後計算模型的準確度,並使用檢測模型判斷未知 URL 請求是惡意的還是正常的。
2.1 獲取數據集[2]
good_fromE 某系統的某天的正常訪問url,已去重
good_fromE2 同上
bad_fromE 利用sql注入某系統產生的url記錄
badqueries 來源於網上數據(數據量較大)
goodqueries 來源於網上數據 (數據量較大)
惡意請求部分樣本:
/top.php?stuff='uname >q36497765 #
/h21y8w52.nsf?<script>cross_site_scripting.nasl</script>
/ca000001.pl?action=showcart&hop=\"><script>alert('vulnerable')</script>&path=acatalog/
/scripts/edit_image.php?dn=1&userfile=/etc/passwd&userfile_name= ;id;
/javascript/mta.exe
/examples/jsp/colors/kernel/loadkernel.php?installpath=/etc/passwd\x00
/examples/jsp/cal/feedsplitter.php?format=../../../../../../../../../../etc/passwd\x00&debug=1
/phpwebfilemgr/index.php?f=../../../../../../../../../etc/passwd
/cgi-bin/script/cat_for_gen.php?ad=1&ad_direct=../&m_for_racine=</option></select><?phpinfo();?>
/examples/jsp/cal/search.php?allwords=<br><script>foo</script>&cid=0&title=1&desc=1
正常請求部分樣本:
/rcanimal/
/458010b88d9ce/
/cclogovs/
/using-localization/
/121006_dakotacwpressconf/
/50393994/
/166636/
/labview_v2/
/javascript/nets.png
/p25-03/
/javascript/minute.rb
/javascript/weblogs.rss
/javascript/util.rtf
2.2 數據向量化
機器學習的算法需要輸入一個固定結構的向量,而每一條url都沒有特定的結構。故需要將每條url的文本特徵轉化成固定的數字特徵。這裏可以借鑑文本處理中將文本向量化的常用方法:TF-IDF.
TF-IDF 是一種用於資訊檢索與文本挖掘的常用加權技術,被經常用於描述文本特徵。
TF-IDF輸入的是文本的詞語,需要將url分詞。我們選擇通過長度爲N的滑動窗口將文本分割爲N-Gram序列。n越大 ,產生的字母組合種類越多(256n),產生的向量維度會更大,運算開銷會增大,考慮到本機的性能,這裏我們選擇n=3。
// URL 請求
www.foo.com/1
// 經過分詞後
[‘www’,‘ww.’,‘w.f’,’.fo’,‘foo’,‘oo.’,‘o.c’,’.co’,‘com’,‘om/’,‘m/1’]
經過TF-IDF處理,得到url的特徵矩陣,由於很多特徵向爲0 ,所以該矩陣利用稀疏矩陣保存。輸出格式是:
(0, 31445) 0.0739022819816
(0, 62475) 0.0629894240925
(0, 46832) 0.0589025342739
(0, 77623) 0.0717033170552
(0, 35908) 0.0882896248394
: 省略 :
特徵矩陣的元素由 [ (i, j) weight] 三個元素組成,
i 對應於集合中的文檔編號,j 對應於term編號(或者說是詞片編號)
矩陣元素 [ (i, j) weight] 表示編號爲 j 的詞片在編號爲 i 的文檔下的 td-idf 值(weight)。
(0, 31445) 0.0739022819816 表示詞片編號31445的在第0號文檔的權值是 0.0739022819816
2.3 訓練檢測模型
2.3.1 LogisticRegression 模型
切分數據集
將數據集分爲訓練集和測試集。訓練集用於訓練模型,測試集則是根據訓練集的訓練結果來評判最終的訓練效果。
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=666)
// x 是原始的特徵矩陣
// y 是該條矩陣的分詞對應的結果輸出(正常是0 惡意是1)的列表
建立 LR 模型
lr = LogisticRegression()
lr.fit(x_train, y_train)
測試模型效果
lr.scores(x_test, y_test)
新 URLs 是否惡意預測
x_predict = ['待預測URL列表']
x_predict = vectorizer.transform(x_predict)
res = lgs.predict(x_predict)
2.3.2 SVM 模型
svm模型訓練過程和邏輯迴歸模型類似,代碼複用,只需將self.classifier 改成 svm.SVC()即可。
預測結果分析[3]
訓練模型的正確率遠遠低於邏輯分類模型,訓練時間也長於邏輯分類器。雖然在於識別錯誤上也一樣全部識別出,不過該分類器的誤報率太高,識別出來的結果沒有說服力。
經查閱資料,svm對數據的異常點比較敏感,因爲其訓練只需要支持向量,有效樣本本來就不高,一旦被幹擾,預測結果難以預料。一般輸入svm的數據維度不宜太高,我們訓練的數據集有4117維,故我們決定在處理前加入降維模塊。
選擇用kmeans降維。該算法的主要思想是通過迭代過程把數據集劃分爲不同的類別,使得評價聚類性能的準則函數達到最優,從而使生成的每個聚類內緊湊,類間獨立。
我們選擇降維到80維度,加入降維後:
可見,對數據降維後svm運行的速度和正確率都大大提升了,錯誤url也能全部識別。
那是不是說明邏輯分類算法加入kmeans效果也會提升呢?
對此我們做了一個實驗:
相對於原來的正確率有所下降,可見不同算法都有不同的適用場景。
三、總結
邏輯迴歸判斷和svm都是常見的分類算法,區別:
- 從目標函數來看,區別在於邏輯迴歸採用的是logistical loss,svm採用的是hinge loss。
- 這兩個算法損失函數的目的都是增加對分類影響較大的數據點的權重,減少與分類關係較小的數據點的權重。SVM的處理方法是隻考慮support vectors,也就是和分類最相關的少數點,去學習分類器。而邏輯迴歸通過非線性映射,大大減小了離分類平面較遠的點的權重,相對提升了與分類最相關的數據點的權重。
兩者的根本目的都是一樣。所以在很多實驗中,兩種算法的結果是很接近的。
四、侷限與改進
侷限
該實驗使用的是監督學習下的二分類器。需要標定的數據集。然而在現實環境中,由於攻擊方式的多樣性,很難獲得覆蓋全面的惡意攻擊url數據集,導致在面對 0day 攻擊這類比較新的攻擊url具有一定的脆弱性。
改進
參考一篇發表在Elsevier Science上的論文 McPAD:A Multiple Classifier System for Accurate Payload-based Anomaly Detection[4]
該論文指出,由於我們只有大量白樣本,可以考慮通過單分類模型,學習單類樣本的最小邊界,邊界之外的則識別爲異常。通俗的講,就是與其學習攻擊的url特徵,不如直接學習正常url的特徵,拒絕所有不符合正常特徵的url,以不變應萬變。
參考文獻
[1] Using Machine Learning to detect Malicious URLs https://medium.com/@faizann20/using-machine-learning-to-detect-malicious-urls-748d45f10dbf
[2] 用機器學習玩轉惡意URL檢測 https://www.freebuf.com/articles/network/131279.html
[3] 通過機器學習識別惡意url http://blog.csdn.net/solo_ws/article/details/77095341
[4] McPAD:A Multiple Classifier System for Accurate Payload-based Anomaly Detection https://www.sciencedirect.com/science/article/abs/pii/S1389128608003927