基于卷积神经网络的恶意APK的筛查方法与流程

文档序号:19589303发布日期:2020-01-03 10:03阅读:438来源:国知局
基于卷积神经网络的恶意APK的筛查方法与流程

本发明属于软件信息安全技术领域,涉及安卓软件筛查和保护,尤其涉及一种基于卷积神经网络的恶意apk(安卓安装包)的筛查方法。



背景技术:

apk是使用安卓手机安装软件时候下载的安装包。随着移动设备的流行,来自安卓软件的攻击也越来越多,恶意apk的筛查日趋重要。当前的恶意apk筛查方法通常依赖于大量人工特征的提取,具有消耗大量分析提取时间、耗费较高的人力代价等缺点。运用深度神经网络对恶意apk进行自动筛查能够有效解决上述问题。

appcontext属于apk的静态特征分析,基本思想是,一个app是不是恶意的,在很大程度上可以通过他调用安全敏感函数时的依赖路经上的context信息(即上下文信息,主要为调用到这个ssm的条件信息)看出来。下面分别解释一下安全敏感函数和依赖路经上context信息的具体含义。

当用soot等工具反编译apk时,可以得到整个apk的callgraph。如图3中的partofcallgraph,callgraph上表示有每个函数的名字和它们的调用关系。

安全敏感函数(securitysensitivemethods,简称ssm)是人为定义的一系列有可能实现恶意目的或者影响用户手机安全的函数。这些函数包括需要申请权限的函数,java的映射函数,从数据源读取数据的函数,写入数据的函数等。

关于安全敏感函数,有三点需要特别说明一下。第一点是安全敏感函数只是人为定义的,可能会威胁到安全,或者说可以作为判断一个app是不是恶意app的参考信息的怀疑对象,并不是拥有很多安全敏感函数,就意味着这个app是恶意的。第二点是:如图4,安全敏感函数相当于在callgraph上标出了一些点,并且这些点是叶子节点,即没有边连出。第三点是callgraph的点是非常多的,规模从几百到上万不等,这样的规模非常难以处理。图4是callgraph上的安全敏感函数示例图。

