北京网思科平科技有限公司长期致力于网络安全研究和大数据分析与利用业务,在基于大数据、机器学习和人工智能技术的信息安全防御系统研发领域有着雄厚的技术实力和强大的数据应用能力。
近日,网思科平(OneScorpion)发表机器学习在信息安全检测领域应用的研究论文《基于深度学习和半监督学习的webshell检测方法》。
此篇论文中,网思科平大数据研发中心的科研技术人员在历年来大量翔实的实验数据基础上,对论文所述检测方法进行了充分的论证。该检测方法有效降低了检测漏报率和误报率,且研究和实验方法具有极强的实用性,颠覆了传统的特征检测模式。
基于深度学习和半监督学习的webshell检测方法
作者 吴斌 赵力 朱和稳
工作单位 北京网思科平科技有限公司
摘 要:半监督学习是一种重要的机器学习方法,能同时使用有标记样本和无标记样本进行学习。在webshell检测领域,有标记样本少、形式灵活多变、易混淆,基于特征匹配的方式很难进行准确检测[1]。针对标记样本较少的现状,本文提出一种基于深度学习和半监督学习的webshell检测方法,先使用卡方检验和深度学习方法获取样本的文本向量,然后分别使用单分类和增量学习方式训练,提高分类性能。使用Github公开数据集进行训练和测试,实验结果验证该方法能够有效改善webshell检测的漏报率和误报率。
关键词:深度学习 半监督学习 webshell检测 单分类 增量学习
0 引言
随着互联网的发展,基于B/S架构的Web应用迅速普及,包括应用在政府、银行、运营商、电商,以及各大门户网站。由于不同的Web系统研发人员水平差异,在设计过程中难免对安全问题欠缺考虑,造成Web安全问题频发。常见的安全威胁有:SQL注入漏洞、上传文件漏洞、提交表单漏洞、跨站脚本攻击等。入侵者在获得Web系统漏洞后,会通过上传Webshell来获得Web服务器的操作权限。对于入侵者来说,Webshell就是一个后门程序,通常是ASP,PHP,JSP等网页脚本,入侵实施后,首先在网页服务器的Web目录下面放置脚本文件,然后可以通过Web页面对网站服务器进行控制[2]。由于Webshell操作不会在系统安全日志中留下记录,并且与正常网页文件混在一起,一般管理员很难看出入侵痕迹[3]。
在Web安全检测领域,由于缺少样本,很难建立精准的监督学习模型,而无监督学习会造成误报率高的问题,需要大量的安全工程师分析过滤机器学习的警告,分析结果存在人工误差。由于Web攻击方式多变,传统的预测方式难以应对复杂的真实环境。本文利用深度学习提取特征完备性高的特点,结合半监督学习,将机器学习应用于Webshell本地检测,使用Github公开样本数据[4,5],采用单分类和增量学习方式,不断优化模型,经过多次试验效果证明,本文方法能够有效降低误报率和提高检测率。
1 深度学习
在机器学习领域,学者公认“数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已”。本文webshell检测的测试数据来源于Github上整理的webshell样本,具有一定的代表性。特征选择使用卡方检验和神经网络相结合,先用卡方检验选取前K个重要特征,过滤测试文本,进一步使用神经网络算法,获得每一个样本的文本向量。
1.1 卡方检验
卡方检验是一种常见的特征选择方法。其基本思想是根据样本数据推断总体的分布与期望分布是否有显著差异,或者推断两个分类变量是否相关或者独立。
一般可以设原假设为:观察频数与期望频数没有差异,或者两个变量相互独立不相关。实际应用中,我们先假设
成立,计算出
值。根据
分布,
统计量以及自由度,可以确定在
成立的情况下获得当前统计量以及更极端情况的概率P。如果P很小,说明观察值与理论值的偏离程度大,应该拒绝原假设。否则不能拒绝原假设。
的计算公式为:
其中,A为实际值,T为理论值。
在本文的Github样本中,使用卡方检验剔除与webshell攻击相关性较小的词,例如:“is”、“the”、“的”、“是”等。选取前500个特征词,例如“shell”、“package”等。
1.2 神经网络
深度学习是机器学习的重要分支,目前深度学习在图像,语音,自然语言等取得巨大突破。在文本分析领域,word2vec[6]和doc2vec是深度学习的重要研究成果,doc2vec与word2vec相似,只是在word2vec基于词的语义分析基础上,添加基于上下文的语义分析能力。
doc2vec是将词表征为实数值向量的一种高效的算法模型,利用深度学习的思想,构建三层神经网络,即输入层-隐藏层-输出层,通过训练,把对文本内容的处理简化为K维向量空间中的向量运算。其训练过程和预测过程如下图:
图1 文档向量学习框架图
图2 分布式文档向量图
在本文的测试样本中,经过卡方检验筛选之后,运用doc2vec模型,训练得到样本的文本向量:[-2.08397750e-02,-4.90234122e-02,-2.03357283e-02,-7.65093416e-02,…]。
2 半监督学习
传统的机器学习通常分为监督学习和非监督学习。监督学习是通过训练标记的样本,尽可能正确的对训练之外的未标记样本进行预测;非监督学习是通过训练无标记的样本,以发现未标记样本之间的内部特征。半监督学习是介于监督学习和非监督学习之间的机器学习方式,同时运用标记样本和无标记样本,训练机器学习模型。
在实际应用中,有标记的webshell样本数量极少,人为手动标记代价大,少量有标记的webshell样本极其珍贵,而webshell样本中未标记的样本大量存在。本文的webshell模型训练中,首先把未标记的样本当做正常webshell,使用无监督方式训练单分类SVDD模型;再运用有标记的样本,修正单分类SVDD模型,达到增量学习的目的。本文充分运用webshell现有少量有标记和大量无标记的样本数据,使用半监督学习,利用先验单分类SVDD模型信息和新的标记样本更新模型,一方面能够继承先前学习的知识,让整个学习具有可积累性,另一方面实现在线学习,不断更新webshell检测模型。
2.1 单分类SVDD模型
SVDD(Support Vector Domain Description)即支持向量数据描述,是由Tax和David[7]提出并发展起来的一种单值分类算法,标准的SVDD模型属于无监督学习,把要描述的对象作为一个整体,建立一个封闭而紧凑的超球体,使得描述对象全部或尽可能多的包在这个球体内。
图3 单分类SVDD模型图
假设训练数据集为,SVDD优化目标是在T中,找到最下半径R,最优超球体的求解可以转化为优化问题:
s.t.
其中,R为要求的最小包含球的半径,C为自定义常数,为惩罚项,为最小包含球的中心。
训练结束后,需要判断新的数据点Z是否属于这个类,即:
至此本文已经用未标记样本训练了单分类SVDD模型,对于测试数据可以用该模型判断。但是未标记样本中存在一定量的webshell攻击样本,直接使用单分类SVDD模型存在一定误差。接下来使用标记样本,通过监督学习方式,训练增量学习SVDD模型,修正已经训练好的单分类SVDD模型。
2.2 增量学习SVDD模型
Webshell攻击方式多变,脚本更新速度快,攻击的特征也不是一成不变的。使用当前的webshell样本训练单分类SVDD模型,难以适应webshell入侵方式不断更新。而增量学习是一种在线学习方式,指的是一个学习系统能不断地从新样本中学习新的知识,并能保存大部分以前已经学习到的知识。准确的说,增量学习并不是一种模型,而是一种模型的训练更新方式。
本文增量学习SVDD模型,在单分类SVDD模型的基础上,运用有标记的webshell样本,更新单分类SVDD模型,达到增量学习的目的。在这个过程中,以前处理过的大部分样本不需要重复处理,只选取作为支持向量的样本,结合新的有标记的样本,重新学习并更新SVDD模型,一旦学习完成之后,训练的样本被丢弃。学习系统没有关于整个训练样本的先验知识。
3 基于深度学习和半监督学习的webshell检测算法
3.1 webshell检测算法流程
基于深度学习和半监督学习的webshell检测算法主要包含卡方检验、深度学习、半监督学习、单分类SVDD、增量学习SVDD等。其中算法结构如下:
图4 Webshell检测算法流程图
3.2 webshell检测算法描述
本文运用深度学习和半监督学习相关算法,对于有标签样本集,其中
为对应样本
的标记向量,无标记样本
,进行webshell建模分析。其中Webshell检测算法具体流程描述如下:
表1 webshell检测算法步骤描述表
Step1: 首先用分词处理有标记样本,再用卡方检验分析各个特征词与样本标记之间的相关性,选择前K个重要特征词 |
Step2: 对于未标记样本,用第一步中获取的特征词筛选,获得未标记样本特征 |
Step3: 对于第二步中获取的未标记样本特征,使用神经网络算法,或者各个未标记样本的文本向量,即doc2vec |
Step4: 利用第三步中获取的文本向量,使用无监督学习方法,构建核函数,训练单分类SVDD模型,优化超球面半径最小化,最大情况包含未标记样本 |
Step5: 对于新的标记样本,运用在线学习方式,训练增量学习SVDD模型,修正单分类SVDD模型,增强现有模型能力 |
4 实验与分析
为了验证本文中基于深度学习和半监督学习的webshell算法检测性能,使用Github中数据进行实验,数据样本分布情况如下表2所示。
表2 数据的类别分布表
类别 | 初始训练集![]() |
增量训练集![]() |
增量训练集![]() |
正常测试集![]() |
Webshell样本集![]() |
---|---|---|---|---|---|
数据 | 600 | 200 | 200 | 121 | 295 |
比例% | 42.4 | 14.1 | 14.1 | 8.6 | 20.8 |
4.1 数据预处理
原始的webshell训练样本是直接在Github上下载的webshell脚本文件,在进行样本训练之前,需要进行数据预处理。为了获得高质量的特征集,在所有的数据集合中,选取有标记样本作为卡方训练样本,其中选取增量训练集中50份样本,增量训练集
中50份样本,正常测试集
中50份样本,Webshell样本集
中50份样本,组合成200份有标记卡方训练样本。
经过卡方检验之后,选取前500个特征作为样本的重要特征,其中前8个特征结果如下表3所示。
表3 前8个卡方检验特征表
特征 | Eval | shell | Namespace | class | Base64 | package | extends |
---|---|---|---|---|---|---|---|
方 | 506.07 | 407.406 | 354.98 | 324.77 | 308.40 | 295.59 | 253.68 |
通过卡方检验选择的特征是与标记样本相关性较高的特征词。为简化样本复杂程度,需要进一步使用卡方检验获取的前500个特征值,过滤初始训练集。然后使用神经网络,训练过滤后的样本,获取训练样本的文本向量,即Doc2vec。其中最终获得文本向量示例如下。
4.2 实验结果和分析
在有少量有标记样本和大量无标记样本情况下,半监督学习是能够同时兼顾训练样本和提高训练结果的学习方法。在无监督学习阶段,本文使用初始训练集获得的文本向量,训练单分类SVDD模型M0。在有监督学习阶段,首先在单分类SVDD模型M0的基础上,使用增量训练集
训练增量SVDD模型M1;然后在增量SVDD模型M1的基础上,使用增量训练集
训练增量SVDD模型M2。对于每个模型,均使用正常测试集
和webshell样本集
样本混合测试。对于本文的webshell检测方法,使用漏报率和误报率来验证模型分类效果,测试结果如下表4所示。
表4 测试结果表
模型 | 测试数据 | 漏报率% | 误报率% |
---|---|---|---|
M0 | ![]() ![]() |
10.2 | 12.2 |
M1 | ![]() ![]() |
9.5 | 10.1 |
M2 | ![]() ![]() |
8.3 | 9.9 |
从实验结果可以看出,对于相同的 +
测试样本,使用增量SVDD训练的模型在漏报率和误报率上均优于单分类SVDD模型,并且使用增量样本修正的次数越多,模型的效果越好。说明基于深度学习和半监督学习方法在webshell检测中的优越性,充分利用少量有标记样本,使用在线学习方法,训练增量SVDD模型,不断优化最终模型,降低检测的漏报率和误报率。
5 总结
经过多次的实验结果可知,本文提出的基于深度学习和半监督学习webshell检测方法,在webshell检测中,在一定程度上改善了系统的性能,有效降低了漏报率和误报率,并在增量学习框架下,通过不断学习新增标记样本,能够持续优化系统。在深度学习领域,本文使用文本向量的方式获得样本特征,此后的重点研究方向在于如何获取更有价值的样本特征。在半监督学习领域,本文使用单分类SVDD模型和增量SVDD模型,此后的重点研究方向在于如何优化模型提高漏报率和误报率。
参考文献:
[1] J.Ross Quinlan. C4.5:programs for machine learning[M]. San Francisco:Morgan Kaufmann,1993.
[2] 胡建康,徐震,马多贺等. 基于决策树的Webshell检测方法研究[J].网络新媒体技术. 2012,1(6):15-19.
[3] 解析是什么wenshell?如何防范? 计算机与网络[J].2012,18:50-51.
[4] https://github.com/tanjiti/webshellSample.
[5] https://github.com/tennc/webshell.
[6] Mikolov, Tomas, Le, Quoc V., and Sutskever, Ilya. Exploiting similarities among languages for machine translation. CoRR, abs/1309.4168, 2013b.
[7] David M.J.Tax, Robert P.W. Duin. Support Vector Data Description[J].Pattern Recognition Letters,1999,20(11-13):1191-1199.