基于多层神经网络的Webshell改进检测方法研究*
2019-01-23张涵,薛质,施勇
张 涵,薛 质,施 勇
(上海交通大学 网络空间安全学院,上海 200240)
0 引 言
随着互联网技术的不断发展,越来越多的企业和政府机关等都开始普及使用互联网的各种相关技术和应用,由此而来的针对网络、服务器的攻击日趋频繁。如今,国家和企业面临着网络安全方面的严峻威胁和挑战。我国出台了网络安全法,加强了对这一领域的监管力度。针对服务器的攻击中,Webshell是一种常见的入侵和操控网站后台的管理工具,通常由网页脚本语言编写。一旦Webshell被成功植入网站后台,入侵者就可以获得网站后台的部分甚至管理员权限以操控整个网站,进而有可能获得该服务器的所有权限。中国国家互联网站中心(简称CNCERT)发布的《2017年中国互联网网络安全报告》[1]中指出,2017年度内29 236个(去重后)网站被植入后门,其中政府网站有1 339个。所以,针对Webshell的识别检测对服务器和网站安全十分关键。因为Webshell编写十分灵活,变体众多,所以传统的基于特征的静态检测手段无法适应现在的攻击环境。本文将PHP格式的Webshell文件通过word2vector算法转化为词向量,使用多层神经网络(MLP)算法得到基于多层神经网络的Webshell改进检测算法。
1 相关研究
Webshell是一种以网页形式存在的命令执行脚本文件。针对Webshell的传统检测主要有静态检测、动态检测和日志分析三种方式。
传统检测方法主要通过对文件进行特征检测识别,对文件中的一些特征字符串进行匹配识别。例如,调用系统功能的高危函数eval()、system()等,结合关键词、文件修改的时间、文件权限、文件的所有者等字段进行判断检测。这种检测方法具有快速检测、快速定位的优点,缺点是漏报率、误报率高,无法查找0day型Webshell,且由于对高危函数、关键词等特殊字符串的识别一般采用正则表达式匹配实现,所以通过变种加密的方式容易被绕过。
动态分析在脚本运行时进行。传统检测方法主要通过分析脚本执行过程中的动态特性检测恶意脚本,如Webshell运行时采用HTTP协议,采集其特有的响应和请求特征,在IDS中进行检测;对正常不会调用到的文件进行读写操作等。该类方法能有效识别各类未知样本、变形样本、加密样本等,但也存在误报率高等问题。
日记分析方式是指shell脚本运行后在网站的Web日志中会留下Webshell页面的访问数据和数据提交记录,可通过大量的日志文件建立请求模型对其进行分析,从而检测出异常文件。石刘洋、方勇[2]等通过分析Web服务器日志文件检测恶意脚本,如利用页面请求特征、访问统计特征和页面关联特征等进行检测。这种检测方法存在一定误报,在访问日志数据量很大的情况下,检测工具的处理能力和效率会降低。易楠等[3]提出了一种基于语义分析的Webshell检测模型,通过构建抽象语法树,对恶意行为使用匹配算法进行计算,得到文件的风险值。若风险值超出设定的阈值,即说明该文件很大概率为Webshell。这种方法对已知类型的Webshell检测准确率较高,但对于未知类型的Webshell检出效果大大降低,对于变种混淆后的Webshell检出效果也不佳。
传统检测方法大都存在误报率、漏报率高且对未知类型或经过变种加密混淆后的Webshell检出效果不好的问题。所以,需要使用新的手段,从新的角度设计对Webshell的检测方案。目前,机器学习和大数据分析技术将广泛应用于Webshell检测等网络安全领域[4]。戴桦、李景等[5]提出一种基于矩阵分解的机器学习Webshell检测方法,通过对PHP文件的静态页面特征进行提取,然后使用一种矩阵分解的算法处理转化特征,最后进行机器学习训练。但是,他们采用的样本容量较小且比例不平衡,仍需要进一步改进。贾文超、戚兰兰[6]等采用基于随机森林的Webshell检测方法,通过改进随机森林特征选取方法,降低了树间相关度,提高了算法性能,但该算法使用的样本中Webshell和正常页面比例过于小,而且仍是基于页面的一些基本特征,所以仍然无法对新的未知类型的Webshell进行检测,同时误报率较高。胥小波、聂小明等[7]采用TF-IDF计算词频矩阵,并在此基础上筛选特征得到训练样本集的特征矩阵,最后通过多层神经网络(MLP)训练得到检测模型,提高了各项性能指标。
2 基于多层神经网络的Webshell改进检测算法
为了解决Webshell检测中的相关问题,本文提出了基于多层神经网络的Webshell改进检测算法。本节将首先介绍与Webshell检测相关的对检测很有意义的静态文本特征;其次,介绍对PHP源代码的处理,获得更加具有参考价值的opcode代码集合;再次,介绍对代码集合进行词向量转化的word2vec算法;最后,介绍本文使用的多层神经网络算法。
2.1 PHP文本静态特征
NeoPi[8]是一个开源的基于静态检测的Webshell检测工具。它主要检测的几个基于Webshell文件文本的字段值得参考。
2.1.1 最长字符的长度
一些Webshell采用加密和编码的方式进行混淆,可以绕开一些简单的使用正则匹配的静态检测手段,但可能会导致某些字符长度异常。所以,认为最长字符长度这一特征对Webshell的检测很有意义。
2.1.2 信息熵
信息熵最早由香农提出[9],定义为离散随机事件的出现概率。体现在文本中,即文本的无序性和不确定性越高,这段文本的信息熵就越大。为了绕开检测,攻击者会采用添加无用的不可读的注释和将一些调用的系统函数进行加密编码等方式进行文本混淆。但是,这些手段都会增大文本的信息熵。信息熵的计算公式如下:
2.1.3 重合指数
重合指数由William F F提出[10],是指从给定文本中随机选择两个字母找到两个相同字母的概率。IC的计算公式如下:
其中,N是文本的总长度,c是文本中不同字符的总数,ni是字符i在文本中出现的频率。
2.1.4 高危函数调用数量
Webshell通常会调用一些正常页面不会使用的系统函数、编码函数等,如eval、base64_decode、exec等。对文件中包含这类高危函数进行统计,对Webshell的检测有很大的帮助。
2.2 PHP opcode
opcode是一种介于高级语言和机器底层语言之间的机器语言指令,由编译器对高级语言代码进行词法分析转换而来。在PHP语言中,Zend引擎读取文件后进行词法分析,将PHP代码逐词转化为“token”,然后对token的列表进行处理整理,得到opcode。
例如,有一段简单的示例代码:
<?php
echo’Hello World’;
$a=1+1;
echo $a;
?>
经过PHP的VLD拓展项,在不直接运行PHP代码的情况下,可以获得如下的opcode:
ZEND_ECHO’Hello World’
ZEND_ADD~0 1 1
ZEND_ASSIGN!0 ~ 0
ZEND_ECHI~0
本文是将采集到的PHP文件转化为opcode再进行词向量转化,以避免Webshell中为了绕开静态检测恶意添加的无用注释的干扰。对于一些加密和编码混淆的手段,可以采集到初步编译后的特定opcode代码序列,便于检测Webshell。这种基于底层opcode代码的特征采集,使得所提模型对未知类型但仍然会应用到常见混淆手段的Webshell也有一定的检出能力,提高了模型的泛化性能。
2.3 word2Vec算法
在Webshell检测领域内,对于文本的词向量转换,胥小波、聂小明等是采用n-gram模型,即将文本中相邻的n个词划分为1个词组,然后使用TF-IDF算法统计计算词频,得到文本的词向量特征矩阵。
本文采用的word2vec是一种较新的将文本转化为词向量的算法,简单来说,是将一个单独的词转换为一个向量。word2vec已经广泛应用于自然语言处理领域。word2vec使用两种模型即跳字模型(skip-gram)[11]和连续词袋模型(CBOW),使用层次 softmax(hierarchical softmax)[12]算法,对给定的文本集合进行处理,计算得到每个词对应的词向量。对word2vec具体处理样本后的结果进行如下说明:对于一个给定的单词i,其对应的词向量xi∈Rd,d是在计算过程中设定的嵌入词向量空间的维数。一个包含n个词的句子n表示为一个n×d的矩阵。
为了保持输入矩阵的形状一致,设置了句子长度阈值n。当句子长度大于n时,会截取矩阵只保留前n的词;当句子长度小于n时,会将矩阵进行填充,在句子的末位插入足够多的0向量。
2.4 多层神经网络模型
多层神经网络(MLP)是一种前向结构的人工神经网络,是一种前向结构的人工神经网络。MLP是一个有向图,由多个节点层组成。除输入节点之外,每个节点都是一个带有非线性激活函数的神经元(或称处理单元)。多层神经网络通常使用的监督学习方法反向传播算法进行训练。MLP可以对任意复杂度的非线性关系进行拟合,并且拥有强大的泛化能力。
本次实验采用的MLP模型共包含3个隐含层,第一层有5个节点,第二层有3个节点,第三层有2个节点。网络结构如图1所示。
图1 多层神经网络结构
3 实验及结果分析
在Webshell领域,由于PHP语言使用最为广泛,所以本算法针对于PHP语言。训练样本集大小为4 500,其中Webshell样本大小为2 000,主要来源于github中公开的Webshell收集项目;正常页面样本有2 500个,主要来源于wordpress、phpcms、yii等开源的PHP内容管理系统(CMS)。CMS系统在某些功能表现上类似于Webshell,所以选取这类PHP文件作为白样本,可以使检测更加准确、有效。
本次实验word2vec的参数设置中,词向量的维数被设置为100,其余参数全部采用默认值。多层神经网络(MLP)中的参数,α设置为1e-5。本次实验采用10折交叉验证的方法,每次随机将样本集中的一部分作为训练集,其余部分作为验证集,10次随机抽取样本,最终测试结果各项性能指标取10次结果的平均值。
测试结果的评价,采用3个指标作为标准,分别是准确率(Accuracy)、召回率(Recall)和f1-score。准确率是指验证集中算法预测结果正确的比例,召回率是所有被模型判定为Webshell的样本中预测正确的比例。f1-score又被称为平衡F分数(Balanced F Score),是精确率和召回率的调和平均数。
对照试验中,几种机器学习算法使用的是相同的训练样本集。分别采用朴素贝叶斯算法、支持向量机(SVM)算法、对opcode进行传统TF-IDF进行的多层神经网络(MLP)算法。朴素贝叶斯算法和支持向量机算法中,加入了前文提到的静态特征丰富样本的特征,提高了算法的检测性能。在参数设置上,支持向量机算法采用线性拟合,参数c设置为10;多层神经网络(MLP)算法,隐含层设置为3层,每层节点分别为5、3、2,与本文采用的结构相同,词袋参数中设置为2-gram,最大特征数为200。
表1展示了几种不同的Webshell检测算法的指标。可以看出,基于多层神经网络的Webshell检测算法,在准确率、召回率和f1-score指标性能上都有提升,证明了所提算法具有良好的准确性、泛化性和对未知类型样本的检测能力。
表1 测试实验结果各项指标
4 结 语
本文介绍了Webshell检测领域中的传统检测方法和一些应用机器学习相关算法的检测方法,例如决策树、线性回归svm、随机森林等算法,单纯的基于简单的文本特征,限制了算法的准确性、精度等指标,并且对于未知类型的Webshell不具备较强的泛化能力。本文提出的基于卷积神经网络的Webshell检测算法,使用了在自然语言处理应用较为广泛的word2vec算法对php文件的代码编译后的opcode进行处理,并提取特征,有效提高对于未知类型文件的检出能力。下一步工作是引入Webshell攻击时的流量和日志信息,同时改进模型结构,以继续提高算法的各项指标能力表现。