以下说明依赖路径上的context信息的获取过程。appcontext文献(yangw,xiaox,andowb,etal.appcontext:differentiatingmaliciousandbenignmobileappbehaviorsusingcontext[c]//softwareengineering(icse),2015ieee/acm37thieeeinternationalconferenceon.ieee,2015,1:303-313.)记载的算法主要分为五步:

第一步,标出一些安全敏感函数。

第二步,定位调用这些安全敏感函数的路径和引发事件。比如安全敏感函数是sendmessage(),那么向上追踪,沿着函数的调用路径向上找,找到引发的事件。引发的事件可以是用户的操作,系统硬件的信号等等。然后记录下这个引发的事件和安全敏感函数的对应,即<activationevents,securitysensitivemethods>。

第三步,得到reducedinter-procedurecontrol-flowgraph(ricfg)。首先,对于第二步得到的每一个<activationevents,securitysensitivemethods>,也就是一个安全敏感函数的调用路径,都求出它的reducedinter-procedurecontrol-flowgraph(ricfg)。如图5所示,ricfg是包括了所有从这个引发事件到安全敏感函数所有路径的inter-procedurecontrol-flowgraph(icfg)的子图。

接下来,人为地抽取出了特征向量,再送入svm分类。而人为抽取特征这个缺点是现有检测恶意apk方法的通病。

第四步,通过ricfg和dataflow得到路径上的context信息。注意到,ricfg上面是有if条件判断语句的,这些语句影响了程序的调用路径。比如图中是在时间是晚上23点之后或者早上5点之前才调用下一个函数,然后最后调用到sendtextmessage,那么这个条件判断语句中,变量的值是哪里来的,就很关键。因为这个值的大小影响了程序会不会调用到待分析的安全敏感函数。所以要找出ricf的所有条件控制语句中影响程序执行的变量,然后通过dataflow找到他们的数据来源。如图6所示提取context信息,有一个条件控制语句是if(current–last>43200000),那么通过dataflow向上寻找,发现是调用system.currenttimemillis()和db.query(“lastconnecttime”)得到的,那么对应的环境因素就是systemtime和database。需要说的是,这一步是非常消耗时间的。appcontext论文中将每个app的分析时间上限定成了80分钟,而且只分析了835个apk。

这样就得到了每个ricfg上对应的环境因素,再加上这个ricfg对应的安全敏感函数,权限信息,引发事件等,就得到了表1中的一行信息。注意一个app是有很多安全敏感函数的,而安全敏感函数也可能有多条引发事件,所以一个app对应的最后的路径信息行数可以有很多的。表1是appcontext特征向量表。

表1.appcontext特征向量表

*f3=calendar,f4=systemtime,f5=database

第五步,用svm分类器进行分类。经过前四个步骤,得到了如表1的appcontext特征向量表。接下来用svm分类器来进行分类。但是svm分类器需要每行信息都有自己的label,而实际上原始数据只有每个apk的label,所以需要人工通过标注得到的每一个调用路径上的信息是恶意的还是良好的,即给每一行加一个label,再用svm进行分类。人工标注的方法是,理解这个调用路径的目的是什么,程序时为何调用到这个安全敏感函数的,然后结合大家公认的恶意apk的标准(比如会在用户不知情的情况下扣费等),来自己判断,这个路径上对安全敏感函数的调用是不是恶意的。appcontext文献中,人工标注的工作量是非常巨大而繁琐的,是一个非常费时间,费人力的工作。

综上所述,现有方法的缺点主要有:

第一,需要人工标记大量的数据。这样不仅消耗时间,消耗人力,还使它无法处理大的数据集,这也是他们只分析了835个apk的原因之一。并且消耗人力的同时,还有可能出现标错的情况,非常影响模型的准确率。

第二,解析apk的时间过长。尤其是提取ricfg和dataflow时间。

第三,没有使用apk的原始数据,有过度的人为特征提取,这必然损失掉一些信息。比如虽然appcontext充分考虑了每条路径的信息,但是路径间的关系被忽略了。如果一个函数先调用了一个安全敏感函数,又调用了另一个,他们不在对方路径的调用条件里,那么appcontext是无法找出这两者的关系并加以分析的。此外,人工特征抽取会导致分析时间长,降低准确率,模型不具有普适性等问题。



技术实现要素:

为了克服上述现有技术的不足,本发明提供一种基于卷积神经网络的恶意apk的筛查方法,能够解决现有检测恶意apk方法的依赖人工特征抽取而导致分析时间长、降低准确率、模型不具有普适性等问题。

为方便说明,本发明约定以下缩略语和关键术语定义:

函数调用关系图(callgraph):apk反编译后得到的表示函数间调用关系的有向图。图上的每一个节点是一个函数。有向边表示函数间的调用。

安全敏感函数(securitysensitivemethods,简称ssm):人为定义的一系列有可能实现恶意目的或者影响用户手机安全的函数。这些函数包括需要申请权限的函数,java的映射函数,从数据源读取数据的函数,写入数据的函数等。

svm(supportvectormachine,支持向量机):机器学习的算法,用于分类。

pooling(池化算法):一个简单粗暴的算法,在深度神经网络里面非常常见。如图2,pooling可以将同样维数的一系列向量,提取成一个这个维数的向量。提取时是在这一系列向量中,取对应维数的最大值(maxpooling),最小值(minpooling),平均值(averagepooling),求和(sumpooling)等。pooling常用于卷积层之后,在最后的隐藏层和输出层之前。

本发明的原理是:为了提取出callgraph上的信息,我们希望在callgraph上进行卷积。但是整个callgraph过于庞大,目前的计算资源无法处理。为了解决这个问题,我们提出了针对安全敏感函数进行卷积和基于高频率函数进行卷积的解决方案。其中,在建立深度卷积神经网络模型过程中,考虑到安全敏感函数相当于在callgraph上标出了一些点,并且这些点是叶子节点,即没有边连出。这对于模型设计很重要,因为这意味着不需要考虑安全敏感函数内部的信息与接下来的调用信息,也就是说可以把安全敏感函数当做“词”来求取“词向量”。由于callgraph的点是非常多的,规模从几百到上万不等,这样的规模非常难以处理。所以选取出来一些重要的安全敏感函数是非常有必要的。本发明在小数据集上统计了安全敏感函数占所有函数的比例,普遍在3%到4%之间。这非常好地缩小了数据规模,使得深度神经网络完全能够处理。深度卷积神经网络模型的基本思想是:局部提取一个函数调用的若干安全敏感函数的信息,调用可以分为直接调用和间接调用。直接调用就是这个网络直接调用了安全敏感函数,间接调用就是这个函数调用了其他函数,然后其他函数又调用了安全敏感函数,或者其他函数调用的函数调用了安全敏感函数,依次类推。考虑到网络的复杂性和先验知识,我们只考虑这个函数直接调用的安全敏感函数,以及这个函数调用的函数调用的安全敏感函数。即我们以这个函数为中心,向下深搜两层,然后卷积这个范围里的安全敏感函数。基于apkcallgraph的深度卷积神经网络模型,利用卷积提取局部信息的特点,将一个函数调用的若干安全敏感函数结合起来,提取出这个函数的综合调用信息,进而判断这个函数是不是恶意的。

安全敏感函数可以高效地缩小数据的输入规模,但是仍然用了一些先验知识,即安全敏感函数列表是由经验而来的,人为规定的。为了彻底抛弃一切先验知识,达到让程序完全自动地发掘apk信息的目的,我们又提出了针对高频率函数的卷积模型。针对高频率函数的卷积模型和针对安全敏感函数的卷积模型的结构是一样的,不同的是在卷积时针对高频率出现函数。

本发明提供的技术方案是:

一种基于卷积神经网络的恶意安卓安装包apk的筛查方法,应用深度卷积神经网络对apk建模,使用apk原始数据作为输入,采用apk的callgraph,根据安全敏感函数或者高频率调用(出现)函数的调用,设计相应的深度卷积神经网络进行特征自动抽取,由此检测apk是否恶意;本发明方法可减少人为提取特征的环节,从而减少分析时间,提高普适性,增加准确率;包括模型训练过程和用训练好的模型进行apk检测过程;具体包括如下步骤:

(一)模型训练过程,具体包括如下步骤:

1)针对apk训练数据集,反编译apk,解析出callgraph;

