基于textCNN模型的Android恶意程序检测①

2021-01-22 05:41张雄冠邵培南
计算机系统应用 2021年1期
关键词:日志卷积动态

张雄冠,邵培南

(中国电子科技集团公司第三十二研究所,上海 201808)

近10年来,伴随着互联网技术的迅猛发展,以及智能移动终端的普及,传统的计算机软件也开始向基于智能终端的应用市场转移.根据360 互联网安全中心发布的《2019年手机安全状况报告》展示[1],2019年截获的新增Android 恶意程序样本约为180.9 万个,平均每天截获的新增恶意程序样本个数约为0.5 万个.观察新增样本的类型,还是以恶意扣费、资费消耗和隐私窃取这3 种类型为主.由此可见,Android 操作系统的安全形势依然刻不容缓,为了减少恶意程序对用户造成的损失,Android 恶意程序检测也就成为一个值得深入研究的课题.

目前,Android 恶意程序检测技术主要分成两种:基于签名的检测技术[2]和基于行为的检测技术.基于签名的检测技术实际上利用了模式匹配的思想,使用这种方法进行检测需要对比已知的恶意代码签名库,因此这种方法无法识别未知的恶意程序.而基于行为的检测技术因为不需要依赖签名的特性逐渐成为目前研究与应用的主流方法之一.基于行为的检测技术又可依据是否需要实际运行目标程序进一步分为静态行为分析方法和动态行为分析方法.

静态行为分析法是目前应用相对广泛的恶意代码检测方法.其优势在于可以直接利用反编译技术提取代码本身的特征,不必在指定检测环境下运行代码,从而能够在应用安装前完成分析.文献[3]就提出了一种组合静态行为分析方法,该方法使用API 调用、API时间序列及API 使用频率作为3 种静态特征,再结合C4.5、DNN、LSTM 三种模型进行训练,最后采用投票法确定测试样本的结果.尽管应用广泛,但静态行为分析法还是具有一定的局限性.随着互联网安全技术的提高,越来越多的Android 应用为了抵抗未知的反编译分析而采用了代码保护技术.与此同时,恶意程序也在不断地进化,比如采用代码混淆技术来隐藏和加密自身的恶意代码.面对这样的情况,使用静态行为分析技术的检测效率也是越来越低.

动态行为分析法则是要求在沙箱或隔离环境中安装并运行程序,这样做的目的是尽可能监控程序执行过程中所产生的行为,并判断是否存在恶意行为.这种方法不需要反编译目标程序,且不受代码混淆技术的影响,因此具有较高的检测效率.目前,动态行为分析法从原理上可以分为以下两类.

第1 类是基于污点跟踪技术[4]的分析方法,这类方法首先标记程序对资源数据的访问范围,然后依据程序对被标记的污点数据的使用情况来判断该程序的行为是否具有合法性.采用污点跟踪技术的检测方法可以有效地识别出恶意程序所产生的隐私泄露、数据篡改甚至漏洞利用等问题.文献[5]介绍了一个基于污点追踪技术的恶意软件数据流分析模型TaintART,该模型采用多级污点分析技术把污点标签存储在寄存器中,从而减少污染标签的存储量,可以改善传统污点分析效率较低的问题.尽管基于污点跟踪技术的检测方法能够更细粒度地分析恶意程序的行为属性,但是这种分析通常只能在Android 虚拟机层进行,因而无法检测恶意程序在其他层(例如Native 层)存在的恶意行为.

第2 类则是基于系统函数调用情况的分析方法,这类方法主要是通过检测程序对系统函数的调用行为来判断程序是否具有恶意性.恶意程序往往需要利用系统提供的函数接口来实现其恶意行为,因此这类方法可以通过分析程序的系统函数调用情况来识别恶意程序.文献[6]就介绍了一种监控目标软件对Android Native 层系统函数和框架层API 的调用情况的方法,然后通过分析函数的调用序列及调用函数所传递的参数来检测恶意软件.

随着机器学习技术的日渐成熟,将机器学习算法应用到Android 恶意代码检测中也逐渐成为了研究的主流趋势.文献[7]就提出了一种基于机器学习的动态监测框架用来监控软件行为,并通过实验分别对SVM、k近邻等多种机器学习算法进行了评价.文献[8]的研究则是采用随机输入和人工交互输入来提取Android系统调用,并使用两种特征选择方法来共同构建特征矩阵,最后使用RandomForest、RotationForest 及AdaBoost 三种机器学习模型分别进行实验.尽管目前机器学习在Android 恶意代码检测的应用中取得了较好的效果,但是其面对新增的、变种的恶意软件的检测能力依然有待提高.同时基于传统机器学习的方法往往需要手动工程来判断一个文件的行为是否具有恶意,但手动工程一般不仅时间消耗较长,而且需要人为确定特征、参数、变量等.

