基于指令序列嵌入的安卓恶意应用检测框架

2022-08-08 01:35孙才俊王伟忠何能强王之宇孙天宁张奕鹏
信息安全研究 2022年8期
关键词:安卓指令代码

孙才俊 白 冰 王伟忠 何能强 王之宇 孙天宁 张奕鹏

1(之江实验室智能网络研究院 杭州 311121) 2(中国工业互联网研究院 北京 100102) 3(国家互联网应急中心浙江分中心 杭州 310052)

安卓是一款开源的操作系统,目前全球安卓活跃用户数已达20亿[1],它吸引大量使用者的同时也吸引了大量的恶意软件开发者.根据McAfee在2019年发布的移动安全报告[2],与2017年相比,2018年与安卓银行相关的恶意应用增加了77%.根据奇虎360在2020年2月发布的恶意软件报告[3],在2019年全年,360安全大脑拦截了9.5亿次恶意软件攻击.因此,学术界提出了一系列检测安卓恶意软件的方法[4-5],基本思路是从应用程序中提取1组描述其行为的特征,并利用提取的特征,采用适当的机器学习算法来识别恶意软件.

基于机器学习方法的安卓恶意软件检测通常依赖于训练样本数据集.在训练过程中,检测系统需要大量的样本特征才能在预测中达到良好的效果.但由于恶意软件及其变种数量众多,为减少研究人员的工作量,必须使用可扩展和自动化的特征提取方法[6],实现大规模的恶意样本识别.当前,普遍采用的特征提取方法有静态分析与动态分析2种,对应提取到的特征分别为静态特征与动态特征.静态特征如应用程序接口(API)调用、操作代码(opcode)序列、权限请求、控制流或数据流,通过应用静态特征发现应用可疑行为;动态特征通过在模拟器或物理机上运行指定的安卓样本进行提取,主要包含日志文件、网络流量、文件系统访问、安卓系统交互等运行时产生的行为特征[7-8].

通常,静态分析由于其高速处理能力,适合处理大规模样本.然而,当遇到使用复杂混淆技术(如加密、加壳)的应用程序时,静态分析方法可能会失去其有效性,因为这些样本的源代码是加密和隐藏的.因此,研究人员通常采用动态分析方法处理这些样本.动态分析方法可以绕过源代码分析,直接在运行时分析测试样本的行为.然而,动态分析的执行通常基于固定的自动化测试脚本,其测试覆盖范围不如静态分析方法全面.此外,在某些情况下,测试工具可能无法触发恶意行为,例如,缺少必要的系统事件或交互操作.此外,动态分析需要运行测试样本来执行特征提取,这一过程非常耗时,需要大规模硬件设备作为支撑[9].

传统安卓恶意应用检测方法是从样本中采集大量原始特征,然后训练分类模型(包括常见的机器学习算法与神经网络).然而这些方法忽略了恶意应用代码自身所携带的语义信息,因此在准确率方面还有待提高.鉴于此,Christodorescu等人[10]在2005年提出基于语义感知的恶意应用检测方法,用于检测Windows恶意应用.随着Word2vec,Doc2vec等一系列自然语言分析工具的出现,越来越多的研究人员将相关技术应用到恶意应用的检测中,他们对样本的原始特征进行2次挖掘,采用分布式表征(distributed representation)[11]的方式表征恶意应用特征语义,从而对恶意性进行分析.Raghav等人[12]从安卓应用的manifest文件与dex文件提取语义特征,用于应用的恶意性判断.根据类似的研究思路,本文从安卓样本的源代码提取opcode指令序列,然后从指令序列中提取语义摘要进行分析.

本文方法提出的假设是代码指令如同自然语言中的词汇,代码指令不仅包含丰富的语义,并且严格遵循编程语法.如果将自然语言处理中的嵌入(embedding)方法借鉴过来,就可以计算出每个指令的嵌入向量,并且可以在高维空间中比较不同指令之间的相似性.进一步,利用段落嵌入(paragraph embedding)算法,得出不同代码片段的低维特征向量表示方法,比较不同代码片段之间的空间距离,从而得出代码行为相似性.基于上述假设,本文提出一种基于指令序列嵌入的算法,用于发现代码指令之间存在的隐藏结构.本文方法基于静态分析手段,无需运行应用程序提取特征,计算开销低.特别地,本文对比多种机器学习算法,分析不同特征维度对恶意应用识别系统的影响,并使用超参数优化算法训练出最优分类模型,以有效、高效的方式判断样本是否具有恶意.

本文的主要贡献概括如下:

1) 使用指令序列嵌入方法检测安卓恶意应用.指令序列嵌入方法借鉴自然语言处理中的嵌入原理,对代码指令序列进行嵌入,提取代码中丰富的语义表达.

