学点算法搞安全之SVM

前言

  在企业安全建设专题中偶尔有次提到算法的应用,不少同学想深入了解这块,所以我专门开了一个子专题用于介绍安全领域经常用到的机器学习模型,从入门级别的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注入等带有代码注入特性的攻击的特点导致的。

总结

  不少人问过我,"什么样的情况下可以用算法?"。这个没有一个统一的答案,我认为在规则、沙箱都做的比较到位的情况下,可以试着使用机器学习;如果是已知漏洞都没有很好的防御和检测的话,使用机器学习确实性价比低。汽车在刚出来的时候没有马车快,但是是选择造一辆更快的马车还是选择造属于未来的汽车,这个见仁见智。

时间: 2024-08-07 09:25:41

学点算法搞安全之SVM的相关文章

学点算法搞安全之apriori

前言 在企业安全建设专题中偶尔有次提到算法的应用,不少同学想深入了解这块,所以我专门开了一个子专题用于介绍安全领域经常用到的机器学习模型,从入门级别的SVM.贝叶斯等到HMM.神经网络和深度学习(其实深度学习可以认为就是神经网络的加强版). 关联规则挖掘 关联规则挖掘通常是无监督学习,通过分析数据集,挖掘出潜在的关联规则,最典型的一个例子就是尿布和啤酒的故事.相传沃尔玛的数据分析人员通过分析大量购物清单发现相当一部分消费者会同时购买尿布和啤酒,结果他们把尿布和啤酒赫然摆在一起出售,结果销量又双双

学点算法搞安全之HMM(上篇)

前言 隐式马尔可夫(HMM),也称韩梅梅,广泛应用于语音识别.文本处理以及网络安全等领域,2009年I Corona,D Ariu,G Giacinto三位大神关于HMM应用于web安全领域的研究论文,让HMM逐渐被各大安全厂商重视.本篇重点介绍HMM最常见同时也比较基础的基于url参数异常检测的应用,后继文章将介绍HMM结合NLP技术在XSS.SQL.RCE方面的应用."多一个公式少一半读者",所以霍金的<时间简史>和<明朝那些事>一样畅销,我的机器学习系列文

学点算法搞安全之HMM(下篇)

前言 上篇我们介绍了HMM的基本原理以及常见的基于参数的异常检测实现,这次我们换个思路,把机器当一个刚入行的白帽子,我们训练他学会XSS的攻击语法,然后再让机器从访问日志中寻找符合攻击语法的疑似攻击日志. 通过词法分割,可以把攻击载荷序列化成观察序列,举例如下: 词集/词袋模型 词集和词袋模型是机器学习中非常常用的一个数据处理模型,它们用于特征化字符串型数据.一般思路是将样本分词后,统计每个词的频率,即词频,根据需要选择全部或者部分词作为哈希表键值,并依次对该哈希表编号,这样就可以使用该哈希表对

【机器学习算法-python实现】svm支持向量机(2)—简化版SMO算法

(转载请注明出处:http://blog.csdn.net/buptgshengod) 1.背景知识 通过上一节我们通过引入拉格朗日乗子得到支持向量机变形公式.详细变法可以参考这位大神的博客--地址 参照拉格朗日公式F(x1,x2,...λ)=f(x1,x2,...)-λg(x1,x2...).我们把上面的式子变型为: 约束条件就变成了: 下面就根据最小优化算法SMO(Sequential Minimal Optimization).找出距离分隔面最近的点,也就是支持向量集.如下图的蓝色点所示.

从零开始学回溯算法

本文在写作过程中参考了大量资料,不能一一列举,还请见谅. 回溯算法的定义:回溯算法也叫试探法,它是一种系统地搜索问题的解的方法.回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试. 解题的一般步骤是: 1.定义一个解空间,它包含问题的解: 2.利用适于搜索的方法组织解空间: 3.利用深度优先法搜索解空间: 4.利用限界函数避免移动到不可能产生解的子空间. 问题的解空间通常是在搜索问题的解的过程中动态产生的,这是回溯算法的一个重要特性. 话不多说,我们来看几个具体的例子慢

【机器学习算法-python实现】svm支持向量机(3)—核函数

(转载请注明出处:http://blog.csdn.net/buptgshengod) 1.背景知识 前面我们提到的数据集都是线性可分的,这样我们可以用SMO等方法找到支持向量的集合.然而当我们遇到线性不可分的数据集时候,是不是svm就不起作用了呢?这里用到了一种方法叫做核函数,它将低维度的数据转换成高纬度的从而实现线性可分. 可能有的人不明白为什么低维度的数据集转换成高维度的就可以实现线性可分,下面摘抄一个网上的例子解释一下.看下面这个图,我们设红色的区域是一组数据 ,而直线ab除了红色区域以

车辆追踪算法大PK:SVM+HOGvs.YOLO

介绍 对于Udacity(优达学城)自动驾驶汽车纳米学位的汽车检测和跟踪项目,如果使用传统的计算机可视化技术将是一个挑战,就像方向梯度直方图(Histogram of Oriented Gradients,HOG)和其它特征组合在一起在视频里跟踪汽车一样,理想的解决方案应该是实时运行的,如>30FPS,我曾经使用线性SVM来处理视频,在一台i7 CPU计算机上得到的结果只有可怜的3FPS.最后我使用YOLO来处理视频终于通过了Udacity的项目,YOLO是一个超快的用于对象检测的卷积神经网络,

前端要不要学数据结构&amp;算法

我们都知道前端开发工程师更多偏向 DOM 渲染和 DOM 交互操作,随之 Node 的推广前端工程师也可以完成服务端开发.对于服务端开发而言大家都觉得数据结构和算法是基础,非学不可.所以正在进行 Node 开发的同学而言,这个答案跃然纸上.我们今天重点说一说纯前端开发的同学到底需不要数据结构与算法. 我先说下结论:需要,非常需要. 第一,只要是程序员,基本功都是数据结构与算法 从我们接触编程的时候就知道一个理论,程序=数据结构+算法.所以,只要写的是程序,就离不开数据结构和算法.当然,有的同学会

零基础学贪心算法

本文在写作过程中参考了大量资料,不能一一列举,还请见谅.贪心算法的定义:贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,只做出在某种意义上的局部最优解.贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关.解题的一般步骤是:1.建立数学模型来描述问题:2.把求解的问题分成若干个子问题:3.对每一子问题求解,得到子问题的局部最优解:4.把子问题的局部最优