针对静态行为分析方法与基于污点跟踪技术的分析方法在Android 代码行为特征提取上的不足,以及传统机器学习方法在恶意程序检测中存在的问题,本文提出了一种在动态行为分析的基础上利用textCNN神经网络模型的Android 恶意程序检测方法.本方法的主要思路是首先采用多种触发机制相结合的行为诱导方法来触发Android 程序潜在的恶意行为;接着通过hook 技术挂钩关键函数接口,进而对程序的各种行为数据进行采集并构建行为日志;然后基于行为日志提取行为特征数据作为模型输入;最后使用textCNN神经网络对行为数据集进行训练、参数优化得到最终的分类模型,并通过实验与传统机器学习方法SVM、RandomForest 以及传统循环神经网络进行比较,证明了本方法具有较好的检测效果.

1 动态行为采集方法

任何Android 程序所产生的行为实际上都具有特定的行为模式,即这些行为可以分解为由原子行为组成的时间序列.而这些原子行为往往需要调用系统提供的函数接口来实现,因此可以采用基于系统函数调用的动态行为分析方法从程序对Android 框架层API和Native 层函数的调用情况中提取行为特征,再通过对比恶意程序的行为来判断程序的合法性.基于这个原理,本文提出了一种以监测系统函数调用为基础的动态行为采集方法,该方法主要包含两个模块:行为触发模块和行为采集模块.行为触发模块的作用是采用多种触发机制尽可能多地触发程序的行为,使得采集模块可以尽可能全面地采集到软件的所有行为数据.行为采集模块的作用是通过hook 技术来监控并记录程序对Android 系统函数的调用情况以形成行为日志.

1.1 行为触发模块

已知动态行为检测方法是在沙箱或隔离环境中运行程序,其中第一个关键的步骤就是要能够触发程序的行为.倘若无法触发恶意程序的全部行为,则后续的行为采集模块很可能就无法提取到有效的恶意行为数据,继而一定会影响检测模型最后的检测效率.因此,为了提高程序行为触发的覆盖率,首先需要明确的是被触发的行为所发生在Android 系统中的层面,主要包含以下3 类:(1)系统层面,当系统层面的事件(例如开机、连接网络等)执行后会立即触发恶意程序的恶意行为,比如当系统接入互联网后,恶意程序会开始传输系统中隐私数据.(2)Service 层面,许多恶意程序会将其恶意行为隐藏在后台服务中,这样就可以在用户未知的情况下执行操作.(3)UI 及Activity 层面,当用户对恶意程序的UI 进行操作时,往往就会触发恶意的Activity 活动.针对不同系统层面的行为需要采取不同的触发机制,具体的流程与框架如图1所示.

本模块通过使用Android 模拟器模拟各种系统事件发生的方式来触发程序系统层面的恶意行为.已知在Android 系统中,软件若要监听系统事件就必须在Manifest 文件中注册广播组件.因此本模块通过解析目标程序的Manifest 文件来获取已注册的广播组件信息,然后利用ADB 调试桥与telnet 远程控制命令在模拟器中模拟广播组件相对应的各种事件,从而触发程序系统层面相对应的行为.

图1 行为触发模块框架流程图

针对程序在Service 层面的恶意行为,本模块采用启动所有Service 事务的方式来触发潜在该层面的恶意行为.因为任何应用想要在Android 系统中使用Service 事务就必须在Manifest 的文件中注册Service组件,所以本模块通过解析目标程序的Manifest 文件来获取已注册的Service 组件,然后利用ADB 工具启动这些Service 事务,进而触发执行在这些Service 中的恶意行为.

针对UI 及Activity 层面的恶意行为,本模块所采用的方法相对复杂一些.首先,通过静态分析目标程序来获取软件中Activity 之间的跳转路径信息;接着,针对每一个Activity,在启动之后利用UI 获取部件提取当前Activity 的UI 层次信息;然后,本模块会利用系统自动化测试工具MonkeyRunner[9]针对这些UI 信息来模拟各种UI 事件触发程序的行为;当遍历完当前Activity 的所有UI 元素后,即可按照Activity 的跳转路径信息继续下一个Activity 的遍历.

1.2 行为采集模块

