基于静态污点分析的安卓应用程序权限泄露漏洞检测方法与流程

文档序号:16000401发布日期:2018-11-20 19:22阅读:306来源:国知局

本发明属于网络与系统安全技术领域,涉及一种安卓应用程序权限泄露漏洞检测方法,具体涉及一种基于静态污点分析的安卓应用程序权限泄露漏洞检测方法,可用于安卓应用程序权限泄露漏洞的分析与研究。



背景技术:

移动互联网时代,基于安卓操作系统的应用程序在用户与社会的连接中起着重要的媒介作用。然而由于安卓系统安全机制不够完善,漏洞在安卓应用程序中普遍存在。安卓应用程序权限泄露漏洞是安卓漏洞中的一种,该漏洞导致恶意程序可以在不申请权限的情况下执行数据销毁、音频录制、信息发送等操作,给用户的隐私和财产造成安全威胁。因此,检测安卓应用程序权限泄露漏洞具有重要的意义。

现有的安卓应用程序权限泄露漏洞检测方法,根据检测过程中是否执行了被测应用程序,分为动态测试方法和静态分析方法。其中:

动态测试方法在真实的或者模拟的环境中运行被测应用程序,监控程序运行时的行为,根据给定的安全规则考察程序的安全属性。动态测试方法能够准确地检测出程序漏洞,但是存在检测检测覆盖面不足的问题。

静态分析方法不运行被测应用程序,而是扫描应用程序代码分析程序语义,验证代码是否满足安全规范。静态分析方法能够覆盖所有的被测应用程序代码路径,但是要加载整个应用程序到内存中分析,存在内存开销大和检测效率低的问题。

污点分析方法是一种广泛采用的漏洞分析方法,它的核心思想是追踪污染数据在程序中的流动。污点分析的起点称为污染源函数,终点称为陷入函数。污点分析方法检测污染源函数与陷入函数之间的程序路径。根据检测过程中是否执行了被测应用程序,污点分析方法分为静态污点分析和动态污点分析两种,动态污点分析是动态测试与污点分析相结合的方法,由于其存在检测覆盖面不足的问题,在进行安卓应用程序权限泄露漏洞检测时,主要采用的是静态污点分析。

静态污点分析是静态分析与污点分析相结合的方法,申请公布号为CN 106709356A,名称为“基于静态污点分析和符号执行的安卓应用漏洞挖掘方法”的发明专利申请,公布了一种基于静态污点分析和符号执行的安卓应用程序漏洞挖掘方法,该发明将用户指定的污染源函数和陷入函数配置到文件中,构建整个被测应用程序的过程间控制流图,在过程间控制流图上搜索用户配置的污染源函数,然后由用户手动筛选污染源函数,执行污点分析,最后使用符号执行方法对污点分析的结果进行验证。该发明由用户筛选污染源函数,提升了分析效率,同时采用符号执行对污点分析结果进行验证,减少了假阳性错误。但是存在的缺陷是由于构建整个程序的过程间控制流图进行检测,检测的程序规模过于庞大,检测过程还需要中断程序运行让用户选择污染源函数,其效率提升是很有限的,并且由于陷入函数是由用户指定,只能检测出部分权限泄露漏洞,其检测结果不全面。



技术实现要素:

本发明的目的在于针对上述技术存在的不足,提出一种安卓应用程序权限泄露漏洞检测方法,用于解决现有技术中存在的应用程序权限泄露漏洞检测的效率低和检测结果不全面的技术问题。

本发明的技术思路是:将从安卓系统源代码中提取的安卓敏感权限对应的每个应用程序编程接口作为陷入函数,并进一步配置污染源函数和陷入函数的配置文件;然后对待检测应用程序进行逆向工程,得到待检测应用程序的资源文件,解析资源文件获取存在权限泄露风险的应用程序组件;接着构建存在权限泄露风险的应用程序组件的静态污点分析的检测流程方法;对检测流程方法执行静态污点分析,获取待检测应用程序的权限泄露路径列表;最后输出被测应用程序的权限泄露漏洞的检测结果。