解析出apk的callgraph上的每个节点对应一个函数;

2)根据安全敏感函数或高频率函数进行卷积;

针对apk的callgraph上的部分节点进行卷积;针对部分节点为安全敏感函数或高频率函数;基于一个函数和它调用的函数进行卷积,得到卷积结果为一个向量;具体包括如下步骤:

21)选取apk的callgraph上的节点,所述节点对应的函数为安全敏感函数或高频率函数;

22)针对选取的函数节点进行卷积,采用的卷积公式如式1:

其中,p代表此时卷积的节点,为正在卷积的函数;x1,i为节点p直接调用的第i个函数节点,wconv1为对其卷积的参数。x2,i为节点p间接调用的第i个函数节点,wconv2为对其卷积的参数;n1为p直接调用的函数节点的个数;n2为节点p间接调用的函数个数;

23)通过卷积提取得到卷积结果为一个向量,该向量为节点p调用的多个函数的信息;

3)将结果传入pooling层

将卷积结果传入深度卷积神经网络模型的pooling层,将相同维数的一系列向量,提取成和该维数相同的一个向量;

4)接入卷积神经网络模型的隐藏层和输出层;

5)根据输出结果和应该得到的正确结果,计算误差,并反向传播,更新网络参数;

本发明在具体实施中,在训练的过程中不断用交叉验证集测试,注意用交叉验证集测试的时候,只预测结果,不更新参数。不断训练以及调整模型参数设定,使得模型在交叉验证集上达到最高准确率。此时最后用测试集来测试模型,得到的准确率才为模型准确率。

(二)用训练好的模型进行apk检测过程,具体包括如下步骤:

1)对待检测apk数据,反编译apk,解析出callgraph

2)利用训练好的模型,根据安全敏感函数或高频率函数进行卷积

3)将结果传入训练好的模型的pooling层

4)接入训练好的模型的隐藏层和输出层;

5)得到结果,即是不是恶意apk。

与现有技术相比,本发明的有益效果是:

本发明技术方案首次应用深度神经网络来对apk建模,检测恶意apk的工作。本发明所建立模型的特点在于使用apk原始数据作为输入,在callgraph图上进行卷积,自动提取特征。具体地,模型使用apk原始数据作为输入,以apk的callgraph为基础,根据安全敏感函数或高频率函数的调用设计相应的卷积神经网络进行特征自动抽取,减少了人为提取特征的环节。根据高频率函数卷积的方法在减少人为特征提取上更彻底,因为不需要任何先验知识,不需要人为定义的安全敏感函数。由于减少了人为提取特征的环节,所以本发明方法具有减少分析时间、提高普适性、增加准确率等优点。

