基于卷积神经网络的Webshell检测方法研究

2019-07-19 01:24
网络安全与数据管理 2019年7期
关键词:向量卷积神经网络

姜 天

(武汉邮电科学研究院,湖北 武汉 430074)

0 引言

Webshell是一种Web安全威胁,通常以PHP、ASP等网页文件的形式存在于Web服务器中。攻击者可以通过远程访问Webshell后门得到一个命令执行环境,进而获得Web服务器的控制权[1]。

目前对于Webshell的解决方法主要有静态检测、动态检测、语法检测以及基于统计学的检测。静态检测通过匹配规则来查找已知Webshell,动态检测则是根据运行时表现出来的特征进行识别,然而这两种方法的误报率和漏报率都比较高。语法分析则是将代码和注释分离,通过分析语法结构来判断函数调用是否危险,但是这种方法的误报率依然很高。统计学检测是当下比较流行的方法,通过信息熵等方式对混淆Webshell进行识别[2]。

本文通过Word2vec获得PHP opcode对应的词向量,并使用卷积神经网络对Webshell的特征操作序列进行提取,经过多次训练后可以获得泛化能力较好的检测模型。

1 特征提取与数据表示

本节首先介绍PHP opcode以及如何获取特征操作序列对应的opcode集合,然后介绍如何使用Word2vec对该集合进行词向量的转换。

1.1 PHP opcode

opcode属于计算机指令中的一部分,通常由处理器对其格式进行规范。程序运行过程中,一方面需要指令序列调用相关的函数进行操作,另一方面也需要相应的操作数参与运算。opcode还有一个别名叫做字节码(byte codes),是一种构建在Zend虚拟机上的指令[3]。由Zend引擎解析“ASSIGN”操作后的结果如图1所示。

图1 获取PHP opcode

使用PHP的逻辑代码展现(Vulcan Logic Dumper,VLD)可以查看解析后的opcode。VLD属于PHP的扩展项中的一种,因此需要有PHP环境。在实验过程中通过Python调用subprocess模块下的getstatusoutput来获取解析结果,并将结果保存在字符串中,方便后续的词向量转换操作。迭代多次后,可以得到所有文件的opcode序列。

另外,opcode缓存技术也常被用在开发调试阶段中。这种技术减少了大量重复的编译过程,节省了系统资源。

1.2 Word2vec模型

自然语言处理随着计算机领域的不断扩大而逐渐被人们重视。为了使计算机能够处理自然语言,首先需要对自然语言进行建模。自然语言建模方法经历了从基于规则的方法到基于统计方法的转变。从基于统计的建模方法得到的自然语言模型称为统计语言模型[4]。

Bengio等人在2003年总结出了一套神经网络建立的统计语言模型(Neural Network Language Model,NNLM),并首次提出了word embedding的概念,这也为Word2vec、Doc2vec等模型的出现奠定了基础[5]。

Word2vec是Google公司开发的一套将词转换为实值向量的工具,采用连续词袋(Continuous Bag-Of-Words,CBOW)和Skip-Gram两种模型。图2展示了两种模型的基本架构。

CBOW模型通过输入某一个词的上下文语境来预测这个词本身,而Skip-Gram模型则是通过具体的一个词来预测出它周围有哪些词语。两个模型都是随机初始化词向量,且都可以使用层次化Softmax(Hierarchical Softmax)或负采样(Negative Sampling)方法来提高训练效率。

本文在获得PHP opcode后使用了gensim模块中的Word2vec模型进行词向量的转换。对于一个含有m个词的文件来说,规定生成的向量维度为k,每一个词对应的词向量为Yj(j=1,2,…,m)∈Rk,则该文件对应的词向量集合可以用一个大小为m×k的矩阵来表示[6]。

(1)

图2 CBOW和Skip-Gram结构图

各文件长度的不一致会导致卷积神经网络的输入层出错,因此实验中设置了最大长度m=300,不足最大值的则在矩阵末尾添加全0的行向量来进行补齐。词向量的维度k设置为100,Word2vec对象的处理窗口大小为10,词出现的最小频次门限值为10,迭代训练次数设置为20次,默认采用CBOW模型。

2 基于卷积神经网络的检测模型

卷积神经网络(Convolutional Neural Network,CNN)最早出现在图像处理领域,用于解决数据量庞大而无法进行深度学习的问题[7]。由于本次数据预处理阶段获得的是opcode文字片段,因此应使用一维卷积函数来进行特征提炼。本文的CNN模型主要由以下几个部分构成:输入层、卷积层、拼接和池化层以及全连接层等。本节将介绍各个层的作用和具体细节,CNN的基本结构如图3所示。

图3 CNN结构图

2.1 输入层和卷积层

由于在数据表示阶段得到了opcode对应的词向量,并使用新定义的数组来进行存放,因此CNN的输入层传入的是一个三维矩阵。

数据传入前会先进行归一化操作,传入后通过一层卷积层的卷积操作。当卷积核处理窗口大小为h,数据维度为k时,对于给定输入矩阵X1:m∈Rm×k中特定位置i的词语来说[8],可得到卷积后的结果为:

ci=f(W·Xi:i+h-1+b)∈R

(2)

其中b表示偏离值;W是一个权值矩阵,起到过滤的作用;而f则代表非线性修正函数。实验过程中该非线性函数选择默认的“relu”,并使用“valid”有效填充,同时采用默认的L2正则降低模型复杂度。

采用由3个卷积核数量为100,处理窗口h的大小分别为3、4和5组成的一维卷积层进行局部特征的提取。

