BiLSTM在JavaScript恶意代码检测中的应用①

2021-09-10 07:32雷天翔
计算机系统应用 2021年8期
关键词:分类器代码向量

雷天翔,万 良,于 淼,褚 堃

1(贵州大学 计算机科学与技术学院,贵阳 550025)

2(贵州大学 计算机软件与理论研究所,贵阳 550025)

1 引言

近年来,随着Web 应用程序以浏览器/服务器(B/S)架构占据主流市场,Web 服务已经被广泛的应用,浏览器和网页已然成为传播恶意代码的重要途径.攻击者使用网站代码漏洞,第三方应用程序漏洞,浏览器漏洞和操作系统漏洞对网站执行跨站点脚本攻击,注入Web 木马,篡改网页,网络钓鱼和窃取个人信息,造成用户个人信息泄露和财产损失.根据《2019中国网络安全报告》,瑞星“云安全”在2019年全球共截获恶意网址(URL)总量1.45 亿个,其中挂马类网站1.2 亿个,钓鱼类网站2454 万个[1].中国的恶意URL 总数为471.63 万,位列全球第五.恶意内容包含在恶意网页中,这些恶意网页很容易使访问者不知不觉地受到网络攻击,例如病毒传播,特洛伊木马植入,信息泄漏等.他们的恶意代码主要是脚本语言,例如JavaScript.为了避免检测,这些恶意脚本还以不同的编码方法进行了混淆[2].经过混淆后的JavaScript 恶意代码更是成为提高检测性能的一大难点.

当前,静态检测方法为大多数研究人员在对Java-Script 恶意代码检测过程中使用的方法.此方法通过对JavaScript 源码的语法、过程、结构等进行分析从而提取特征达到对恶意代码的检测的目的.随后使用机器学习[3-5]的检测方法被提出.Likarish 等[6]从每个代码文件中选择65 个统计特征作为输入,包括可读序列的数量,每个JavaScript 关键字的频率,脚本的长度,每行平均字符数和Unicode 符号.数量等.评估代码的可读性,然后利用机器学习来检测模糊的恶意JavaScript 代码,取得了很好的分类效果.Wang[7]采用机器学习技术抽取和分析恶意脚本特征,使用SVM 分类模型进行分类,结果表明具有较高的检测率低误报率.Li 等[8]使用自编码器将高维数据转换为低维数据,紧接着采用深度自编码网络自动学习JavaScript 恶意代码的特征,从而对其进行检测和分类.通过研究发现现有的检测技术存在着手工提出特征,工作量大主观性太强和对混淆的恶意代码检测难度大等不足,针对上述不足之处,一些研究人员开始使用深度学习的方法来检测JavaScript 恶意代码,深度学习神经网络可以自动学习特征,因此避免了手动提取特征的复杂性和主观性.Cui[9]将深度学习中的卷积神经网络(Convolutional Neural Networks,CNN)运用到JavaScript 恶意代码检测.Wu 等[10]使用卷积神经网络、LSTM、CNNLSTM 模型进行漏洞检测.上述实验结果显示,相比于传统的方法,上述方法的优势尽显无疑.Fang 等[11]使用LSTM 来对JavaScript 恶意代码.LSTM 能有效地检测JavaScript 恶意代码,但对于混淆的JavaScript 恶意代码的检测还不够准确.Choi 等[12]和Visaggio 等[13]使用3 个衡量标准来对混淆进行检测,衡量指标分别是字符串的最大长度、无序状态的熵、在忽略大小写后,非数字字母在字符串中所占的比例.Lu 等[14]从代码的语义方面对代码进行反混淆.马洪亮等[15]将静态分析和动态分析相结合起来,以此来达到恶意代码反混淆的目的.

基于上诉文献,为了获取恶意代码深层本质特征,提出了一种基于双向长短时记忆网络的JavaScript 检测方法.LSTM是带有记忆细胞单元的循环神经网络,常用于处理长序列数据,能解决长序列数据依赖的问题.但是单向的LSTM 只能解决上文对下文的依赖而无法解决下文对上文的依赖,使得对JavaScript 代码特征提取不够充分.在此基础上本文选择双向长短时记忆网络来学习JavaScript 代码,获得更加全面的代码特征,提高检测的准确度.实验结果分析,该方法具有较优的分类效果,强鲁棒性和较强的泛化能力.

2 研究方法

2.1 系统概括

本文检测方法的整体框架如图1所示,首先通过爬虫工具从Alexa和PhishTank 网站收集大量数据,随后经过数据清洗、数据分词和数据向量化后得到能输入到神经网络中的标准化数据集,最后使用双向长短时神经网络对标准数据集进行训练和分类,得到最终的结果.

图1 JavaScript 检测整体框架

2.2 长短时神经网络(LSTM)