根据上述思路,实现本发明目的采取的技术方案包括如下步骤:

(1)获取污染源函数和陷入函数的配置文件SourceSink_File:

(1a)将用户配置的能够接收外界数据的每个安卓应用程序编程接口作为污染源函数,得到由多个污染源函数组成的污染源函数集合S0,同时将从安卓系统源代码中提取的安卓敏感权限对应的每个应用程序编程接口作为陷入函数,得到由多个陷入函数组成的陷入函数集合S1;

(1b)将污染源函数集合S0中的多个污染源函数和陷入函数集合S1中的多个陷入函数存储到SourceSink_File中,得到污染源函数和陷入函数的配置文件SourceSink_File;

(2)建立待检测安卓应用程序A的权限泄露路径列表TP_List;

(3)获取待检测安卓应用程序A中存在权限泄露风险的应用程序组件集合DC_Set:

(3a)对待检测安卓应用程序A进行逆向工程,得到A的程序源代码和AndroidManifest.xml文件;

(3b)对AndroidManifest.xml文件进行xml文件解析,并将解析得到的A中注册的所有安卓应用程序组件加入到集合C_Set中;

(3c)将C_Set中的公开组件加入到集合DC_Set中,得到待检测安卓应用程序A中存在权限泄露风险的应用程序组件集合DC_Set;

(4)构建静态污点分析的检测流程方法AndroidMain:

采用污点分析工具Fowdroid的虚拟主方法构建模块,构建从DC_Set中随机选取的一个应用程序组件的虚拟主方法,并将其作为该应用程序组件的静态污点分析的检测流程方法AndroidMain;

(5)给列表TP_List添加待检测安卓应用程序A的权限泄露路径:

(5a)采用java程序分析工具soot的控制流图构建功能,构建AndroidMain的控制流图,调用图构建功能,构建AndroidMain的调用图,并将构建的控制流图和调用图存储到运行java程序分析工具soot的设备的内存中;

(5b)采用java程序分析工具soot的过程间控制流图构建功能,通过控制流图和调用图构建静态污点分析的检测流程方法AndroidMain的过程间控制流图,并将过程间控制流图存储到运行java程序分析工具soot的设备的内存中;

(5c)在静态污点分析的检测流程方法AndroidMain的过程间控制流图中搜索配置文件SourceSink_File中存储的污染源函数,并将搜索到的污染源函数加入到污染源函数集合Source_Set中;

(5d)将污染源函数集合Source_Set中的污染源函数作为起始点,调用污点分析工具Fowdroid对AndroidMain的过程间控制流图进行污点分析,并将分析得到的存在污染的陷入函数加入到陷入函数集合Sink_Set中;

(5e)采用程序路径求解工具heros的路径求解功能,求解陷入函数集合Sink_Set中存在污染的陷入函数的路径,并将该路径添加到待检测安卓应用程序A的权限泄露路径列表TP_List中;

(6)判断步骤(3c)得到的DC_Set是否为空,若是,把步骤(5e)中的TP_List作为最终的待检测安卓应用程序A的权限泄露路径列表TP_List,并执行步骤(7),否则执行步骤(4);

(7)获取安卓应用程序A的权限泄露漏洞的检测结果:

判断最终的待检测安卓应用程序A的权限泄露路径列表TP_List是否为空,若是,则安卓应用程序A不存在权限泄露漏洞,否则,安卓应用程序A存在权限泄露漏洞,并输出TP_List中的安卓应用程序A的权限泄露路径。

本发明与现有技术相比,具有如下优点:

(1)本发明在构建静态污点分析的检测流程方法时将存在权限泄露风险的应用程序组件作为输入,并基于应用程序组件的静态污点分析的检测流程方法执行污点分析,而现有的方法将整个应用程序作为输入,基于整个应用程序的静态污点分析的检测流程方法执行污点分析,与现有技术相比,大幅削减了污点分析的规模,漏洞检测的效率更高。