附图说明

图1是本发明提供的筛查方法的流程框图。

图2是池化算法pooling过程的示意图;

其中,箭头左面是pooling前的很多个向量;箭头右面是pooling后的一个向量。

图3是appcontext文献中部分callgraph图(partofacallgraph)结构的示意图。

图4是apk解析后的callgraph图及其上的安全敏感函数示例图;

其中,callgraph图中每个点都是一个函数;其上的节点s表示安全敏感函数。

图5是appcontext文献中得到ricfg的示例图。

图6是appcontext文献中提取context信息的示例图。

图7是本发明实施例对一个函数节点进行卷积的示意图;

其中,中间的节点1表示现在要卷积的函数节点;节点2表示节点1直接调用的安全敏感函数的节点;节点3表示节点1函数调用的函数调用(间接调用)的安全敏感函数;节点1和节点3卷积之后的节点用节点4表示;节点5表示普通的函数节点,普通的函数节点的名字是不固定的,无法求取向量表示。

图8是本发明方法采用的改进的深度卷积神经网络模型的示意图。

具体实施方式

下面结合附图,通过实施例进一步描述本发明,但不以任何方式限制本发明的范围。

本发明提供一种基于卷积神经网络的恶意安卓安装包apk的筛查方法,应用深度神经网络来对apk建模,实现对apk检测。具体地,本发明所建立模型使用apk原始数据作为输入,以apk的callgraph为基础,根据安全敏感函数的调用设计相应的卷积神经网络进行特征自动抽取,减少了人为提取特征的环节,从而减少分析时间,提高普适性,增加准确率。

本发明所建立模型是基于apkcallgraph的深度卷积神经网络模型,利用卷积提取局部信息的特点,将一个函数调用的若干安全敏感函数结合起来,提取出这个函数的综合调用信息,进而判断这个函数是不是恶意的。

callgraph上的点非常多,可以几百到上万,如果在上万个节点的图上来做卷积,如论从时间消耗还是模型效果来说都是很不理想的。但是,安全敏感函数基本只占总函数个数的3%到4%,因此我们基于一个函数和它调用的安全敏感函数做卷积,相对可行得多。把这些安全敏感函数当做自然语言中的词汇,训练得到相应的向量表示。针对深度卷积神经网络模型进行改进包括如下过程:

本发明中,深度卷积神经网络模型的基本思想是局部提取一个函数调用的若干安全敏感函数(或高频率函数)的信息,调用可以分为直接调用和间接调用。直接调用就是这个网络直接调用了安全敏感函数或高频率函数,间接调用就是这个函数调用了其他函数,然后其他函数又调用了函数,或者其他函数调用的函数调用了函数,依次类推。考虑到网络的复杂性和先验知识,我们只考虑这个函数直接调用的安全敏感函数或高频率函数,以及这个函数调用的函数调用的安全敏感函数或高频率函数。即我们以这个函数为中心,向下深搜两层,然后卷积这个范围里的安全敏感函数或高频率函数。

本发明实施例采用的数据集是drebin的部分数据集(arpd,spreitzenbarthm,hubnerm,etal.drebin:effectiveandexplainabledetectionofandroidmalwareinyourpocket[c]//ndss.2014)。我们在drebin的部分数据集上,把整个apk的callgraph整体的安全敏感函数信息,输入简单神经网络(输入层-隐藏层-输出层);再采用本发明提出的卷积神经网络模型。实验证明我们的卷积神经网络模型准确率更高。具体做法是:

良性数据集采用从googleplay上爬取的apk,恶意数据集采用部分drebin数据集。

整个数据集(包括良性和恶意)分成训练集、交叉验证集、测试集。首先用训练集训练网络,更新参数,网络训练方法具体包括如下步骤:

1)反编译apk,解析出callgraph

解析出apk的callgraph上的每个节点对应一个函数;

2)根据安全敏感函数或高频率函数进行卷积;

针对apk的callgraph上的部分节点进行卷积;针对部分节点为安全敏感函数或高频率函数;基于一个函数和它调用的函数进行卷积,得到卷积结果为一个向量;具体包括如下步骤:

21)选取apk的callgraph上的节点,所述节点对应的函数为安全敏感函数或高频率函数;

22)针对选取的函数节点进行卷积;

23)通过卷积提取得到卷积结果为一个向量,该向量为节点p调用的多个函数的信息;

3)将结果传入pooling层

将卷积结果传入深度卷积神经网络模型的pooling层,将相同维数的一系列向量,提取成和该维数相同的一个向量;

4)接入卷积神经网络模型的隐藏层和输出层;

5)根据输出结果和应该得到的正确结果,计算误差,并反向传播,更新网络参数;

之后在训练的过程中不断用交叉验证集测试,注意用交叉验证集测试的时候,只预测结果,不更新参数。不断训练以及调整模型参数设定,使得模型在交叉验证集上达到最高准确率。此时最后用测试集来测试模型,得到的准确率才为模型准确率。

采用训练好的模型进行apk检测,对待检测apk,按照上述步骤1)~步骤4)检测过程进行检测,得到检测结果,即是不是恶意apk。

图7是对一个函数节点进行卷积的示意图。如图7所示,中间的节点1就是我们现在要卷积的函数节点。节点2表示此节点直接调用的函数。节点3表示此函数调用的函数调用的函数。他们卷积之后的节点用节点4表示。另外,节点5表示普通的函数节点,他们的名字是不固定的,我们无法求取他们的向量表示进行分析,因此在这里我们不考虑这些普通的函数节点。这里的函数指的是安全敏感函数或高频率函数。

卷积过程中,此函数直接调用的函数采用同样的卷积参数,间接调用的函数采用另一组卷积参数。采用的卷积公式如式1:

其中,p代表此时卷积的节点,即图7中的节点1。x1,i为节点p直接调用的第i个安全敏感函数节点,wconv1为对其卷积的参数。x2,i为节点p间接调用的第i个安全敏感函数节点,wconv2为对其卷积的参数。n1为p直接调用的安全敏感函数节点的个数,在图7中为1,n2为节点p间接调用的安全敏感函数个数,在图7中为2。

通过这个卷积窗口,我们提取出节点p调用的若干安全敏感函数的信息,将这些信息结合起来,来判断apk的恶意性。

整个模型的示意图如图8。从apk分析到callgraph的时间代价很小,平均一个apk要32秒左右,在callgraph上滑动卷积窗口的时间代价比较大,可以通过相应的算法改进。在apk的callgraph上对相应的安全敏感函数节点进行卷积之后,连入pooling层,之后连入隐藏层,最后连入输出层,这就是整个模型的网络连接结构。

卷积是一个滑动窗口在callgraph上滑动一遍。当滑到每一个节点的时候对它进行卷积。而滑动的顺序可以直接滑动也可以根据安全敏感函数或者高频率函数深搜,时间代价会不同。本方法选择了深搜加上调用soot函数的方法,soot是一个解析apk的工具,本发明用来反编译apk,解析出callgraph。这个方法相比于于直接深搜或者遍历节点的方法,时间上更快。

上述深度神经网络对apk的分析采用的是安全敏感函数,但深度神经网络对apk的分析并不局限于安全敏感函数或高频率函数。目前我们忽略了除了安全敏感函数或高频率函数以外的其他函数的信息,因为他们的名字是不固定的,无法求取向量表示。实际上,我们可以进一步地考虑所有函数的名称、参数、调用关系等信息,使用自动编码机等其他手段来处理,为函数进行编码,得到函数的表示向量。因此,可以采用不同方法获取函数向量表示。

本实施例采用了sumpooling和maxpooling方式。两种pooling方式中,sumpooling将很多个向量变成一个向量按维加和;maxpooling则按维取最大。其中,sumpooling效果更好,说明应该将apk的各个部分的局部敏感信息联合起来,考虑他们的关系,将他们合在一起,作为整个apk的安全敏感特征,用sumpooling替代maxpooling,这样处理后,本发明方法的效果更佳。

需要注意的是,公布实施例的目的在于帮助进一步理解本发明,但是本领域的技术人员可以理解:在不脱离本发明及所附权利要求的精神和范围内,各种替换和修改都是可能的。因此,本发明不应局限于实施例所公开的内容,本发明要求保护的范围以权利要求书界定的范围为准。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1