基于多层感知器神经网络的WebShell检测方法*

2018-05-05 07:30胥小波聂小明
通信技术 2018年4期
关键词:源码词组字节

胥小波,聂小明

(1.中国电子科技网络信息安全有限公司,四川 成都 610041;2.中国电子科技集团公司第三十研究所,四川 成都 610041)

0 引 言

随着互联网技术的不断发展,B/S构架的Web应用程序已被广泛应用于电子商务、网络论坛、政府行政等网络平台,发挥了重要的经济、文化、政治作用,其安全性已直接关系到财产安全、社会稳定等。但是,由于技术水平、安全意识等限制,现有的Web应用平台存在各种类型的系统漏洞或应用程序漏洞,给攻击者非法进入Web主机提供了机会。为达到长期控制Web主机的目的,攻击者通常会在进入主机后将恶意脚本上传至Web服务器,并将其隐藏在正常脚本文件夹中。通过这些恶意脚本,攻击者能够创建后门,从而达到长期控制Web主机的目的。这类通过Web应用控制Web主机的恶意脚本,通常被称为WebShell。国家互联网应急中心(CNCERT)发布的《2016年中国互联网网络安全报告》[1]指出,2016年CNCERT共监测到境内82 072个网站被植入WebShell,其中商业机构网站占62.3%,网络组织类占4.8%,政府类网站占2.9%。

WebShell通常具备很强的隐藏性,及时检测发现其踪迹难度较大。目前,传统杀毒软件主要采用特征码匹配的方法检测WebShell。这种方法通过分析已知WebShell代码样本提取其文本特征作为恶意特征码,并形成恶意特征码库。这种方法对已知类型的WebShell检测准确率能达到90%以上,但对于未知、变种等类型的WebShell,准确率甚至不到60%。通过高隐蔽性的WebShell,攻击者能够长期控制Web主机,并利用其进行信息窃取、商业勒索、组建僵尸网络等违法活动,而其危害程度很大程度上取决于Web主机被控制的时长。因此,研究能够及时检测已知、未知及变种等各类WebShell的方法具有非常重要的意义。

1 相关研究

传统的WebShell检测方法主要分为三类:静态分析、动态分析和日记分析。

静态分析在脚本运行前进行,传统检测方法主要通过匹配文件中的特征码字符串(如常见恶意代码块、高危函数名eval、system等)检测恶意脚本。这类基于特征码匹配的方法一般通过正则表达式匹配实现。但是,由于正则表达式在本质上为有限状态自动机,无法完备地定义行为特征并完整覆盖风险模型,因此在降低检测漏报率和误报率上存在无法跨越的瓶颈。实际上,Hansen等[2]已经在理论上证明了基于正则表达式的匹配方式必然存在漏报和误报。

动态分析在脚本运行时进行,传统检测方法主要通过分析脚本执行过程中的动态特性检测恶意脚本,如分析eval执行上下文、文件读写操作、网络流量等动态行为。例如,Wrench等[3]使用基于行为相似性的方法动态检测WebShell,能有效检测处于活动状态的恶意行为;杜海章等[4]基于PHP扩展对PHP代码的编译过程进行检测,实现了对WebShell的实时动态检测;马艳发等[5]使用网络流量分析的方法在WAF(Web Application Firewall)端检测WebShell,避免了传统检测方法需要在所有Web服务器上单独安装检测模块的弊端。该类方法的优点是能有效识别各类未知样本、变形样本、加密样本等,但也存在误报率高等问题。

日记分析在脚本运行后进行,传统检测方法主要通过分析Web服务器日志文件检测恶意脚本,如利用页面请求特征、访问统计特征和页面关联特征等进行检测[6]。这种检测方法在日志数据量较大时比较有效,但存在误报率高等问题。

由于传统检测方法存在的缺陷,研究者们开始从新的角度寻找检测方案。目前,较为前沿的检测方法有基于文本统计特性和基于文本语义特征的检测方法。

