2. 贵州大学 计算机软件与理论研究所, 贵阳 550025
2. Institute of Computer Software and Theory, Guizhou University, Guiyang 550025, China
近年来, 随着Web应用程序以浏览器/服务器(B/S)架构占据主流市场, Web服务已经被广泛的应用, 浏览器和网页已然成为传播恶意代码的重要途径. 攻击者使用网站代码漏洞, 第三方应用程序漏洞, 浏览器漏洞和操作系统漏洞对网站执行跨站点脚本攻击, 注入Web木马, 篡改网页, 网络钓鱼和窃取个人信息, 造成用户个人信息泄露和财产损失. 根据《2019中国网络安全报告》, 瑞星“云安全”在2019年全球共截获恶意网址(URL)总量1.45亿个, 其中挂马类网站1.2亿个, 钓鱼类网站2454万个[1]. 中国的恶意URL总数为471.63万, 位列全球第五. 恶意内容包含在恶意网页中, 这些恶意网页很容易使访问者不知不觉地受到网络攻击, 例如病毒传播, 特洛伊木马植入, 信息泄漏等. 他们的恶意代码主要是脚本语言, 例如JavaScript. 为了避免检测, 这些恶意脚本还以不同的编码方法进行了混淆[2]. 经过混淆后的JavaScript恶意代码更是成为提高检测性能的一大难点.
当前, 静态检测方法为大多数研究人员在对JavaScript恶意代码检测过程中使用的方法. 此方法通过对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、CNN-LSTM模型进行漏洞检测. 上述实验结果显示, 相比于传统的方法, 上述方法的优势尽显无疑. 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网站收集大量数据, 随后经过数据清洗、数据分词和数据向量化后得到能输入到神经网络中的标准化数据集, 最后使用双向长短时神经网络对标准数据集进行训练和分类, 得到最终的结果.
2.2 长短时神经网络(LSTM)
在1991年, 研究人员提出了一种改进的RNN网络, 也就是长短时神经网络(Long Short term Memory Networks, LSTM). 这一网络的出现成功的解决了RNN的长期依赖问题和梯度消失问题.
LSTM网络结构如图2所示, 其有4个重要组成部分为遗忘门、输入门、输出门、用于更新细胞状态的部分[16]; 遗忘门决定保留和遗忘上一时刻状态
更新遗忘门输出
${f_t} = {\sigma _1}({w_f} \cdot [{h_{t - 1}}, {x_t}] + {b_f})$ | (1) |
式(1)中, 遗忘门的权重矩阵为
更新输入门的输出
${i_t} = {\sigma _2}({w_i} \cdot [{h_{t - 1}}, {x_t}] + {b_i})$ | (2) |
${\tilde c_t} = \tanh ({w_c} \cdot [{h_{t - 1}}, {x_t}] + {b_c})$ | (3) |
其中,
更新当前时刻细胞状态
${c_t} = {f_t} * {c_{t - 1}} + {i_t} * {\tilde c_t}$ | (4) |
更新输出门输出
${o_t} = {\sigma _3}({w_o} \cdot [{h_{t - 1}}, {x_t}] + {b_{\rm{0}}})$ | (5) |
${h_t} = {o_t} * \tanh ({c_t})$ | (6) |
式(5)中, 输出门的权重矩阵为
LSTM解决了RNN的梯度消失问题, 但单向的LSTM只能从前向后传递依赖, 无法充分利用上下文信息, 在面对预测问题时, 需要上下文信息来共同决定当前预测结果, 使得预测结果更加准确. 因此, 双向LSTM被提出来解决此问题, 其结构如图3所示.
2.4 一种基于BiLSTM的检测模型 2.4.1 模型构建为了充分利用上下文的依赖关系, 本文提出一种基于BiLSTM的检测模型. 如图4所示.
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得到前向的隐向量
(3) 最后将(2)中的两个向量拼接成为一个新的向量
步骤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) foriin 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的数据库, 经过数据预处理后, 获得良性的代码数据84208条和恶意代码数据26216条. 为良性的数据打上标记为1, 恶意的数据打上标记为0. 实验中, 从样本中以7:3的比例随机选取训练集和测试集数据. 表1展示了数据集分布情况.
3.2 数据预处理为了提高输入数据的质量以此来提高整个模型性能, 在此基础上, 本文对收集的所有数据进行了数据预处理.
(1) 代码反混淆: 利用解码技术对于恶意的JavaScript混淆代码进行了反混淆处理. 本文采用动态分析的技术进行反混淆. 首先生成混淆代码的抽象语法树AST, 遍历AST的所有节点, 若该节点为变量, 数组, 方法等, 则将该节点进行保留, 其余的节点则删除, 对保留的节点使用变量值读取器[17]读取终值. 经过上述反混淆过程,隐藏在变量终值中的初始JavaScript恶意代码会被还原出来. 如图5所示为混淆代码还原为原始代码.
(2)分词: 对数据进行代码反混淆的工作后, 由于神经网络的输入为向量,因此先进行分词处理, 使用分词工具NLTK对代码数据进行分词, 去除停用词, 为后续训练词向量做准备. 图6展示了分词结果.
(3)向量化: 首先根据词频-逆文件频率(TF-IDF)算法建立词汇库, 选择那些对识别恶意代码具有关键作用的词. 根据词汇库将代码数据转化为数值型数据, 使用Gensim工具包中的Word2Vec模型对分词的数据训练, 将分词的数据转化为向量, 表2展示了一个向量化的样例. 由于神经网络输入长度固定, 而向量化后的代码长度不固定. 因此选择合适的向量维度对于模型精度极其重要, 于是在训练词向量的过程中根据最后的向量维度, 如果数据的长度超过向量维度,则对其进行截断, 如果数据的长度没有超过向量维度, 后面的数据用–1进行填充. 使得所有输入数据都保持在合适的向量维度.
3.3 实验结果及其分析
表3展示了BiLSTM的实验结果. 此结果为代码数据经过BiLSTM神经网络的训练和分类后得到的.
3.3.1 评价指标
为了验证本文方法的性能, 本文方法的评判标准为准确率(Accuracy)、误报率(False Positive Rate, FPR)和召回率(Recall, RE), 评价分类模型的3个重要指标如下:
准确率: 被正确检测出的数据占所有样本的比例, 即:
$Accuracy = \frac{{TP + TN}}{{TP + TN + FN + FP}} \times 100{\text{%}} $ | (7) |
召回率: 正确分类为恶意的代码占所有恶意代码的比例, 即:
$RE = \frac{{TP}}{{TP + FN}} \times 100{\text{%}} $ | (8) |
误报率: 良性的数据被误判为恶意代码占样本总数的比例, 即:
$FPR = \frac{{FP}}{{FP + TN}} \times 100{\text{%}} $ | (9) |
具体参数见表4.
3.3.2 检测方法分析
(1)向量维度
在数据预处理时, 不同的向量维度对模型的训练和检测的效率具有不同的影响, 一个合适的向量维度才能使模型充分利用数据的信息. 向量维度过长会使得模型的收敛速度变慢, 向量维度过短会遗失大量的有效信息, 因此为了选择合适的向量维度, 本文对比了30、50、100、150这4个向量维度, 以此来观察向量维度与准确率和训练时间的变化关系. 实验结果如图7所示. 由图中的结果可以得出, 向量维度超过50后, 模型的检测效果相差不明显, 但是模型训练所用的时间却相差很大. 模型在向量维度为50和100时, 其检测效果是最好的, 然而选择100维向量时, 模型的训练时间几乎是50维向量的2倍, 因此, 本文在数据预处理时选择了向量维度为50维, 对不足50维的向量进行填充, 对超过50维的向量进行截断.
(2)优化器
神经网络中的优化器是在利用损失函数计算出模型的损失值后, 再利用损失值对模型的各个参数进行优化, 使其达到最优的值. 最终使得模型的预测值和真实值的误差越来越小. 不同的优化器会导致模型性能的差异, 模型的收敛速度的不同. 本文对几种常见的优化器进行了对比试验, 损失函数的变化曲线如图8所示. 可以看出, 优化器SDG的效果最差, 并且收敛的速度不如其余几个优化器, Adam优化器的收敛速度略微高于其余几种优化器而它的损失函数值更小. 故本文的模型选择了Adam优化器, 使模型更加快速的收敛到一定的值.
(3)分类器
分类器是根据数据的真实标签来学习分类的规则, 随后在训练完毕后对未知的数据进行分类. 常用的两种分类器为LR分类器和Softmax分类器, LR分类器主要用于二分类问题, Softmax常用于互斥的多分类问题, 在分类数为2的时候, 会退化为逻辑回归分类.本文对两种分类器进行了对比实验. 从表5中的实验结果可以看出使用了Softmax分类器的模型的性能要优于使用LR分类器的检测模型, 因此这里选择Softmax作为分类器.
在实验环节, 本文对各种参数的设置进行了对比实验, 选择了能使模型达到最优效果的参数, 所得的检测模型的参数设置如表6所示.
本文提出的实验方法结果如图9~图11所示, 随着训练次数的增加, 准确率和损失函数曲线会逐渐收敛. 通过预测值和真实值之间的误差反向传播调节各个参数的值, 直到模型的效果达到最优, 在5个epoch后, 此时准确率和损失函数的值会收敛到一定值. 模型训练完毕后, 使用测试集数据对模型进行测试, 实验发现, 本文提出的方法对于一条script标签的代码进行检测的时间约为0.33 s, 并且数据随来随检测, 可以对网页中的JavaScript恶意代码实现实时的检测.
3.3.3 对比分析
本文通过两组对比实验来评估模型的效果. 其中一组对比实验是将本文的方法和文献[7]的SVM, AD Tree等检测方法进行对比. 另一组对比试验是将本文中的方法与其他深度学习算法如TextCNN, RCNN等进行对比.
(1)机器学习对比实验
从表7和图12可以看出, 传统的机器学习方法对JavaScript恶意代码实现了较好的检测, 但与本文的BiLSTM相比, 对恶意代码检测的准确率没有本文方法的高, 并且误报率相对而言较高, 而本文方法的准确率为99.52%而误报率仅为1.4%, 并且不需要手动提取恶意代码特征, 节省了大量的人力.
(2)深度学习对比实验
为了验证本文提出的方法效果更优, 将本文的方法与TextCNN, RCNN和LSTM进行对比实验, 结果如表8和图13所示, TextCNN常用于文本分类, 其将一个句子中的每个词当作一个一维向量, 使用卷积的方式去获取句子的特征, 但是其网络结构忽略了句子之间的结构信息, 没有考虑到恶意代码中的函数、数组、变量的调用关系, 分类效果没有本文方法中的效果好. RCNN则是在经过一个双向RNN后再经过一个最大池化层, 试图找到最重要的潜在语义因素, 然而在恶意代码检测领域, 无论是最重要的因素还是次重要的因素都可能对我们的安全造成威胁, 因此, 在本实验中, RCNN的准确率不及本文方法. LSTM没有充分的获取到上下文的相关信息, 因此它的误报率明显高于本文方法.
综上所述, 与其他机器学习方法和深度学习方法相比, 使用本文提出的BiLSTM更适合对JavaScript恶意代码进行检测, BiLSTM模型明显优于其他方法.
4 结论本文在现有检测技术的基础上, 提出一种使用双向长短时记忆网络检测JavaScript恶意代码攻击的方法. 为了提高检测的精度, 首先使用解码技术对JavaScript进行反混淆的处理, 并利用深度学习工具Word2Vec将代码向量化作为神经网络的输入. 最后, 使用深度学习算法BiLSTM对JavaScript恶意代码进行分类, 提高检测的性能. 和机器学习算法相比, BiLSTM检测模型无需人工提取代码特征, 其会自动的提取出跟恶意代码检测相关的特征. 和深度学习其他算法相比, BiLSTM检测模型更加充分的获取到代码的上下文相关信息, 模型的检测性能更加的优异, 通过测试检测模型并与机器学习和深度学习分类算法进行比较, 验证了本文提出的基于BiLSTM的JavaScript恶意代码检测模型的可行性和有效性. 结合上述实验结果, 本文方法可以应用到实践中去, 将本文的提出方法以插件的形式嵌入到浏览器中, 如谷歌浏览器, 用户在不经意点开某些恶意站点如色情网站, 虚假的购物网站, 赌博网站时会发出警告来提醒用户有潜在的安全威胁.
[1] |
北京瑞星网安技术股份有限公司. 瑞星2019年中国网络安全报告与趋势展望. 信息安全研究, 2020, 6(2): 98-107. DOI:10.3969/j.issn.2096-1057.2020.02.001 |
[2] |
Rad BB, Masrom M. Metamorphic virus variants classification using opcode frequency histogram. Proceedings of the 14th WSEAS International Conference on Computers: Part of the 14th WSEAS CSCC Multiconference. Stevens Point, WI, USA. 2011. 147–155.
|
[3] |
Khan N, Abdullah J, Khan AS. Defending malicious script attacks using machine learning classifiers. Wireless Communications and Mobile Computing, 2017, 2017: 5360472. |
[4] |
徐青, 朱焱, 唐寿洪. 分析多类特征和欺诈技术检测JavaScript恶意代码. 计算机应用与软件, 2015, 32(7): 293-296. DOI:10.3969/j.issn.1000-386x.2015.07.070 |
[5] |
Pan JK, Mao XG. Obfuscated malicious JavaScript detection by machine learning. Proceedings of the 2nd International Conference on Advances in Mechanical Engineering and Industrial Informatics (AMEII 2016). 2016. 805–815.
|
[6] |
Likarish P, Jung E, Jo I. Obfuscated malicious javascript detection using classification techniques. Proceedings of the 4th International Conference on Malicious and Unwanted Software. Montreal, QC, Canada. 2009. 47–54.
|
[7] |
Wang WH, Lv YJ, Chen HB, et al. A static malicious Javascript detection using SVM. Proceedings of the 2nd International Conference on Computer Science and Electronics Engineering. 2013. 214–217.
|
[8] |
Li YC, Ma R, Jiao RH. A hybrid malicious code detection method based on deep learning. International Journal of Software Engineering and Its Applications, 2015, 9(5): 205-216. DOI:10.14257/ijseia.2015.9.5.20 |
[9] |
Cui ZH, Xue F, Cai XJ, et al. Detection of malicious code variants based on deep learning. IEEE Transactions on Industrial Informatics, 2018, 14(7): 3187-3196. DOI:10.1109/TII.2018.2822680 |
[10] |
Wu F, Wang JG, Liu JQ, et al. Vulnerability detection with deep learning. Proceedings of the 3rd IEEE International Conference on Computer and Communications. Chengdu, China. 2018. 1298–1302.
|
[11] |
Fang Y, Huang C, Liu L, et al. Research on malicious JavaScript detection technology based on LSTM. IEEE Access, 2018, 6: 59118-59125. DOI:10.1109/ACCESS.2018.2874098 |
[12] |
Choi YH, Kim TG, Choi SJ. Automatic detection for JavaScript obfuscation attacks in web pages through string pattern analysis. International Journal of Security and Its Applications, 2009, 4(2): 13-26. |
[13] |
Visaggio CA, Pagin GA, Canfora G. An empirical study of metric-based methods to detect obfuscated code. International Journal of Security and Its Applications, 2013, 7(2): 59-74. |
[14] |
Lu G, Coogan K, Saumya Debray. Automatic simplification of obfuscated JavaScript code (Extended Abstract). Proceedings of the 6th International Conference on Information Systems, Technology and Management. Grenoble, France. 2012. 348–359.
|
[15] |
马洪亮, 王伟, 韩臻. 混淆恶意JavaScript代码的检测与反混淆方法研究. 计算机学报, 2017, 40(7): 1699-1713. DOI:10.11897/SP.J.1016.2017.01699 |
[16] |
Zeng Y, Yang HG, Feng YS, et al. A convolution BiLSTM neural network model for Chinese event extraction. Proceedings of the 5th CCF Conference on Natural Language Processing and Chinese Computing, NLPCC 2016, and 24th International Conference on Computer Processing of Oriental Languages. Kunming, China. 2016. 275–287.
|
[17] |
马洪亮, 王伟, 韩臻. 面向drive-by-download攻击的检测方法. 华中科技大学学报(自然科学版), 2016, 44(3): 6-11. |