2.2 拼接和池化层

将卷积后的结果进行首尾拼接,得到融合的特征张量,接着通过全局池化操作来获得张量中的最大特征值。最大池化层的存在降低了特征维数,同时减少了计算开销[8]。

实验中还添加了随机丢弃(random dropout)操作,用来防止反向传播过程中过拟合现象的发生。设置比率为0.8,表示经过该层后有大约80%的神经元会停止工作[9],用公式可表示如下:

(3)

其中Bernoulli函数是为了生成概率r向量,即生成一个概率p为0或1的向量,用来代表停止或激活神经元[9]。

此时第l层的神经元更新为:

y′(l)=r(l)·y(l)

(4)

实验结果表明,随机丢弃可以起到平均输出结果的作用,能让一些“相反的”拟合互相抵消。

2.3 全连接和回归层

由于该模型的最终目标是识别Webshell文件,因此对于CNN来说这是一个0或1的二分类任务。实际过程中在全连接层使用了默认的激活函数“softmax”。

回归层主要的作用是最小化损失函数“loss”,同时可以提供模型好坏的度量标准,以评估模型性能。其中,优化器选用“Adam”(Adaptive Moment Estimation,自适应矩估计),使用默认的分类交叉熵损失函数(categorical_crossentropy),学习率设置为0.001。本文采用的默认损失函数公式如下:

(5)

3 实验设计与结果分析

3.1 数据源与参数选择

本次实验针对的是PHP Webshell的检测,因此收集了github上的数据作为目标文件。黑样本主要来自bartblaze/PHP-backdoors、JoyChou93、b374k/b374k和JoyChou93/webshell等目录,其中包含了攻击者常用的所谓“小马”、“大马”等PHP文件。白样本则选择的是phpcms、WordPress以及yii等PHP基本框架文件。

总样本数量为4 347,其中黑样本有1 801个,白样本有2 546个。训练集与测试集的比例为6:4,设定CNN中的验证集与测试集相同,同时设置批处理大小为100,迭代训练20轮。

3.2 评估标准

使用混淆矩阵(confusion matrix)来评估模型的性能。混淆矩阵又被称作可能性表格或错误矩阵,其每一行代表预测值,每一列代表的是实际类别[11]。

矩阵中的元素从上到下依次代表正真例(True Positive,TP)、假反例(False Negative,FN)、假正例(False Positive,FP)和真反例(True Negative,TN)。在本次实验的评估过程中,使用准确率(Accuracy)、精确率(Precision)、召回率(Recall)和平衡F分数(F1-score)四个数值来作为衡量模型性能的标准。

混淆矩阵的构成及衍生出的各项评价指标如图4所示。

图4 混淆矩阵及其衍生的评价指标

3.3 结果分析

为了对比分析CNN模型的有效性,本文还引入了SVM、xgboost和mlp算法来处理相同的数据。其中mlp设置为2层,第一层有20个神经元,第二层有2个神经元,其他参数选择默认设置。

首先使用tflearn提供的VocabularyProcessor(词汇表模型)来进行特征opcode的提取,设置最大文本长度为400,词出现的最小频率为10次,选择默认的其他参数值。表1展示了使用词汇表模型后各算法在相同数据集上的性能表现。

表1 采用词汇表模型提取特征 (%)

然后使用sklearn提供的CountVectorizer(词袋模型)进行相同的特征提取操作。本文采用2-Gram来获得词袋模型,最小词频为10次,忽略解码错误,其他参数保持默认状态。表2是使用词袋模型处理相同数据后的性能分析结果。

表2 采用词袋模型提取特征 (%)

最后使用gensim模块中的Word2vec模型处理数据,具体参数设置可以参考1.2节中的内容。各算法的分类性能如表3所示。

表3 采用Word2vec提取特征 (%)

算法Word2vec模型准确率精确率召回率F1-scoreSVM87.0099.2369.8882.01xgboost97.8797.9597.0197.48mlp97.8197.0497.8397.43本文方法98.2299.5896.2097.86

通过表中的数据可以看出,同样是使用Word2vec模型转换获得的数据,本文提出的方法对于该分类任务的表现要优于传统机器学习算法,基于深度学习的CNN检测模型在准确率、精确率等指标上都有明显提升。

同时,相较于先前基于n-gram、词汇表等模型的检测模式,采用先提取PHP文件对应的opcode、后使用Word2vec算法进行词向量转换的方式对于检测Webshell效果更好。

4 结论

本文采用了基于卷积神经网络的检测模型,在识别PHP Webshell方面的表现优于传统机器学习算法。同时,使用Word2vec算法对opcode进行词向量转换的方法更有利于特征提取。因此,本文提出的模型同样可以用于其他文件类型的Webshell检测。

由于Webshell文件较难收集,且大多都是未更新的代码片段,导致黑样本数量较少。同时模型的定长输入会影响检测效果,因此下一步任务主要是引进Webshell攻击日志和流量,改进检测模型,提升识别效率和泛化能力。

猜你喜欢
向量卷积神经网络
基于递归模糊神经网络的风电平滑控制策略
向量的分解
基于3D-Winograd的快速卷积算法设计及FPGA实现
一种并行不对称空洞卷积模块①
聚焦“向量与三角”创新题
神经网络抑制无线通信干扰探究
从滤波器理解卷积
基于神经网络的中小学生情感分析
基于傅里叶域卷积表示的目标跟踪算法
基于Q-Learning算法和神经网络的飞艇控制