基于文本统计特性的方法主要是基于统计理论,尝试利用各类统计量作为特征检测恶意脚本,如开源程序NeoPI[7]使用文件内容的信息熵、重合指数、最长单词、压缩比等特征检测WebShell。胡建康等[8]提取内容属性(单词数量、最大单词长度等)、基本属性(evel类函数调用数量、函数参数的最大长度等)和高级属性(文件操作、数据库操作)做为分类特征,使用决策树C4.5分类器构建检测模型,并辅以集成学习算法Boosting,实现了WebShell检测。

基于文本语义特性的方法尝试采用自然语言处理(Nature Language Processing,NLP)技术在语义层面发现恶意代码行为。例如,叶飞等[9]提取脚本的结构特性和内容特性(页面标题、元信息、关键字)作为分类特征,使用支持向量机(SVM)作为分类算法构建检测模型;Deng等[10]使用词法分析进行特征提取,从语法角度对WebShell进行识别与检测;易楠等[11]提出了一种基于语义的恶意代码检测方法,从语义角度对文件行为进行描述和风险评估。该方法首先根据代码文件构建抽象语法树(AST),通过节点风险评估表从完整树中提取污点子树,并将其与恶意行为特征图进行图匹配得到风险值,最后通过阈值判定是否为恶意代码文件。这类方法的优点是实现相对简单,对已知的恶意代码检测准确率高,但其缺点明显,如对未知样本、变种样本等检测效果较差。

可见,现有的WebShell检测算法更多在源码文本层面展开研究,易受到代码注释法、代码混淆法等WebShell逃逸方法的影响。此外,现有检测模型多采用传统的分类器算法。这些分类器算法泛化能力较弱,从而导致检测模型在面对未知模式的样本时检测性能急剧下降,甚至完全无法检测。

2 基于多层神经网络的WebShell检测方法

为解决上述问题,本文提出了基于多层神经网络的WebShell检测方法。

相对于传统方法更多停留在源码层面,本文创新性地在源码编译结果层面展开研究,能有效避免代码注释法、代码混淆法等WebShell逃逸方法的影响。此外,在样本特征选取方面,传统方法多基于字符特征码,因此仅能覆盖单条代码语句,而本文方法采用字节码序列作为样本特征,有效利用了代码的上下文语境信息,大幅提升了模型检测准确率。

为进一步提高检测准确度,本文算法还将神经网络分类算法——多层感知器(Multi-Layer Perceptron,MLP)应用于检测模型。相对于传统的分类算法,MLP具有更强的非线性拟合能力,同时具备强大的泛化能力,能有效检测传统方法难以处理的未知样本。

据统计,在已知的WebShell中,使用PHP语言编写的WebShell占绝大多数。因此,本文主要研究PHP类型WebShell的检测方法。

本节将首先分析PHP代码编译执行流程,并设计PHP代码编译结果——字节码的提取方法,之后将介绍如何使用特征工程方法提取字节码序列用作样本特征,最后将介绍如何使用MLP算法训练WebShell检测模型。

2.1 字节码获取

PHP是解释型语言,其代码执行流程可分为词法分析(Lexical Analysis)阶段、语法分析(Syntax Analysis)阶段、字节码(OpCodes)编译阶段和代码执行阶段。执行流程图如图1中的实线部分所示。

在词法分析阶段,词法分析器(Lexer)依次读入源码字符序列,并按照PHP语法规则将其切分为标记(Token)序列。在语法分析阶段,词法分析器(Parser)读入标记(Token)序列,对其进行语法检查后生成抽象语法树(Abstract Syntax Tree,AST)。在字节码编译阶段,PHP虚拟机Zend读入抽象语法树,并将其上的操作符节点翻译成相应的字节码。在代码执行阶段,PHP虚拟机Zend根据代码要求加载相应模块,初始化运行环境,最后执行字节码并输出结果。