2) 使用average pooling算法计算样本代码的语义摘要.该摘要以向量形式表征样本代码行为,因而可以从数值角度反映样本代码行为语义.

3) 通过大量实验证明了指令序列嵌入方法的有效性.在检测恶意样本过程中,本文方法的F1得分达到0.952.

1 相关研究

1.1 基于代码特征的检测方法

Arp等人[9]提出一种轻量级的安卓恶意应用检测框架Drebin.Drebin对安卓应用进行静态分析,从dex文件和manifest文件中收集特征,如使用权限、API调用以及组件调用意图,用于构建特征向量,最后采用支持向量机作为分类模型.李剑等人[13]提出一种基于权限分析的安卓恶意应用检测方法,该方法从AndroidManifest.xml文件中提取权限特征,并使用特征选择算法优化特征,最终在多个机器学习算法上展开实验,取得了良好效果.王柯林等人[14]提出一种可对抗混淆的安卓恶意应用检测方法,该方法选用高危权限、敏感API、Service、Activity、Intent、短信发送频率等作为特征,然后选择多个机器学习分类模型对混淆数据集进行测试,最终证明该方法可有效对抗混淆技术.Li等人[15]使用高风险API和高风险权限作为特征,通过分析,最终收集了237个重要特征,并且利用深度学习算法取得良好的识别效果.陈泽峰等人[16]提出一种基于多维特征协作的轻量级安卓恶意应用检测方法,该方法使用多级别的不同分类模型实现对未知样本的快速、精确检测,文中使用的特征包括应用申请权限、运行时权限,操作码序列等,用于机器学习模型的训练.

1.2 基于语义特征的检测方法

Raghav等人[12]提出一种基于文档向量的安卓恶意应用检测方法.该研究分别从classes.dex和AndroidManifest.xml文件中提取头部32000个字节作为样本特征,之后使用PV-BoW算法生成这2个文件的文档向量,最后使用机器学习与深度学习算法对应用恶意性进行判断.Kakisim等人[17]提出一种基于连续操作码嵌入的Windows恶意应用检测方法.该方法将连续的opcode以图的形式进行表达,通过随机游走算法选择权重相对较高的一批opcode序列,将这批opcode序列进行嵌入,接着选择固定个数的向量作为样本特征,最后使用深度学习算法对样本进行恶意性判断.Alam等人[18]提出一种基于自然语言处理的安卓恶意应用模式检测方法,将安卓应用程序代码中的控制流类比于自然语言中的词汇,多个控制流组成自然语言中的1个句子,基于这种思想使用Doc2vec将样本转成向量形式,最后通过构建相似度模型来判断应用恶意性.

2 预备知识

2.1 Word2vec模型

Word2vec[19]是一种经典的词向量生成模型.词嵌入(word embedding)是将自然语言中的符号转换成数值形式的过程.词向量则是词嵌入之后输出的数值表达,词向量模型基于自然语言中的1个概念,即1个词的含义可以从其上下文语义环境推断得出.Word2vec实现了词的分布式表征表示方法,该方法训练出的词向量维度更低,信息密度更高,相比于传统的one-hot编码方式,该方法在语义提炼与信息保留方面都有较大的提升.Word2vec在训练过程中,利用词的上下文词汇信息,使得训练出的嵌入模型语义信息更加丰富.Word2vec包含以下2个重要模型:

2.1.1 CBOW模型

CBOW模型使用中心词汇前后的词汇来预测中心词,即模型的输入为中心词汇上下文对应的词向量,输出则是中心词汇的词向量.CBOW模型设置1个滑动窗口,每次滑动时选择中心词汇作为输出,滑动窗口内其他词汇则是该中心词汇的上下文,用作模型训练时的输入.经过多次迭代训练之后,模型中的隐含层就成了单词的词向量.

2.1.2 Skip-gram模型

Skip-gram与CBOW恰好相反,它是利用中心词来预测上下文词汇.Skip-gram同CBOW模型一样,也有滑动窗口概念,不同的是不是每次都预测1个单词,而是使用其中1个单词来预测滑动窗口内的其他单词.在效率上,Skip-gram相较CBOW要低,但是对于出现频率不高的单词,其输出更为准确.

图1 ISEDroid工作流程

2.2 Doc2vec模型

Doc2vec[20]是Mikolov等人[21]基于Word2vec模型提出的一种扩展模型,用于训练段落向量(paragraph vector).该模型用于训练一个能够使用向量来表示不同文档的嵌入模型,解决了Word2vec模型在生成句向量时语序丢失的问题[21].和Word2vec类似,Doc2vec也包含2种训练方式,分别为分布记忆段落向量和分布词袋版本段落向量.

2.2.1 分布记忆段落向量模型