在1991年,研究人员提出了一种改进的RNN 网络,也就是长短时神经网络(Long Short term Memory Networks,LSTM).这一网络的出现成功的解决了RNN的长期依赖问题和梯度消失问题.

LSTM 网络结构如图2所示,其有4 个重要组成部分为遗忘门、输入门、输出门、用于更新细胞状态的部分[16];遗忘门决定保留和遗忘上一时刻状态ct-1的哪些信息;输入门负责决定在t时刻的输入xt有多少信息被保留到ct;输出门选择ct有多少输送到了LSTM在t时刻的输出值ht;数学表达式如下:

图2 长短时记忆网络结构

更新遗忘门输出ft:

式(1)中,遗忘门的权重矩阵为wf,ht-1和xt拼接成的一个新向量 [ht-1,xt],偏置为bf,σ1(x)为激活函数使用Sigmoid.

更新输入门的输出it,同时计算候选状态,计算公式如下:

其中,wi为输入门的权重,bi为偏置向量,激活函数σ2(x)同样使用Sigmoid 函数,wc为权重矩阵,bc为偏置向量,激活函数为t anh(x).

更新当前时刻细胞状态ct:

更新输出门输出ht:

式(5)中,输出门的权重矩阵为wo,激活函数使用tanh(x),bo是输出门的偏置.

2.3 双向长短时记忆网络(BiLSTM)

LSTM 解决了RNN的梯度消失问题,但单向的LSTM 只能从前向后传递依赖,无法充分利用上下文信息,在面对预测问题时,需要上下文信息来共同决定当前预测结果,使得预测结果更加准确.因此,双向LSTM 被提出来解决此问题,其结构如图3所示.

图3 BiLSTM 网络结构

2.4 一种基于BiLSTM的检测模型

2.4.1 模型构建

为了充分利用上下文的依赖关系,本文提出一种基于BiLSTM的检测模型.如图4所示.

图4 基于BiLSTM的检测模型

Input layer:输入层.数据以向量的形式进行输入,同时还要设置相关参数(batchsize).

BiLSTM layer:双向长短时记忆网络层.BiLSTM具有能解决数据长期依赖并且能保留上下文语义信息的优点,让其自动学习JavaScript 恶意代码的特征.其中包括了两部分,从前向后传递的LSTM 层和从后向前传递的LSTM 层,在某一时刻,将两个方向不同的层的结果结合起来,得到最终的输出结果传递给下一层.

Dropout layer:为了使检测模型具有较强的泛化能力,防止过拟合问题的产生.

Output layer:输出层.输出分类器分类后的结果.

本文的JavaScript 恶意代码检测模型步骤如下,具体分为两步,第1 步为提取代码的抽象特征,第2 步对其进行分类检测.输入:Xi={x1,x2,…,x49,x50}

步骤1:

(1)将Xi作为输入,经过输入层得到输出向量Ii={i1,i2,…,i49,i50}.

(2)Ii作为BiLSTM 层的输入向量,经过这一层的前向LSTM 得到前向的隐向量hLi={hL1,hL2,···,hL63,hL64}.经过后向的LSTM 得到后向的隐向量hRi={hR1,hR2,···,hR63,hR64}.

(3)最后将(2)中的两个向量拼接成为一个新的向量{[hL1,hR1],[hL2,hR2],···,[hL63,hR63],[hL64,hR64]},即hi={h0,h1,···,h63,h64}.

步骤2:

(1)为了防止过拟合问题的产生,在dropout 层,随机的使若干个神经元失活,这一层的输入为hi,这一层的输出为d={d1,d2,…,d63,d64}.

(2)将dropout 层的输出向量d输入到Output 层的Softmax 函数中进行分类,得到最终的二维输出y.

2.4.2 算法设计

为了检测出恶意代码,设计了算法1.

算法1.BiLSTM 训练算法1) 构建BiLSTM 神经网络并对网络的权重和偏置进行初始化操作;2) 构建Softmax 并初始化其参数;3) for iin epoch,进行迭代循环训练,epoch为训练迭代次数;4) 将预处理后的训练集Xi 作为输入层的输入,得到输出Ii;5)将Ii 作为BiLSTM的输入,经过前向LSTM和后向LSTM 分别得到前向隐向量hL和后向隐向量hR,将hL和hR 拼接得到抽象特征h;6) 经过dropout 层避免模型出现过拟合;7) 将抽象特征向量输入到Softmax 分类其中得到分类结果;8) 根据最后的输出结果和真实结果之间的差距,通过反向传播算法依次调整各个参数;9) 更新Softmax的参数;10)对BiLSTM 神经网络的权重和偏置进行更新;11) end for 12) 将Ti={t1,t2,…,t49,t50}作为测试集输入到训练好的模型中,得到测试结果.

3 实验