(2)本发明在配置陷入函数时将从安卓系统源代码中提取的所有安卓敏感权限对应的每个应用程序编程接口作为陷入函数,而现有的技术由用户手动配置陷入函数,与现有的技术相比,配置的陷入函数更完整,漏洞检测的结果更全面。

附图说明

图1为本发明的实现流程图;

图2为本发明获取存在权限泄露风险的应用程序组件集合的实现流程图;

图3为本发明获取待检测安卓应用程序A的权限泄露路径的实现流程图。

具体实施方式

为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图和具体实施例,对本发明进行进一步的详细说明。

参照图1.本发明包括如下步骤:

步骤1)获取污染源函数和陷入函数的配置文件SourceSink_File:

1a)将用户指定的能够接收外界数据的每个安卓应用程序编程接口作为污染源函数,并将这些污染源函数写入到建立的文件source.txt中,本实例写入的污染源函数如下:<android.app.Activity:Intent getIntent()>、<android.content.Intent:android.os.Bundle getExtras()>、<android.content.Intent:String getStringExtra(String)>;

1b)从网络上的安卓开放源代码项目中获取安卓系统源代码,本实例采用安卓5.0系统的源代码,将系统源代码作为输入,运行安卓权限分析工具Pscout获取安卓系统所有权限对应的应用程序编程接口,并从获取的应用程序编程接口中过滤出安卓敏感权限对应的每个的应用程序编程接口作为陷入函数,将这些陷入函数写入到建立的文件sink.txt中;

所述的安卓敏感权限,是指安卓系统中级别为Dangerous、Signature或者SignatureOrSystem的权限。

所述的能够接收外界数据的安卓应用程序编程接口和安卓敏感权限对应的所有的应用程序编程接口,均采用函数签名表示,函数签名的形式为:包名+类名+返回值+函数+参数。

1c)将source.txt中的每个污染源函数都加上尾缀“->_SOURCE_”,将sink.txt中的每个陷入函数都加上尾缀“->_SINK_”,然后将source.txt中的污染源函数和sink.txt中的陷入函数都写入到建立的文件SourceSink_File中,得到污染源函数和陷入函数的配置文件SourceSink_File;

步骤2)建立待检测安卓应用程序A的权限泄露路径列表TP_List;

步骤3)获取待检测安卓应用程序A中存在权限泄露风险的应用程序组件集合DC_Set:

参照图2,本步骤的具体实现如下:

3a)采用安卓应用程序资源文件逆向工具ApkParser对待检测安卓应用程序A执行资源文件反编译,得到AndroidManifest.xml文件,解压缩待检测安卓应用程序A,得到classes.dex文件,采用安卓应用程序源代码逆向工具dex2jar对classes.dex文件执行源代码反编译,得到待检测安卓应用程序A的程序源代码;

3b)采用xml文件解析工具dom4j搜索AndroidManifest.xml中注册安卓应用程序组件的元素,并从搜索到的元素中提取出注册的安卓应用程序组件加入到建立的集合C_Set中;

3c)将C_Set中的公开组件加入到建立的组件集合DC_Set中,具体步骤为:

3c1)建立组件集合DC_Set;

3c2)从集合C_Set中选取安卓应用程序组件Cp,采用xml文件解析工具dom4j从AndroidManifest.xml中获取安卓应用程序组件Cp的属性,并依次进行如下判断:

若Cp设置了intent-filter属性,将Cp添加到集合DC_Set中,

若Cp设置了exported属性,且exported属性的值为true,将Cp添加到集合DC_Set中,

若Cp没有设置exported属性且待检测应用程序A的软件开发工具包版本小于17,将Cp添加到集合DC_Set中;

3c3)重复步骤3c2)直到C_Set中没有安卓应用程序组件,得到存在权限泄露风险的安卓应用程序组件集合DC_Set;

所述的C_Set中的公开组件,是指C_Set中暴露给外界的安卓应用程序组件,该组件满足的条件为:设置了intent-filter属性,当设置了exported属性,exported属性的值为true,当没有设置exported属性,该组件所在安卓应用程序的软件开发工具包的版本小于17。