图1 PHP源码字节码提取流程

从流程来看,如果要获得PHP代码的编译结果字节码,需要在Executing阶段为PHP虚拟机Zend添加相应的字节码输出功能。此时,有两种方式可以实现:修改源码和添加插件。修改源码方式需要重新编译PHP运行环境,因此在实际应用中较少被采用。而添加插件方式由于采用了统一的插件框架,因此只需单独编译插件本身,且能通过修改配置文件方便完成功能添加。此外,添加插件方式还能够在不同系统的PHP运行环境中分发部署,具有极大的便利性。

基于上述考虑,本文使用插件方式实现字节码集中输出功能。添加字节码提取功能后,原PHP虚拟机Zend在执行至字节码编译时会额外输出字节码样本,如图1中虚线连接的实心框部分所示。

2.2 特征提取

在使用字节码样本集训练检测模型前,需要对字节码样本进行特征提取,以确定能最大程度区分正常样本和WebShell样本的特征。

为了利用字节码的上下文信息,本文采用二元语法模型(BiGram)类似的方法切分字节码样本集,即将相邻的两个字节码划分到一个词组中,同时统计该词组在字节码样本中出现的次数,以此表示字节码样本。也就是说,在词组切分完成后,每个字节码样本都被表示成一个词频向量。

采用上述方式切分的字节码样本集可能包含数量巨大的各类字节码词组,即表征字节码样本的词频向量可能维度非常高,会给后续模型训练带来巨大的计算压力。因此,需要对字节码词组进行筛选,过滤其中对样本分类帮助不大的部分。本文采用词频阈值的方法过滤分类能力较弱的特征,即先统计各字节码词组在整个样本集中出现的频率,然后去掉出现频率低于30%的词组,用剩下的词组组成字节码词组词典,并根据其描述各样本特征,得到字节码样本集的词频矩阵。

在获得字节码样本集词频矩阵后,本文采用 TF-IDF(Term Frequency-Inverse Document Frequency)算法对其进行词频分析,以获得各样本在样本集中的重要程度。TF-IDF的主要思想是:如果某个词或词组在一篇文档中出现的TF(Term Frequency,频率)高,且在其他文档中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。其中,TF指的是某个词或词组在某篇文档中出现的次数,IDF(Inverse Document Frequency,逆文档频率)则是词或词组“权重”的度量。如果某个词在多篇文档中TF低,但却频繁出现在某篇文档,则这个词IDF值越大。相对地,某个词越常见,IDF越低。将某个词的TF值和IDF值相乘即得到TF-IDF值。当这个值越大时,表明该词在文档中的重要性越大,越能代表该文档。

使用TF-IDF算法处理样本集词频矩阵,将获得能够反映各个样本重要程度的字节码特征矩阵。矩阵中的每一个列向量对应一个字节码样本。

对字节码样本的特征提取的流程图如图2所示。

图2 字节码特征提取流程

2.3 模型训练

完成对字节码样本集的特征提取后,即可将特征矩阵作为输入,将标注结果作为预期输出,使用分类器进行训练。

在分类器选择上,现有的WebShell检测模型一般采用传统的分类算法对样本进行训练,如线性回归、决策树、朴素贝叶斯分类器等。这些分类算法存在共同的缺点:难以对复杂的非线性关系进行拟合,同时泛化能力较弱,即难以甚至无法处理未知模式的样本。为解决这类问题,本文采用多层感知器(Multi-layer Perceptron,MLP)神经网络算法对样本进行学习。

MLP神经网络是一种前向结构的人工神经网络,使用反向传播算法进行训练。网络由输入层、隐藏层、输出层组成。其中,输入层用于接收输入数据;隐藏层可以有多层,用于对数据进行学习,并存储训练结果;输出层用于输出结果。每一层的节点全连接到下一层,除输入节点外,其他所有节点都将输入与自身权重因子w相乘,再加上偏置b,然后结果自身的非线性激活函数产生输出。各层采用的激活函数不同,如中间层节点使用Sigmoid函数作为激活函数:

输出层节点使用Softmax函数作为激活函数:

其中,xi表示来自前一层的输入,N表示前一层节点总数。

MLP是感知器的推广,克服了感知器不能对线性不可分数据进行识别的弱点。MLP在数学上被证明能对任意复杂度的非线性关系进行拟合,同时具备强大的泛化能力。由于上述优点,在引入MLP神经网络后,WebShell检测模型的检测性能将获得大幅提升。

本文构建的MLP神经网络共包含两层隐含层。第一隐含层包含5个节点,第二隐含层包含2个节点。使用L-BFGS算法调整各节点权值,网络结构如图3所示。

图3 MLP神经网络结构

2.4 样本检测

模型训练好后,即可用于对未知样本的检测。在将源码样本输入模型前,需要经过预处理步骤。即先对其进行字节码提取获得字节码样本,再进行词组切分获得词组集,最后利用模型输出的字节码词组词典对词组集进行过滤统计,形成对应与源码样本的字节码特征向量。将特征向量输入检测模型,根据其结果即可判断输入的未知样本是否为恶意。样本检测流程如图4所示。

图4 对未知样本的检测流程

3 实验结果及分析

本文通过实验对比的方式验证了所提方法的有效性。实验环境为:scikit-learn 0.19;训练样本集大小为6 000,其中3 000个WebShell负例样本来源于GitHub的WebShell收集项目,另外3 000个正例样本来源于PHPWind、PHPCMS等流行开源项目。

为了准确对比各类检测方法的性能,本文采用混淆矩阵作为量化评价标准。混淆矩阵主要使用三种指标度量检测方法的性能:召回率(Recall)、精度(Precision)及准确率(Accuracy)。其中,召回率表示测试集中正样本部分被正确预测的比例,精度表示预测结果为正的测试样本被正确预测的比例,准确率表示整个样本集中被预测正确的比例。

在验证各检测模型性能时,本文采用交叉验证(Cross-Validation)的方式。即将源码样本集分成若干子集,其中一部分作为训练集(Train Set)用于训练各检测模型,剩余部分作为验证集(Validation Set)用于对训练的结果模型进行性能验证。为减少实验测试过程中的测量误差,本文对所有测试模型都进行了10次交叉验证,并取各性能指标的平均值作为最后的性能结果。

表1对比了3种类型的WebShell检测模型:文本层面的基于朴素贝叶斯的检测模型、字节码层面的基于朴素贝叶斯的检测模型和字节码层面的基于MLP的检测模型。可见,同样是基于朴素贝叶斯的检测模型,当检测对象从源码(文本层面)换到编译结果(字节码层面)时,模型的检测准确率从0.797提升至0.834,表明在字节码层面进行检测的效果更好。另外,当采用神经网络分类算法MLP替换传统的朴素贝叶斯分类算法时,模型的准确率从0.834提升至0.944,精度从0.761提升至0.932,召回率从0.771提升至0.968,大幅提升了检测模型性能,表明基于神经网络的检测模型具有更好的拟合能力和更好的对未知样本的检测能力。

表1 各类WebShell检测模型性能对比

4 结 语

本文介绍了WebShell的危害及特点,详细分析了现有WebShell的检测方法,指出了存在的两个共性问题:通常在源码层面展开研究,导致容易受到代码注释、代码混淆等传统WebShell逃逸手段的影响;检测模型通常使用传统的分类器如线性回归、决策树、朴素贝叶斯等对样本进行学习,一方面限制了模型的检测准确度,另一方面导致模型难以处理未知类型的WebShell。为解决上述问题,本文提出了基于多层神经网络的WebShell检测方法。该方法在代码编译结果中提取特征,有效解决了传统WebShell逃逸手段的影响。此外,使用字节码序列作为样本特征,有效利用了代码的上下文关系,提高了模型的检测效率。本文方法还使用神经网络分类算法中的多层感知器(Multiply Layer Perception)算法对样本进行学习,有效提高了检测模型的泛化能力,即检测未知类型WebShell的能力更强。