本文实验的硬件条件为:处理器Intel(R) Core(TM)i7-9750H CPU@2.60 GHz,内存8 GB,图像处理器NIVDIA GeForce GTX 1650,显存4 GB.实验环境为Python3.6.2、Tensorflow-gpu1.15.0.

3.1 实验数据收集

本文的数据集中,良性的数据来自于Alexa 排名靠前的网站所抓取的数据,恶意的数据来源于知名网站PhishTank的数据库,经过数据预处理后,获得良性的代码数据84 208 条和恶意代码数据26 216 条.为良性的数据打上标记为1,恶意的数据打上标记为0.实验中,从样本中以7:3的比例随机选取训练集和测试集数据.表1展示了数据集分布情况.

表1 数据集分布

3.2 数据预处理

为了提高输入数据的质量以此来提高整个模型性能,在此基础上,本文对收集的所有数据进行了数据预处理.

(1)代码反混淆:利用解码技术对于恶意的Java-Script 混淆代码进行了反混淆处理.本文采用动态分析的技术进行反混淆.首先生成混淆代码的抽象语法树AST,遍历AST的所有节点,若该节点为变量,数组,方法等,则将该节点进行保留,其余的节点则删除,对保留的节点使用变量值读取器[17]读取终值.经过上述反混淆过程,隐藏在变量终值中的初始JavaScript 恶意代码会被还原出来.如图5所示为混淆代码还原为原始代码.

图5 混淆代码经过反混淆还原为初始代码

(2)分词:对数据进行代码反混淆的工作后,由于神经网络的输入为向量,因此先进行分词处理,使用分词工具NLTK对代码数据进行分词,去除停用词,为后续训练词向量做准备.图6展示了分词结果.

图6 分词后的结果

(3)向量化:首先根据词频-逆文件频率(TF-IDF)算法建立词汇库,选择那些对识别恶意代码具有关键作用的词.根据词汇库将代码数据转化为数值型数据,使用Gensim 工具包中的Word2Vec 模型对分词的数据训练,将分词的数据转化为向量,表2展示了一个向量化的样例.由于神经网络输入长度固定,而向量化后的代码长度不固定.因此选择合适的向量维度对于模型精度极其重要,于是在训练词向量的过程中根据最后的向量维度,如果数据的长度超过向量维度,则对其进行截断,如果数据的长度没有超过向量维度,后面的数据用-1 进行填充.使得所有输入数据都保持在合适的向量维度.

表2 向量化结果

3.3 实验结果及其分析

表3展示了BiLSTM的实验结果.此结果为代码数据经过BiLSTM 神经网络的训练和分类后得到的.

表3 BiLSTM 实验结果混淆矩阵

3.3.1 评价指标

为了验证本文方法的性能,本文方法的评判标准为准确率(Accuracy)、误报率(False Positive Rate,FPR)和召回率(Recall,RE),评价分类模型的3 个重要指标如下:

准确率:被正确检测出的数据占所有样本的比例,即:

召回率:正确分类为恶意的代码占所有恶意代码的比例,即:

误报率:良性的数据被误判为恶意代码占样本总数的比例,即:

具体参数见表4.

表4 模型参数设置

3.3.2 检测方法分析

(1)向量维度

在数据预处理时,不同的向量维度对模型的训练和检测的效率具有不同的影响,一个合适的向量维度才能使模型充分利用数据的信息.向量维度过长会使得模型的收敛速度变慢,向量维度过短会遗失大量的有效信息,因此为了选择合适的向量维度,本文对比了30、50、100、150 这4 个向量维度,以此来观察向量维度与准确率和训练时间的变化关系.实验结果如图7所示.由图中的结果可以得出,向量维度超过50 后,模型的检测效果相差不明显,但是模型训练所用的时间却相差很大.模型在向量维度为50和100 时,其检测效果是最好的,然而选择100 维向量时,模型的训练时间几乎是50 维向量的2 倍,因此,本文在数据预处理时选择了向量维度为50 维,对不足50 维的向量进行填充,对超过50 维的向量进行截断.

图7 向量维度

(2)优化器

神经网络中的优化器是在利用损失函数计算出模型的损失值后,再利用损失值对模型的各个参数进行优化,使其达到最优的值.最终使得模型的预测值和真实值的误差越来越小.不同的优化器会导致模型性能的差异,模型的收敛速度的不同.本文对几种常见的优化器进行了对比试验,损失函数的变化曲线如图8所示.可以看出,优化器SDG的效果最差,并且收敛的速度不如其余几个优化器,Adam 优化器的收敛速度略微高于其余几种优化器而它的损失函数值更小.故本文的模型选择了Adam 优化器,使模型更加快速的收敛到一定的值.

图8 优化器

(3)分类器

