用深度學習檢測WAF惡意請求

全文請參見 medium.com/slalom-engin

「Detecting Malicious Requests with Keras & Tensorflow「 這篇文章試圖解決這樣一個問題:對於五花八門的海量惡意請求日誌,如何快速的用機器精確識別?

之前和做WAF的各位專家們討論過這類「在日誌里識別惡意請求」的WAF常見課題,方法多是寫規則和寫正則,現在國內的研究主力還剛從寫規則緩慢邁入寫正則。但現有方法有兩個問題,一是花式惡意請求太多規則不好寫,會寫規則就已經是搶著要的人才了;二是寫規則和正則往往擔心誤判,比如一個路徑 `../text/../malicious/../text/` 其實不是惡意,但是規則認為出現 ../ 太多也是可能惡意。

按照機器學習常見(吐槽)套路,搞序列建模的都會墮落成寫正則,這篇文章作者就嘗試循環神經網路 RNN 通過訓練文本序列學習到這些正則和規則的套路。文中用了一個最簡單的RNN-LSTM網路,把輸入的log按照字元級做token,編碼輸入給RNN的第一層,然後通過一個 LSTM 輸出並判斷是否是惡意。

關於模型本身並沒有什麼特別,但是用字元序列作為輸入而不是用單詞是這個工作關鍵所在。WAF和其他惡意請求判斷的規則往往容易被關鍵詞的二義性坑了,比如 「password」 既可以是一個域關鍵詞也可以是一個變數,更不用說 「passwd」 或者 「mima」 這種變體和訓練集里沒見過的詞了。從字元序列學習有效解決了這個問題,只要有足夠的訓練數據,它可以根據上下文判斷到底 「password」 是關鍵詞還是一個變數或者乾脆就是一個無實際貢獻的字元串。字元序列建模(Char RNN)還有一個常見例子就是文本生成,就是根據已有的文章生成類似風格的文章比如「汪峰作詞機」等,這個可以參考這篇blog。

這篇文章主要貢獻在於提出了字元級 RNN-LSTM 做惡意請求檢測這個想法,它在自己的模擬數據集上可以達到 95% 左右的精確度,這說明這個模型確實有效。不過他的評價標準在自己的模擬數據集(Mock API)上生成,生成的log可能有一定偏向性,測試數據集可能和訓練數據集風格過於一直顯得精確度很高。如果想在實際業務里使用這個方法,請按照自己收集或生成的數據集調整。

總結一下,這篇文章提出了 RNN-LSTM 方法做惡意請求log的判別,用字元序列作為輸入給一個簡單的 LSTM 可以在自己數據集上達到不錯的效果,大家可以一試,這可能是把人類從寫規則和寫正則里解放出來的一條路。至於使用什麼具體實現,其實不用受限於 Keras 這個比較落後的平台了,用 Gluon 實現同樣的 RNN/LSTM 更方便,運行速度更快還可以輕鬆多 GPU 呢,參考這個例子就好了 gluon.mxnet.io/chapter0

題圖來自於 Free picture: cat, fur, kitten, cute, animal, eye, domestic cat, feline, kitty, pet 遵循非商業使用準則。


大家好,這是「安全數據與機器學習」專欄的第二篇文章。這個專欄配合我們的小密圈/知識星球群組「安全數據與機器學習」和我們的blog專欄 Kakapo - 一個機器學習社區 ,給各位安全屆的朋友提高鍛煉數據建模和機器學習的知識。我們會不定期尋找一些優秀的文章,在這裡寫上摘要和導讀,引導大家前去深入學習。如果想參與「安全數據與機器學習」的討論,請下載「知識星球」app並搜索「安全數據與機器學習「或者點擊 t.xiaomiquan.com/IIqZV7 接受邀請。


推薦閱讀:

數學 · RNN(一)· 從 NN 到 RNN
譯文|LIME-分類器預測結果的解釋
AI安全如何入門(上)
1.2 如何看待與理解神經網路

TAG:信息安全 | 机器学习 | 深度学习DeepLearning |