机器学习之恶意流量检测的特征工程

背景

传统的机器学习除了使用Tfidf-ngram的方式外还有其他做特征工程方式,还可以通过定义不同维度的特征来做特征工程,这种特征工程方式需要安全工程师对每一种攻击有良好特征提取能力。这种方法举个例子来说可以这样理解,我的输入是姚明,此时我在特征工程阶段需要将姚明转化为身高2.2米、体重400斤等等数值特征,再经过标准化等转化为机器可以识别的量纲单位进行学习预测。

机器学习之恶意流量检测的特征工程_第1张图片

机器学习流程& 特征工程

传统的机器学习可以理解成是生产算法的算法。需要人来先做特征提取,然后在把特征向量化后交给机器去训练。为什么要做特征工程,有这么一句话在业界广泛流传:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。我们做特征工程的目的是为了让训练后的结果达到最优的状态。

机器学习之恶意流量检测的特征工程_第2张图片

本例中我们的目的是从流量中识别恶意流量,首先需要在所有的负例样本中筛选出最具代表的特征,在所有的负例样本中筛选出最具代表的特征,我们先从简单关键词特征开始。观察正例样本基本没有类似information_schema.table、 sleep() 、alert(/1/)这种的特殊字符。

     

format=xml&platform=ppap&channel=withoutchannelfilename=sgim_eng.zip&h=B2EF665558623D671FC19AC78CA2F0F3&v=8.0.0.8381&ifauto=1

md5=d10015a0eb30bd33bb917e1d527c649num=8&PaperCode=600054daid=41&clientuin=1264523260

clientkey=00015947C124007000F19A1CB5D10832A25TAG=ieg.qqpenguin.desktopdaid=41&clientuin=1264523260

观察负例样本可以将如下负例样本看作是请求的value部份如 http://x.x.x/path?key1=value1&key2=value2,可以观察到同类型攻击具有很多相同的特征,比如xss来说具有很多javascript、alert、onerror=等特征,sql注入具有information_schema、information_schema.table、select、from、where等关键词特征

  

本例抽取部份的xss负例样本,从中可以抽取的特征规则大致可以这样表示

onmouseover= onload= onerror= alert() prompt()
javascript: confirm() onblur=

即便如此仍然会存在很多变形特征,比如", "123123sadas","onloads2s", "scriptsad23asdasczxc","onload=alert(1)"] x =MakeFeature(testX) forres, req in zip(predicts(x), testX): print("XSS==>" if res == 1else "None==>", req)

预测结果

XSS==>

None==> 123123sadas

None==> onloads2s

None==>scriptsad23asdasczxc

XSS==>onload=alert(1)“””

结果

可以看到由于特征工程阶段做的特征维度不够多特征保留的不够充分,在白样本中存在大量的干扰特征,导致最后准确率召回率都不是很高,精度大约只有74%左右,使用这种特征工程的方法笔者不是很推荐,虽然有监督方式的机器学习具有良好的可解释性,但是维护特征是一个永无止尽的过程,难度你真的想有多少智能就有多少人工吗。 :D

模型名称 预测精度
多项式 74.9%
伯努利 72.5%
决策树 73.9%
线性回归 72.5%
SVM 74.7%

*本文原创作者:邹先生007,本文属于FreeBuf原创奖励计划,未经许可禁止转载

你可能感兴趣的:(WEB安全,恶意流量,机器学习,特征工程)