分布记忆段落向量模型(distributed memory model of paragraph vector, PV-DM)训练句向量的方法和Word2vec的CBOW词向量训练方法类似.在CBOW的基础上,PV-DM加入段落向量的概念,每个段落向量对应训练集的1段文本,段落向量可以认为是1个词向量,可以看作是句子的主题.每次训练时句子的主题都作为输入的一部分来训练.如此,可以同时训练词向量与句向量.

2.2.2 分布词袋版本段落向量模型

分布词袋版本段落向量模型(distributed bag of words version model of paragraph vector, PV-DBOW)和Word2vec的Skip-gram训练方法类似.Skip-gram使用滑动窗口内的中间词来预测上下文词汇,PV-DBOW则是用段落向量来预测文本中任意词汇的向量,其训练过程为:设置1个滑动窗口,从段落中采样该窗口的1段文字,再从这个窗口中随机选择1个词汇作为输出,输入则是段落向量,然后不断迭代训练模型.

3 系统设计

3.1 系统总览

本节详细给出基于指令序列嵌入的安卓恶意应用检测方法的实现过程,将实现后的框架命名为ISEDroid(ISE, instruction sequence embedding).图1为ISEDroid的工作流程图,ISEdroid主要通过静态代码分析方法对恶意应用进行识别.对每个样本通过apktool获得dex文件后,ISEDroid使用baksmali反编译dex文件获得Smali代码;从Smali代码中提取出所有Java方法的Dalvik操作码序列;接着将提取到的操作码序列转换成句向量;然后通过average pooling的方式从每个样本的句向量获得样本的代码行为摘要;最后将代码行为摘要用于机器学习模型的训练和预测.

3.2 Smali特征提取

Smali是安卓Dalvik字节码反编译之后的汇编程序,可以通过baksmali等反编译工具转换生成.一个反编译后的Smali文件代表Java语言中的1个类,准确说为1个.class文件.每个Java类中的方法都由若干行字节码指令序列组成,并且字节码指令序列由Dalvik操作码和操作数构成.同类恶意应用的运行时行为存在较大相似性,这意味着类似逻辑的指令序列也存在较大的相似性,但由于2次开发或者重打包等原因,指令行的操作数存在较大差异.因此,本文在提取Smali指令序列时,只保留opcode.按照词嵌入模型的做法,可以将每行的opcode作为1个单词,1个Java方法内的指令序列组成1段语句,该语句可以通过段落嵌入模型生成1段句向量,用于表示该代码片段的语义.本文采用Smali解析工具,从每个样本的Smali文件提取出所有的opcode序列,作为原始的样本特征,用于后续指令嵌入步骤中使用.

3.3 指令序列嵌入

在进行指令序列嵌入之前,首先需要构建语料库,即从所有的样本opcode序列中找出所有非重复序列.构建过程如式(1)所示:

(1)

其中,N为用于生成语料库的样本总数,si为第i个样本所有的opcode序列.

当语料库Dcorpus构建完毕之后,使用Doc2vec模型进行段落嵌入模型构建.最后,采用average pooling算法处理样本代码片段的嵌入向量,实现过程如式(2)所示:

(2)

其中,Ω为1个样本中提取的所有代码片段向量,vi为该样本第i个代码片段向量,输出结果V为样本代码行为的语义摘要,作为后续分类模型的输入.

3.4 超参数优化

在机器学习模型的应用中存在2类参数,分别为模型参数与模型超参数.模型参数是模型内部的变量,可以通过模型训练达到最优;而模型超参数为模型外部参数,需要人工指定.在模型训练前对超参数进行优化极为重要,这是由于合适的超参数对模型的性能影响较大.模型的超参数优化是机器学习技术应用中的一个难点.模型的超参数优化是通过评估算法从多组候选超参数中选择1组最佳超参数的过程,虽然超参数的数量有限,但由于其取值的范围较大,将产生大量组合,对计算效率而言将是一大挑战.

传统的调参方式有Grid search和Random search.Grid search通过全空间扫描的方式进行搜索,搜索过程极为耗时,效率低下;而Random search则是从候选集中随机抽选进行评估,特点是速度快,但容易陷入局部最优.为了解决上述难题,本文使用启发式超参数搜索框架Hyperopt.Hyperopt使用贝叶斯优化算法来调整参数,可在参数空间上进行串行和并行搜索,该方法迭代次数少且收敛速度快.表1所示为ISEDroid所采用的机器学习算法的超参数.在超参数搜索过程中,使用K折交叉验证方法选择最佳超参数,将K折交叉验证结果的均值作为模型表现的评估手段,从而对不同模型进行对比.使用K折交叉验证方法,在一定程度上能够消除输出结果产生的偶然性.

表1 ISEDroid所采用的机器学习算法的超参数

续表1

4 实验评估