考虑到目前Android 平台的应用软件都会使用混淆、加壳技术来保护自身的程序代码,因此本模块采用了一种基于动态分析的多层次的行为数据提取方法以应对该问题.本模块所采用的方法主要以Android 逆向技术和Android 安全框架为理论基础,分别对Android的应用框架层和Native 层的程序行为进行采集.

针对Android 应用框架层的行为数据,本模块主要通过Android 注入技术以及Java hook 技术进行采集的.已知Android 系统一般采用虚拟机对应用层的软件程序进行隔离和管理,其中4.4 版本之前采用的是Dalvik 虚拟机,而4.4 版本之后采用的是Android Runtime.在Dalvik 虚拟机进行Hook 的原理是:首先将虚拟机里面的Java 方法的Method 标识字段改为nativeMethod;接着自己编写一个Native 方法,在这个Native 方法中,再自定义一个Java 方法,并在这个方法里调用了原方法;然后在调用前后分别通过注入技术插入钩子,从而可以记录原方法的调用情况了;最后把原Java 方法的nativeFunc 字段指向这个Native 方法.当原方法被调用时,首先会调用到自定义的Native 方法,在调用过程中,原函数的调用数据就被采集.对于Android Runtime 进行hook 的原理实际上是类似的,已知Java 层的每一个方法在Android Runtime 实现中都对应一个ArtMethod 结构体,只要把原方法的结构体内容通过注入方式替换为新的结构体内容,当然原方法被调用的时候,真正执行的就是注入的新方法的指令.为了兼容不同版本的Android 虚拟机,本模块采用了同时支持Dalvik 虚拟机和ART 虚拟机的Xposed[10]框架对Android 应用框架层API 进行hook 工作.

对于Android Native 层的行为数据,本模块则采用基于Inline hook[11]的动态注入技术进行采集.对比基于全局偏移表的hook 方法,Inline hook 的优势在于不会受到表的限制,能够修改重写内存中任意一处的指令,从而实现对系统函数的挂钩.Inline Hook 的实现原理是首先获得被hook 系统函数的入口地址,然后在入口地址处插入强制跳转指令,使进程跳转到特定函数中,在该函数中执行监听并记录程序的行为数据,从而就实现了对Android 底层接口函数调用情况的监测.

当目标程序的一系列操作行为被成功触发之后,各种操作行为必然依靠应用框架层或系统Native 层的函数接口来实现,此时行为采集模块就可以利用上述方法对函数接口的调用情况进行监测与记录,根据记录结果即可生成程序的行为日志.本实验所生成的行为日志的条目及相关含义如表1所示.

表1 目标程序行为日志条目说明

2 基于textCNN 的检测框架

卷积神经网络CNN 曾被广泛应用于计算机视觉领域,随着深度学习研究的不断深入,不少学者也开始使用CNN 模型来处理自然语言处理问题.textCNN[12]即是由Yoon Kim 提出的一种用于处理文本分类问题的卷积神经网络模型.textCNN 的主要思想是使用多个通道以及多个不同大小的卷积核,并通过一维卷积的方式提取词向量矩阵的特征,然后使用最大池化层从特征矩阵选出每个通道中的最大值,与其他通道的最大值进行拼接,组合成最终的特征向量,最后通过全连接层计算分类的概率.经过动态行为触发模块和采集模块后,程序的行为数据实际上转换为了文本数据,因此可以采用textCNN 模型来进行处理.

2.1 嵌入层预处理文本数据

对于文本类数据,首先需要将自然语言数值化,以方便后续处理.对于动态行为日志文本,其中每一行的函数调用记录代表一个动态行为,本文将每一行视为一个行为词汇,然后分别对每个词汇构建相应的词向量.将文本中的词汇表征成词向量最简单的方式就是采用one-hot 编码方法,但是这种方法也存在比较明显的缺点,比如生成的向量长度过大以及无法准确表达词汇之间的相似关系.而textCNN 模型提供一个隐藏的嵌入层,可以将one-hot 向量投影到低维空间里,在指定维度中编码语义特征.本文在嵌入层采用的向量表示方法为fastText[13].fastText 实际上是Word2Vec中跳字模型[14]的一种改进,使用子词嵌入的方法将构词信息引入到了模型中.

在fastText 中,往往使用子词集合来表示中心词,假设一个中心词w,将其长度在一定范围内的子词及特殊子词的并集记为Gw.已知fastText 中词典由所有词的子词集合的并集构成,假设w的子词y在词典中的向量表示为zy,则中心词的向量vw就表示成:

