基于textCNN 模型的Android 恶意程序检测①
张雄冠,  邵培南
(中国电子科技集团公司第三十二研究所, 上海 201808)通讯作者: 张雄冠摘 要: 针对当前Android 恶意程序检测方法对未知应用程序检测能力不足的问题, 提出了一种基于textCNN 神经网络模型的Android 恶意程序检测方法. 该方法使用多种触发机制从不同层面上诱导激发程序潜在的恶意行为; 针对不同层面上的函数调用, 采用特定的hook 技术对程序行为进行采集; 针对采集到的行为日志, 使用fastText 算法来提取词向量; 最后使用textCNN 模型根据行为日志对Android 程序进行检测与识别. 实验结果表明, 该方法对
Android 恶意程序检测的平均准确率达到了93.3%, 验证了该方法对Android 恶意程序检测具有较高的有效性与正确性.
关键词: Android 系统; 恶意程序检测; 行为触发; hook 技术; fastText 模型; textCNN 模型
引用格式:  张雄冠,邵培南.基于textCNN 模型的Android 恶意程序检测.计算机系统应用,2021,30(1):114–121. /1003-3254/7722.html
Android Malware Detection Based on textCNN Model
ZHANG Xiong-Guan, SHAO Pei-Nan
(The 32nd Research Institute of China Electronics Technology Group Corporation, Shanghai 201808, China)
Abstract : Aiming at the problem that the current Android malware detection method has insufficient ability to detect unknown applications, this study proposes an Android malware detection method based on the textCNN neural network model. This method uses a variety of trigger mechanisms to induce the potential malicious behavior of the application from different levels. For function calls at different levels, the specific hook technology is used to collect the application behavior. For the collec
ted behavior logs, the fastText algorithm is used to extract word vectors. Finally, the textCNN model is used to detect and identify Android applications based on behavior logs. Experimental results show that the average accuracy of the method for detecting Android malicious applications reaches 93.3%, which verifies that the method has high effectiveness and correctness for detecting Android malwares.
Key words : Android system; malicious program detection; behavior trigger; hook technology; fastText model; textCNN model
近10年来, 伴随着互联网技术的迅猛发展, 以及智能移动终端的普及, 传统的计算机软件也开始向基于智能终端的应用市场转移. 根据360互联网安全中心发布的《2019年手机安全状况报告》展示[1], 2019年截获的新增Android 恶意程序样本约为180.9万个,
平均每天截获的新增恶意程序样本个数约为0.5万个.观察新增样本的类型, 还是以恶意扣费、资费消耗和隐私窃取这3种类型为主. 由此可见, Android 操作系统的安全形势依然刻不容缓, 为了减少恶意程序对用户造成的损失, Android 恶意程序检测也就成为一个值
计算机系统应用 ISSN 1003-3254, CODEN CSAOBN
E-mail: Computer Systems & Applications,2021,30(1):114−121 [doi: 10.15888/jki.csa.007722] ©中国科学院软件研究所版权所有.
Tel: +86-10-62661041
①  收稿时间: 2020-05-19; 修改时间: 2020-06-16; 采用时间: 2020-06-19; csa 在线出版时间: 2020-12-31
114
得深入研究的课题.
目前, 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以及传统循环神经网络进行比较, 证明了本方法具有较好的检测效果.
2021 年 第 30 卷 第 1 期计算机系统应用
115
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的遍历.android获取真正的签名
1.2  行为采集模块
考虑到目前Android平台的应用软件都会使用混淆、加壳技术来保护自身的程序代码, 因此本模块采用了一种基于动态分析的多层次的行为数据提取方法以应对该问题. 本模块所采用的方法主要以Android逆向技术和Android安全框架为理论基础, 分别对Android 的应用框架层和Native层的程序行为进行采集.
针对Android应用框架层的行为数据, 本模块主要通过Android注入技术以及Java hook技术进行采集的. 已知Android系统一般采用虚拟机对应用层的软件程序进行隔离和管理, 其中4.4版本之前采用的是Dalvik虚拟机, 而4.4版本之后采用的是Android Runtime. 在Dalvik虚拟机进行Hook的原理是: 首先
计算机系统应用2021 年 第 30 卷 第 1 期116
将虚拟机里面的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    目标程序行为日志条目说明
条目名称说明
Method Category被调用函数所属的类型
Method Name被调用函数的名称及所属包的包名
Arguments调用函数是传递的参数
2  基于textCNN的检测框架
卷积神经网络CNN曾被广泛应用于计算机视觉领域, 随着深度学习研究的不断深入, 不少学者也开始使用CNN模型来处理自然语言处理问题. textCNN[12]即是由Yoon Kim提出的一种用于处理文本分类问题的卷积神经网络模型. textCNN的主要思想是使用多个通道以及多个不同大小的卷积核, 并通过一维卷积的方式提取词向量矩阵的特征, 然后使用最大池化层从特征矩阵选出每个通道中的最大值, 与其他通道的最大值进行拼接, 组合成最终的特征向量, 最后通过全连接层计算分类的概率. 经过动态行为触发模块和采集模块后, 程序的行为数据实际上转换为了文本数据,因此可以采用textCNN模型来进行处理.
2.1  嵌入层预处理文本数据
对于文本类数据, 首先需要将自然语言数值化, 以方便后续处理. 对于动态行为日志文本, 其中每一行的函数调用记录代表一个动态行为, 本文将每一行视为一个行为词汇, 然后分别对每个词汇构建相应的词向量. 将文本中的词汇表征成词向量最简单的方式就是采用one-hot编码方法, 但是这种方法也存在比较
明显的缺点, 比如生成的向量长度过大以及无法准确表达词汇之间的相似关系. 而textCNN模型提供一个隐藏的嵌入层, 可以将one-hot向量投影到低维空间里, 在指定维度中编码语义特征. 本文在嵌入层采用的向量表示方法为fastText[13]. fastText实际上是Word2Vec 中跳字模型[14]的一种改进, 使用子词嵌入的方法将构词信息引入到了模型中.
z y
在fastText中, 往往使用子词集合来表示中心词,假设一个中心词w, 将其长度在一定范围内的子词及特殊子词的并集记为G w. 已知fastText中词典由所有词的子词集合的并集构成, 假设w的子词y在词典中的向量表示为, 则中心词的向量v w就表示成:
对比跳字模型, fastText训练的词向量可以更加准确地描述动态行为词汇之间相关性. 当在检测过程中即便遇到词典中未曾出现的行为词汇, fastText模型也可以从与其结构类似的其他词汇中获得对该词汇更好的向量表示.
2.2  使用textCNN对数据进行分类
textCNN模型的核心结构是卷积神经网络, 其基本结构包括输入层、卷积层、池化层、全连接层和输出层. 卷积神经网络用于行为分类的模型结构图[15]如图2所示.
2021 年 第 30 卷 第 1 期计算机系统应用
117
图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 6.0
APK分析框架MobSF v3.0.0
Android Hook框架Xposed v90-beta3
PC端操作系统Window 10
编程语言Python 3.6
深度学习框架PyTorch 1.4.0
本文实验所需的Android恶意软件样本均来自于VirusShare网站[16], 其中样本的数量为1500个. 同时,
实验所需的1000个正常样本均下载于Android官方应用市场Google Play. 对于1500个恶意样本和1000个正常样本, 分别使用其中的70%作为本文模型的训练样本, 剩下的30%作为测试样本.
计算机系统应用2021 年 第 30 卷 第 1 期118

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。