本节对ISEDroid的性能进行系统评估,ISEDroid的实验工作在服务器上完成.该服务器的CPU型号为Intel®Xeon®Gold 6230R,拥有2个处理器、104个CPU核心,基准时钟频率为2.1 GHz,内存大小为503 GB,操作系统为Ubuntu 18.04 LST.本实验使用的Python库有:hyperopt,版本0.2.7,为超参数优化的模型库;scikit-learn,版本0.24.2,为多种常见机器学习模型的官方库;lightgbm,版本3.3.2,为LightGBMClassifier模型的官方库;xgboost,版本1.4.2,为XGBoostClassifier模型的官方库;gensim,版本4.1.2,为Doc2vec模型的官方库.

4.1 数据集

本文将从Google Play上获得的1 462个有效安卓应用程序作为良性应用,标记为Sg.为了从这些应用程序中排除潜在的恶意应用,本文将每个应用程序发送给VirusTotal.VirusTotal囊括了70个以上的反病毒检测引擎,当且仅当所有防病毒扫描程序未检测到可疑行为时,该应用程序才被标记为良性.对于恶意应用程序,本文采用了Malgenome项目[22]提供的样本集,该安卓恶意应用样本集由1 259个有效恶意应用程序组成,标记为Sm.为了方便后面的实验,本文将上述2 721个样本分成Strain和Stest,Strain包含1 314个良性样本与1 133个恶意样本,占总样本数的90%;Stest包含148个良性样本与126个恶意样本,占总样本数的10%.

4.2 分类模型选择与优化

本节通过实验的方式详细给出了ISEDroid执行过程,并且通过特征提取、模型选择以及超参数优化等一系列方法,训练出1个最优的恶意应用分类模型.在本实验中,分别从样本集Strain和Stest中提取Smali代码片段,执行提取特征操作.提取后的代码片段长度分布如图2所示:

图2 样本内Smali片段数以及代码序列中指令数分布

本文使用式(1)在训练集Strain上提取数据集语料库,然后使用Doc2vec对语料库进行数据集的构建,Doc2vec使用的训练模型为gensim默认选项,即PV-DM.训练出对应的句向量生成模型.接着,对每个样本代码片段的句向量使用式(2)求均值,得出该样本代码行为的语义摘要.将样本转化成向量形式,用于构建特征矩阵,本文将此特征矩阵命名为数据集Dtrain.

图3 模型超参数优化迭代时损失函数收敛过程

当获得优化后的超参数之后,本文将该最优模型放到训练集Dtrain上进行训练,以获得最终的分类模型.为对比各个模型最终表现,本文使用测试集Dtest作为验证数据集.对Dtest进行预测时采用F1分数作为评估指标,结果如表2所示.表2示出不同机器学习算法在不同语义摘要向量维数的测试集上的F1分数.可以看出,Graident Boosting,LightGBM以及XGBoost均达到0.952的F1分数.鉴于特征维度越高,计算用时越长,因此选用XGBoost作为最优分类器,数据集采用的特征维数为150.

表2 基于不同特征维数的Dtest的模型评估结果

4.3 同类研究对比

为了进一步验证ISEDroid的有效性,本文将ISEDroid与Raghav等人[12]、李剑等人[13]的方案进行对比.采用数据集Dtrain作为训练集,选用AUC(area under curve)作为表现评估指标,将Dtest作为测试集.本实验中,ISEDroid选择模型XGBoost,特征维数为150;Raghav等人采用的分类模型为常规CNN网络,李剑等人采用的分类模型为随机森林.实验结果如图4所示,可以看出,ISEDroid的AUC得分明显优于Raghav等人的方案,略优于李剑等人的方案.

图4 本文方案与其他2种方案的对比结果

5 总 结

针对现有安卓恶意应用日益增多的问题,本文提出一种轻量化的基于指令序列嵌入的安卓恶意应用检测框架ISEDroid.该框架利用自然语言处理中的嵌入模型提取代码中丰富的语义表达,通过average pooling算法得出样本代码行为的语义摘要.通过基于贝叶斯算法的超参数优化框架优化不同模型.通过实验,本文选择XGBoost作为最优模型,并取得了0.952的F1分数.在与同类研究对比实验中,ISEDroid也取得了不错的表现.ISEDroid为安卓恶意应用检测提供了有价值的研究方向.

猜你喜欢
安卓指令代码
iPhone不卡的秘密曝光:安卓也能享受
《单一形状固定循环指令G90车外圆仿真》教案设计
文物表情包
新机研制中总装装配指令策划研究
安卓系统或成智能汽车标配
关于ARM+FPGA组建PLC高速指令控制器的研究
神秘的代码
一周机构净增(减)仓股前20名
一行代码玩完19亿元卫星
近期连续上涨7天以上的股