对比跳字模型,fastText 训练的词向量可以更加准确地描述动态行为词汇之间相关性.当在检测过程中即便遇到词典中未曾出现的行为词汇,fastText 模型也可以从与其结构类似的其他词汇中获得对该词汇更好的向量表示.

2.2 使用textCNN 对数据进行分类

textCNN 模型的核心结构是卷积神经网络,其基本结构包括输入层、卷积层、池化层、全连接层和输出层.卷积神经网络用于行为分类的模型结构图[15]如图2所示.

图2 textCNN 行为分类模型图

从图2中可以看到,在textCNN 模型的卷积层,卷积核的宽度与词向量的维度是一致的,表明模型在提取特征的时候,将行为词汇作为日志文本的最小粒度.在Android 动态行为日志中,往往恶意行为是由多个连续的动态行为词汇组成,因此可以通过设置卷积核的高度来提取日志中相邻行为词汇的关联性,不仅考虑了动态行为文本中的词义而且兼顾了词序以及上下文.图2中卷积核的高度分别设置为2、3、4,对应提取文本中的2-gram、3-gram、4-gram 特征.对比传统机器学习中的n-gram 模型,使用卷积核的优势在于,只考虑连续词汇的组成,不会使训练集词表爆炸式增长.

在卷积层中模型使用了不同大小的卷积核,卷积得到的feature maps 会具有不同的向量维度.因此在池化层中,可以使用1-max-pooling 方法通过提取每个feature map 中的最大值来表征该特征向量.池化层的主要作用是下采样,通过不断降低数据维度来减少网络中的参数和计算次数.最后模型将每个特征向量经过1-max-pooling 池化得到的值拼接起来,即为池化层最终的输出向量.

textCNN 模型最后一层为全连接层,池化层的输出结果在进入全连接层之前,需要进行Dropout 操作来避免过拟合.全连接层设置可以参照传统卷积神经网络,第1 层采用ReLU 作为激活函数,第2 层则使用Softmax 分类函数来进行分类.

3 实验分析

3.1 实验环境与数据

本文的实验环境与相关配置如表2所示.

表2 实验环境与配置

本文实验所需的Android 恶意软件样本均来自于VirusShare 网站[16],其中样本的数量为1500 个.同时,实验所需的1000 个正常样本均下载于Android 官方应用市场Google Play.对于1500 个恶意样本和1000个正常样本,分别使用其中的70%作为本文模型的训练样本,剩下的30%作为测试样本.

对于每一个样本,经过动态行为采集框架处理后会得到一个行为日志.原始的行为日志是json 数据格式,为了便于后面textCNN 模型的处理,实验需要通过Python 爬取日志中关键信息,将其转换为txt 文档表示.文档中的每一行即为一个行为API,每一行分为3 个部分,由空格分隔,每个部分的说明如表1所示.

3.2 实验评价指标

为了充分评估模型的性能,本文在验证模型训练结果的时候采用了k折交叉验证技术.在本实验中,k的取值设定为10,即将训练集划分为10 个规模相等且无交集的子集,在每次训练过程中依次选择1 个子集作为测试集,剩余9 个子集作为训练集,最终以10 次计算结果的平均值作为模型评价指标的最终结果.

本实验使用3 个通用的评价指标即准确率PPrecision、召回率PRecall以及F1值来对实验结果进评价.本实验采用的样本分类混淆矩阵如表3所示.

表3 样本分类结果混淆矩阵

表3中,TP表示实际为正常样本,被预测为正常样本的样本数目;FP表示实际为恶意样本,被预测为正常样本的样本数目;FN表示实际为正常样本,被预测为恶意样本的样本数目;TN表示实际为恶意样本,被预测为恶意样本的数目.实验评价指标的计算公式如下所示:

3.3 实验参数设置

由于实验结果在很大程度上会受到实验参数的影响,因此在实验中将会对模型的参数进行设置.首先实验将行为日志转换后的文本最大长度设置为400,超过长度的部分将直接进行截断操作.本实验使用fastText模型训练词向量时所设置的参数值如表4所示.

表4 fastText 模型训练参数设置

在textCNN 模型的训练过程中,本实验将卷积核的高度固定设置为3、4、5.对于其他参数,分别设置了几组对照实验,其中卷积核数量分别对比了64、128、256 三组值,Dropout 参数分别对比了0.3、0.4、0.5 三组值,激活函数对比了ReLU 和tanh 两种函数.通过对比上述几组参数值对实验结果的影响,最终确定模型的参数如表5所示.

表5 textCNN 模型训练参数设置