步骤4)构建静态污点分析的检测流程方法AndroidMain:

从存在权限泄露风险的安卓应用程序组件集合DC_Set中随机选取一个应用程序组件,采用污点分析工具Flowdroid的虚拟主方法构建功能构建该应用程序组件的虚拟主方法,并将其作为静态污点分析的检测流程方法AndroidMain;

步骤5)给列表TP_List添加待检测安卓应用程序A的权限泄露路径:

参照图3,本步骤的具体实现如下:

5a)将静态污点分析的检测流程方法AndroidMain作为输入,运行java程序分析工具soot的中间表达形式生成功能,得到AndroidMain的中间表达形式,将中间表达形式作为输入,分别运行java程序分析工具soot的控制流图构建功能和调用图构建功能,依次得到AndroidMain的控制流图和AndroidMain的调用图,将控制流图和调用图都存储到运行java程序分析工具soot的设备的内存中;

所述的AndroidMain的控制流图,是指记录静态污点分析的检测流程方法AndroidMain中的语句执行关系的双向链表,双向链表由多个节点组成,每个节点由静态污点分析的检测流程方法AndroidMain中的语句、指向该语句前驱节点的指针和指向该语句后驱节点的指针组成。

所述AndroidMain的调用图,是指记录静态污点分析的检测流程方法AndroidMain中的方法调用关系的单向链表,该链表中的每个节点由静态污点分析的检测流程方法AndroidMain中的方法和指向该方法调用的方法的指针组成。

5b)将AndroidMain的控制流图和AndroidMain的调用图作为输入,运行java程序分析工具soot的过程间控制流图构建功能,得到AndroidMain的过程间控制流图,将过程间控制流图存储到运行java程序分析工具soot的设备的内存中;

所述AndroidMain的过程间控制流图,是指记录静态污点分析的检测流程方法AndroidMain执行顺序的数据结构,该数据结构既包含静态污点分析的检测流程方法AndroidMain中的方法之间的调用关系,又包含静态污点分析的检测流程方法AndroidMain中方法内的语句的执行顺序。

5c)遍历静态污点分析的检测流程方法AndroidMain的过程间控制流图中的节点,将节点中定义的与配置文件SourceSink_File中存储的污染源函数相同的函数加入到污染源函数集合Source_Set中;

5d)将污染源函数集合Source_Set中的污染源函数作为起始点,运行污点分析工具Fowdroid对AndroidMain的过程间控制流图进行污点分析,并将分析得到的存在污染的陷入函数加入到陷入函数集合Sink_Set中;

5e)采用程序路径求解工具heros的路径求解功能,求解陷入函数集合Sink_Set中存在污染的陷入函数的路径,并将该路径添加到待检测安卓应用程序A的权限泄露路径列表TP_List中;

步骤6)判断步骤(3c)得到的DC_Set是否为空,若是,把步骤(5e)中的TP_List作为最终的待检测安卓应用程序A的权限泄露路径列表TP_List,并执行步骤(7),否则执行步骤(4);

步骤7)获取安卓应用程序A的权限泄露漏洞的检测结果:

判断最终得到的列表TP_List是否为空,若是,则安卓应用程序A不存在权限泄露漏洞,否则,安卓应用程序A存在权限泄露漏洞,并输出TP_List中的安卓应用程序A的权限泄露路径。

本发明的效果可以通过以下实验进一步说明:

1、实验开发环境与工具

本发明所有实验在内存为32G,cpu核心数为12个的Redhat Linux系统上完成,整个方案原型系统的实现采用java语言,开发工具为Eclipse。

2、实验内容与结果

本实验采用从小米应用商场爬取的225个实际安卓应用程序测试本发明方案的安卓应用程序权限泄露漏洞检测效率,并与申请公布号为CN 106709356A的发明方案进行对比,表1展示了上述两种方案对部分测试样本的检测时间的对比信息,表2展示了两种测试方案对全部测试样本的平均检测时间的对比信息。

表1

表2

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