分类器是根据数据的真实标签来学习分类的规则,随后在训练完毕后对未知的数据进行分类.常用的两种分类器为LR 分类器和Softmax 分类器,LR 分类器主要用于二分类问题,Softmax 常用于互斥的多分类问题,在分类数为2的时候,会退化为逻辑回归分类.本文对两种分类器进行了对比实验.从表5中的实验结果可以看出使用了Softmax 分类器的模型的性能要优于使用LR 分类器的检测模型,因此这里选择Softmax 作为分类器.

表5 分类器

在实验环节,本文对各种参数的设置进行了对比实验,选择了能使模型达到最优效果的参数,所得的检测模型的参数设置如表6所示.

表6 模型参数设置

本文提出的实验方法结果如图9~图11所示,随着训练次数的增加,准确率和损失函数曲线会逐渐收敛.通过预测值和真实值之间的误差反向传播调节各个参数的值,直到模型的效果达到最优,在5 个epoch 后,此时准确率和损失函数的值会收敛到一定值.模型训练完毕后,使用测试集数据对模型进行测试,实验发现,本文提出的方法对于一条script 标签的代码进行检测的时间约为0.33 s,并且数据随来随检测,可以对网页中的JavaScript 恶意代码实现实时的检测.

图9 损失函数曲线

图10 准确率变化曲线

图11 ROC 曲线

3.3.3 对比分析

本文通过两组对比实验来评估模型的效果.其中一组对比实验是将本文的方法和文献[7]的SVM,AD Tree 等检测方法进行对比.另一组对比试验是将本文中的方法与其他深度学习算法如TextCNN,RCNN 等进行对比.

(1)机器学习对比实验

从表7和图12可以看出,传统的机器学习方法对JavaScript 恶意代码实现了较好的检测,但与本文的BiLSTM 相比,对恶意代码检测的准确率没有本文方法的高,并且误报率相对而言较高,而本文方法的准确率为99.52%而误报率仅为1.4%,并且不需要手动提取恶意代码特征,节省了大量的人力.

表7 BiLSTM与机器学习算法对比结果

图12 BiLSTM与机器学习算法对比

(2)深度学习对比实验

为了验证本文提出的方法效果更优,将本文的方法与TextCNN,RCNN和LSTM 进行对比实验,结果如表8和图13所示,TextCNN 常用于文本分类,其将一个句子中的每个词当作一个一维向量,使用卷积的方式去获取句子的特征,但是其网络结构忽略了句子之间的结构信息,没有考虑到恶意代码中的函数、数组、变量的调用关系,分类效果没有本文方法中的效果好.RCNN 则是在经过一个双向RNN 后再经过一个最大池化层,试图找到最重要的潜在语义因素,然而在恶意代码检测领域,无论是最重要的因素还是次重要的因素都可能对我们的安全造成威胁,因此,在本实验中,RCNN的准确率不及本文方法.LSTM 没有充分的获取到上下文的相关信息,因此它的误报率明显高于本文方法.

表8 BiLSTM与深度学习方法对比结果

图13 不同深度学习方法对比

综上所述,与其他机器学习方法和深度学习方法相比,使用本文提出的BiLSTM 更适合对JavaScript 恶意代码进行检测,BiLSTM 模型明显优于其他方法.

4 结论

本文在现有检测技术的基础上,提出一种使用双向长短时记忆网络检测JavaScript 恶意代码攻击的方法.为了提高检测的精度,首先使用解码技术对JavaScript进行反混淆的处理,并利用深度学习工具Word2Vec将代码向量化作为神经网络的输入.最后,使用深度学习算法BiLSTM对JavaScript 恶意代码进行分类,提高检测的性能.和机器学习算法相比,BiLSTM 检测模型无需人工提取代码特征,其会自动的提取出跟恶意代码检测相关的特征.和深度学习其他算法相比,BiLSTM检测模型更加充分的获取到代码的上下文相关信息,模型的检测性能更加的优异,通过测试检测模型并与机器学习和深度学习分类算法进行比较,验证了本文提出的基于BiLSTM的JavaScript恶意代码检测模型的可行性和有效性.结合上述实验结果,本文方法可以应用到实践中去,将本文的提出方法以插件的形式嵌入到浏览器中,如谷歌浏览器,用户在不经意点开某些恶意站点如色情网站,虚假的购物网站,赌博网站时会发出警告来提醒用户有潜在的安全威胁.

猜你喜欢
分类器代码向量
少样本条件下基于K-最近邻及多分类器协同的样本扩增分类
向量的分解
学贯中西(6):阐述ML分类器的工作流程
基于朴素Bayes组合的简易集成分类器①
基于AdaBoost算法的在线连续极限学习机集成算法
神秘的代码
一周机构净增(减)仓股前20名
重要股东二级市场增、减持明细
向量垂直在解析几何中的应用
向量五种“变身” 玩转圆锥曲线