3.4 实验结果与分析

为了验证本文提出的对于Android 应用程序的动态行为采集框架的有效性,本文设置了3 组对照实验,分别采用不同的方法来提取Android 软件的行为特征.第1 组采用传统的静态行为分析法来提取程序的静态行为文本数据,实验中具体参考文献[3]提出的方法;第2 组采用基于污点跟踪技术的分析方法来提取程序的行为文本数据,实验中具体参考文献[5]中方法;第3 组就采用本文的基于系统函数调用的动态行为采集方法来提取实验数据.3 组实验均使用相同的Android样本数据集,然后将3 组实验得到的3 组文本数据集都经过fastText 模型预处理以及textCNN 模型进行训练,最后相同模型在不同数据集上的实验结果如表6所示.

表6 不同数据集实验结果对比

从表6中数据可以看出,本文提出的动态行为采集框架可以更有效的提取出Android 程序中行为特征.第一组数据集的检测准确率相对较低,原因在于现在的Android 应用程序都添加了代码混淆和代码保护壳等对抗反编译的措施,对比而言本文方法几乎没有受到这些措施的影响.第2 组与第3 组实验结果的对比证实了基于污点跟踪技术分析方法存在的局限性,即无法检测恶意程序在Android Native 层的恶意行为.

为了对比textCNN 模型与传统机器学习模型及传统深度学习模型在Android 恶意程序上的检测能力,本文设置了4 组对照实验,将textCNN 模型与SVM 模型、RandomForest 模型以及循环神经网络LSTM 模型进行了对比.SVM 与RandomForest 均是机器学习中比较成熟的分类模型,LSTM 也是一种可以高效处理文本问题的神经网络模型.对于SVM、RandomForest和LSTM 模型中使用的词向量,本实验均采用传统Word2Vec 模型预处理行为数据集来得到.不同模型在相同测试集上的实验结果对比如表7所示.

表7 不同模型实验结果对比

从表7中可以看出,对比SVM 与RandomForest这两种机器学习模型,textCNN 模型的准确率、召回率和F1值分别高出了6.73%、5.48%、6.08%和3.39%、5.04%、4.2%,同时LSTM 模型的实验结果较两种机器学习模型而言也有明显的提升.这说明采用神经网络模型较传统机器学习方法而言确实可以提高Android恶意程序的检测准确率.对比textCNN 与LSTM,可以看到在相同测试集上textCNN 模型的检测准确率还是有所提升的,虽然这种提升是有限的,但是应该考虑到textCNN 具有模型复杂度更小且训练速度更快的先天优势.图3展示的是4 种模型在相同数据集上损失函数值随迭代次数变化而变化的情况.从图中可以看出,textCNN 模型的损失值相对于其他3 种模型不仅下降速度较快,而且最终收敛到一个更低的稳定值.

综合两部分的实验结果可以表明本文提出的基于textCNN 模型的利用动态行为分析方法的Android 恶意程序检测模型是切实可行的方案,能够有效提升Android 恶意程序检测的准确性和有效性.

图3 不同模型损失值变化图

4 结论与展望

本文提出了基于textCNN 模型的Android 恶意程序检测方法.该方法实现了包含多种触发机制的行为触发系统,有效提高了程序动态行为的检测覆盖率;通过hook 技术动态采集程序系统函数接口和应用层API 的调用情况来生成动态行为日志;通过fastText 算法对行为日志进行词嵌入处理,将文本数据转换为词向量数据;使用textCNN 模型对程序的行为数据进行检测与分类.在实验环节,本文使用1500 个恶意样本和1000 个正常样本,分别对动态行为采集模块和基于textCNN 的检测模块设置了对照实验,实验结果证实了本文提出的这两个模块是切实可行的且能够有效提高Android 恶意软件检测的准确性.

在下一步工作中,针对动态行为采集模块,将研究更加智能的动态行为触发机制,以提高行为检测的覆盖率;针对动态行为检测与分类模块,将继续研究分类模型的优化问题,并尝试将捕捉行为词汇前后依赖关系的机制以及注意力机制引入到模型中,使模型能够更高效地检测Android 程序是否存在恶意性.

猜你喜欢
日志卷积动态
基于全卷积神经网络的猪背膘厚快速准确测定
国内动态
国内动态
基于图像处理与卷积神经网络的零件识别
国内动态
一名老党员的工作日志
一种基于卷积神经网络的地磁基准图构建方法
基于3D-Winograd的快速卷积算法设计及FPGA实现
读扶贫日志
动态