下一步准备将检测范围从字节码扩展至数据,即结合指令和数据两方面的信息构建检测模型,以提高检测精度。

参考文献:

[1] 国家互联网应急中心.2016年中国互联网网络安全报告[EB/OL].(2017-05-27)[2018-01-12].http://www.cert.org.cn/publish/main/46/2017/201705271512289088 22757/20170527151228908822757_.html.National Internet Emergency Center.China Internet Network Security Report in 2016[EB/OL].(2017-05-27)[2018-01-12].http://www.cert.org.cn/publish/main/46/2 017/20170527151228908822757/20170527151228908 822757_.html.

[2] Hansen R J,Patterson M L.Guns and Butter:Towards Formal Axioms of Input Validation[J].Black Hat USA,2005(08):1-6.

[3] Wrench P M,Irwin B V W.Towards a PHP Webshell Taxonomy Using Deobfuscation-assisted Similarity Analysis[C].2015 Information Security for South Africa(ISSA),2015.

[4] 杜海章,方勇.PHP webshell实时动态检测[J].网络安全技术与应用,2014(12):120-121.DU Hai-zhang,FANG Yong.PHP Webshell Real-Time Dynamic Detection[J].Network Security Technology &Application,2014(12):120-121.

[5] 马艳发.基于WAF入侵检测和变异WebShell检测算法的Web安全研究[D].天津:天津理工大学,2016.MA Yan-fa.The Research on Web Security based on WAF Intrustion Detection and Variant WebShell Detection Algorithm[D].Tianjin:Tianjin University of Technology,2016.

[6] 石刘洋,方勇.基于Web日志的Webshell检测方法研究[J].信息安全研究,2016(01):66-73.SHI Liu-yang,FANG Yong.Webshell Detection Method Research Based on Web Log[J].Journal of Information Security Research,2016(01):66-73.

[7] Neohapsis.NeoPI[EB/OL].[2018-01-12].https://github.com/Neohapsis/NeoPI.

[8] 胡建康,徐震,马多贺等.基于决策树的Webshell检测方法研究[J].网络新媒体技术,2012(06):15-19.HU Jian-kang,XU Zhen,MA Duo-he,et al.Research of Webshell Detection Based on Decision Tree[J].Network New Media,2012(06):15-19.

[9] 叶飞,龚俭,杨望.基于支持向量机的Webshell黑盒检测[J].南京航空航天大学学报,2015(06):924-930.YE Fei,GONG Jian,YANG Wang.Black Box Detection of Webshell Based on Support Vector Machine[J].Journal of Nanjing University of Aeronautics &Astronautics,2015(06):924-930.

[10] Deng L Y,Lee D L,Chen Y H,et al.Lexical Analysis for the Webshell Attacks[C].2016 International Symposium on Computer,Consumer and Control(IS3C),2016.

[11] 易楠,方勇,黄诚等.基于语义分析的Webshell检测技术研究[J].信息安全研究,2017(02):145-150.YI Nan,FANG Yong,HUANG Cheng,et al.Semantics-Based Webshell Detection Method Research[J].Journal of Informaion Security Research,2017(02):145-150.

猜你喜欢
源码词组字节
面向数据可靠传输的高译码率带反馈的LT码
No.8 字节跳动将推出独立出口电商APP
国内一站式工程设备租赁平台众能联合完成C2、C3两轮融资
浅谈开源操作系统的历史
企业如何保护源码
No.10 “字节跳动手机”要来了?
轻量级分组密码Midori64的积分攻击
副词和副词词组
人类进入“泽它时代”