用深度学习检测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 接受邀请。

编辑于 2017-09-29

文章被以下专栏收录