首页> 中国专利> 基于静态分析的安卓应用敏感路径触发方法

基于静态分析的安卓应用敏感路径触发方法

摘要

本发明公开了一种基于静态分析的安卓应用敏感路径触发方法,包括构建待测安卓应用的组件转换关系图和函数调用关系图;获取敏感路径集;依次自动触发敏感路径集中的每条敏感路径并验证各条敏感路径正确性。本发明提出了一种基于静态分析的Android应用敏感路径的自动化触发方法,该方法通过构建Android应用组件转换关系图、组件内及组件间函数调用关系,形成从根组件到敏感API组件的执行路径,通过自动化触发验证敏感路径的正确性,因此本发明方法能够有效提取并自动化触发待测Android应用的敏感路径,具有较高的检测敏感信息泄露的准确性,可靠性高。

著录项

  • 公开/公告号CN109948338A

    专利类型发明专利

  • 公开/公告日2019-06-28

    原文格式PDF

  • 申请/专利权人 中南大学;

    申请/专利号CN201910208397.6

  • 发明设计人 宋虹;朱双;王伟平;林丹丹;

    申请日2019-03-19

  • 分类号

  • 代理机构长沙永星专利商标事务所(普通合伙);

  • 代理人周咏

  • 地址 410083 湖南省长沙市岳麓区麓山南路932号

  • 入库时间 2024-02-19 11:37:04

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2020-03-17

    授权

    授权

  • 2019-07-23

    实质审查的生效 IPC(主分类):G06F21/56 申请日:20190319

    实质审查的生效

  • 2019-06-28

    公开

    公开

说明书

技术领域

本发明具体涉及一种基于静态分析的安卓应用敏感路径触发方法。

背景技术

随着移动智能设备的广发普及,安卓(Android)系统已经成为了现今世界上最广泛使用的移动智能操作系统。而随着移动终端设备的快速发展,带动着大量Android应用的不断开发与版本更新,Android应用安全问题逐渐成为备受关注的焦点,例如获取应用的权限信息、检测入侵的恶意行为、追踪用户隐私数据泄漏的敏感路径等方面。

目前分析Android应用安全问题主要有三种方法:静态分析、动态分析以及混合分析。静态分析是指在没有执行任何代码的情况下,通过逆向工程技术反编译获取应用的字节码以及中间代码,从而检测Android应用。静态分析包含控制流分析与数据流分析两种方式,其中控制流分析的目的是为了探索函数调用关系表示的逻辑关联信息,其次采用数据流分析可以探究Android组件间的通信关系,获取数据流传递的可执行路径序列;但是静态分析对于敏感路径的检测可能存在一定的误报、漏报的情况,无法动态运行Android应用,验证敏感路径的实际触发结果。动态分析不同于静态分析,是指动态执行Android应用并捕获运行时的行为,从而检测待测Android应用中是否存在敏感路径。动态分析包括动态污点分析以及Fuzzing测试等技术,其中动态污点追踪技术需要修改底层的Android源码,通过代码插桩的方式监测敏感数据的传播情况,此外Fuzzing测试技术需要生成大量的随机数据作为测试的输入,观测运行时的Android应用是否存在敏感行为;然而动态分析在未知敏感路径的情况下,欠缺高效的自动化触发机制来完备地检测敏感路径以及恶意行为,可能会遗漏对某些敏感路径的检测。混合分析技术结合静态分析与动态分析的特点,使用前者进行分析可执行的路径信息后者进行动态遍历,或者提取前者和后者的各自的特征进行联合分析,尽管弥补了静态分析与动态分析各自的不足之处,提高了测试系统的稳定性与健壮性,但是现有的混合分析技术对敏感路径的检测只是单条检测,效率低下,而且检测效果也相对并不理想。

发明内容

本发明的目的在于提供一种能够自动验证待测Android应用中可能造成用户隐私数据泄漏的敏感路径的正确性而且可靠性高的基于静态分析的安卓应用敏感路径触发方法。

本发明提供的这种基于静态分析的安卓应用敏感路径触发方法,包括如下步骤:

采用数据流分析,构建待测安卓应用的组件转换关系图的步骤;

采用控制流分析,构建待测安卓应用的函数调用关系图的步骤;

根据构建的待测安卓应用的组件转换关系图和函数调用关系图,获取敏感路径集的步骤;

依次自动触发敏感路径集中的每条敏感路径并验证各条敏感路径正确性的步骤。

所述的采用数据流分析,构建待测安卓应用的组件转换关系图,具体为采用如下步骤构建组件转换关系图:

A.对追踪的入口Source和出口Sink进行定义:

追踪的入口Source定义为待测Android应用中控件的findViewById();出口Sink定义为Android应用中控件的事件监听器函数和启动组件的方法;

B.对待测Android应用的组件转换关系图描述进行定义:

定义组件转换关系图表示形式为G={V,E},其中V表示组件的集合,E表示组件间的关系;同时定义三元组{Comp1,widget_method,Comp2},表示组件Comp1通过控件widget的事件处理方法widget_method跳转到组件Comp2;

C.将待测Android应用反编译成jimple代码,设置追踪的入口Source和出口Sink,并利用污点追踪技术获得每条追踪的入口Source到出口Sink的路径上组件之间的调用关系,形成组件转换关系图。

步骤A所述的Android应用中控件的事件监听器函数,具体包括setOnClickListener、setOnItemClickListener、onDateChangedListener、setOnKeyListener和setOnCheckedChangeListener、setOnltemSelectedListener、onOptionsltemSelected。

步骤A所述的Android应用中控件的启动组件的方法,具体包括startActivity、sendBroadcast、contentResolver和startActivityForResult、startService/bindService。

步骤C所述的追踪的入口Source到出口Sink的路径上组件之间的调用关系,具体包括组件名、组件的intent信息和intent filter信息、组件内的方法名等信息。

所述的采用控制流分析,构建待测安卓应用的函数调用关系图的步骤,具体为采用如下步骤构建函数调用关系图:

a.将待测Android应用变成smali代码,并获得其中所包含的组件及其执行的方法信息;

b.分析invoke函数,获得组件的函数跳转关系;

c.将组件中所执行到的方法名、调用该方法的函数列表以及该方法调用的函数列表分别存入到method_name、in_list和sd_list中,并从sd_list中取出系统框架层函数存入到API_list中,从而形成四元组{method_name,in_list,sd_list,API_list};其中,method_name表示函数的名称,in_list表示调用该函数的函数集合、sd_list表示该函数内所调用的自定义函数集合。

步骤a所述的将待测Android应用变成smali代码,具体为采用反编译工具将待测Android应用变成smali代码。

步骤b所述的组件的函数跳转关系,具体包括组件的方法名、调用该方法的函数列表和该方法调用的函数列表。

所述的获取敏感路径集,具体为采用如下步骤获取敏感路径集:

(1)根据现有敏感API函数列表,提取出函数调用关系图中的敏感API函数API_list,与API_list中每个敏感API函数所属的组件名一起存入到敏感API集sensitive_API中;

(2)取出敏感sensitive_API中一个敏感API函数所属的组件名,查找Android应用组件转换关系图,获得调用该组件的组件名和控件事件处理方法widget_method,再根据查出的组件名,查找出上一级调用的组件名和控件事件处理方法,直到获得从根组件到达敏感API函数的组件转换路径,存入到敏感路径集sensitive_Path中;

(3)循环步骤(2),直到敏感API集中的所有元素都处理完成为止。

步骤(1)所述的现有敏感API函数列表,具体为如下所述的敏感API函数列表:

1)用户敏感API:

手机标识信息:

敏感API名称:getDeviceId();对应的敏感行为描述为:获取IMEI号;

敏感API名称:getLine1Number();对应的敏感行为描述为:获取手机号码;

敏感API名称:getLocation();对应的敏感行为描述为:获取当前位置;

地理位置信息:

敏感API名称:getLatitude();对应的敏感行为描述为:获取经度;

敏感API名称:getLongitude();对应的敏感行为描述为:获取纬度;

敏感API名称:getNetworkType();对应的敏感行为描述为:获取网络状态;

网络状态信息:

敏感API名称:ActiveNetworkInfo();对应的敏感行为描述为:获取连接网络类型;

敏感API名称:openConnection();对应的敏感行为描述为:打开URL连接;

短信信息:

敏感API名称:sendSMS();对应的敏感行为描述为:发送短信;

敏感API名称:SmsManager->getDefault();对应的敏感行为描述为:获取SmsManager的默认实例;

2)系统敏感API:

组件间通信:

敏感API名称:BroadcastReceiver();对应的敏感行为描述为:广播监听;

敏感API名称:startActivity();对应的敏感行为描述为:启动Activity;

敏感API名称:startService();对应的敏感行为描述为:启动服务;

运行时加载:

敏感API名称:getRuntime();对应的敏感行为描述为:获取进程运行时环境;

敏感API名称:Calendar->getInstance();对应的敏感行为描述为:获取Calender实例。

所述的依次自动触发敏感路径集中的每条敏感路径并验证各条敏感路径正确性,具体为将待测Android应用进行自动化安装启动,并根据其包名和入口组件,依次触发sensitive_Path中每条从入口组件到敏感API函数组件的路径,并进行判断:若执行成功,则表明该敏感路径存在且正确;若执行失败,则表明该敏感路径不正确或误报。

所述的将待测Android应用进行自动化安装启动,具体为将待测Android应用在开源自动化测试框架Appium中自动化安装启动。

本发明提供的这种基于静态分析的安卓应用敏感路径触发方法,提出了一种基于静态分析的Android应用敏感路径自动化触发方法,该方法通过构建Android应用组件转换关系图、组件内及组件间函数调用关系,形成从根组件到敏感API组件的执行路径,通过自动化触发验证敏感路径的正确性,因此本发明方法能够有效提取并自动化触发待测Android应用的敏感路径,具有较高的检测敏感信息泄露的准确性,可靠性高。

附图说明

图1为本发明方法的方法流程示意图。

图2为本发明实施例的org.uc.netspeed反编译后的NetStart组件的jimple代码图。

图3为本发明实施例的org.uc.netspeed反编译后得到的各个数据表信息图。

图4为本发明实施例的org.uc.netspeed反编译后的NetStart组件的smali代码图。

图5为本发明实施例的org.uc.netspeed的NetStart组件的onCreate函数的函数调用关系图。

图6为本发明实施例的org.uc.netspeed的组件转换关系图。

具体实施方式

如图1所示为本发明方法的方法流程示意图:本发明提供的这种基于静态分析的安卓应用敏感路径触发方法,包括如下步骤:

采用数据流分析,构建待测安卓应用的组件转换关系图的步骤;具体为采用如下步骤构建组件转换关系图:

A.对追踪的入口Source和出口Sink进行定义:

追踪的入口Source定义为待测Android应用中控件的findViewById;出口Sink定义为Android应用中控件的事件监听器函数和启动组件的方法;

Android应用中控件的事件监听器函数,具体包括setOnClickListener、setOnItemClickListener、onDateChangedListener、setOnKeyListener、setOnCheckedChangeListener、setOnltemSelectedListener和onOptionsltemSelected;

Android应用中控件的启动组件的方法,具体包括startActivity、sendBroadcast、contentResolver、startActivityForResult和startService/bindService;

B.对待测Android应用的组件转换关系图描述进行定义:

定义组件转换关系图表示形式为G={V,E},其中V表示组件的集合,E表示组件间的关系;同时定义三元组{Comp1,widget_method,Comp2},表示组件Comp1通过控件widget的事件处理方法widget_method跳转到组件Comp2;

C.将待测Android应用反编译成jimple代码,设置追踪的入口Source和出口Sink,并利用污点追踪技术获得每条追踪的入口Source到出口Sink的路径上组件之间的调用关系(具体包括组件名、组件的intent信息和intent filter信息、组件内的方法名等信息),形成组件转换关系图;

采用控制流分析,构建待测安卓应用的函数调用关系图的步骤;具体为采用如下步骤构建函数调用关系图:

a.将待测Android应用变成smali代码(比如采用反编译工具),并获得其中所包含的组件及其执行的方法信息;

b.分析invoke函数,获得组件的函数跳转关系(具体包括组件的方法名、调用该方法的函数列表和该方法调用的函数列表);

c.将组件中所执行到的方法名、调用该方法的函数列表以及该方法调用的函数列表分别存入到method_name、in_list和sd_list中,并从sd_list中取出系统框架层函数存入到API_list中,从而形成四元组{method_name,in_list,sd_list,API_list};其中,method_name表示函数的名称,in_list表示调用该函数的函数集合、sd_list表示该函数内所调用的自定义函数集合;

根据构建的待测安卓应用的组件转换关系图和函数调用关系图,获取敏感路径集的步骤;具体为采用如下步骤获取敏感路径集:

(1)根据现有敏感API函数列表,提取出函数调用关系图中的敏感API函数,与敏感API函数所属的组件名一起存入到敏感API集sensitive_API中;

所述的现有敏感API函数列表,具体如下表1所示:

表1现有的敏感API函数列表

(2)取出敏感sensitive_API中一个敏感API函数所属的组件名,查找Android应用组件转换关系图,获得调用该组件的组件名和控件事件处理方法widget_method,再根据查出的组件名,查找出上一级调用的组件名和控件事件处理方法,直到获得从根组件到达敏感API函数的组件转换路径,存入到敏感路径集sensitive_Path中;

(3)循环步骤(2),直到敏感API集中的所有元素都处理完成为止;

依次自动触发敏感路径集中的每条敏感路径并验证各条敏感路径正确性的步骤;具体为将待测Android应用进行自动化安装启动(比如将待测Android应用在开源自动化测试框架Appium中自动化安装启动),并根据其包名和入口组件,依次触发sensitive_Path中每条从入口组件到敏感API函数组件的路径,并进行判断:若执行成功,则表明该敏感路径存在且正确;若执行失败,则表明该敏感路径不正确或误报。

以下结合几个实施例对本发明方法进行说明:

实施例1:

结合一个从Android市场应用中随机选取的样例org.uc.netspeed,来说明基于静态分析的Android应用敏感路径自动化触发方法的执行过程。具体步骤如下:

S1:数据流分析构建待测Android应用的组件转换关系图,具体地包括如下步骤:

(1)定义追踪的入口Source和出口Sink;

(2)定义待测Android应用的组件转换关系图描述;

(3)将待测Android应用反编译成jimple代码,设置Source和Sink,利用污点追踪技术,获得每条Source到Sink路径上组件之间的调用关系,包括组件名、组件的intent信息和intent filter信息、组件内的方法名等信息,形成组件转换关系图。

在将应用org.uc.netspeed反编译成jimple代码,如图2所示为org.uc.netspeed中组件NetStart对应的jimple代码;确定Source为每个组件中控件的findViewById方法,如图2所示,NetStart组件包含了四个控件的findViewById方法,分别对应控件ID为2131099649、2131099650、2131099651、2131099652;确定Sink为步骤A中描述的事件监听器函数以及启动组件的方法名,如图2所示的$r3.<android.widget.Button:voidsetOnClickListener(android.view.ViewOnClickListener)>即为控件2131099649的事件监听器;利用已有的IccTA工具进行污点追踪,获得的信息分别存入表2所示的数据表中,各个数据表的详细内容如图3所示。

表2数据表信息

序号表名详细信息Classes以类的形式存储了各组件的应用名、包名、组件名等Components存储各组件所调用的应用名、包名、组件名等信息ExitPoints存储所有组件对应的方法名等Intents存储应用中所有intent信息Links存储各组件之间的Intent与组件信息Paths存储各条路径上所经历的触发组件名、方法及其他信息Stmts存储各组件中方法的触发语句stmt、方法名等

分析数据表中组件之间的关系,获得org.uc.netspeed的组件集合V为{NetStart,SpeedPrefernces,NetSpeedService,Settings,About,ConfigActivity,DeviceCheck,HelpActivity};表明该应用org.uc.netspeed包含8个组件,组件转换的边信息如表3所示:

表3样例org.uc.netspeed的组件转换的边信息

Comp1(源组件)widgetID_.method(触发方法)Comp2(目标组件)NetStartNetStart$1:onClick()SpeedPreferencesNetStartNetStart$2:onClick()NetSpeedServiceNetStartNetStart$3:onClick()SettingsNetStartNetStart$4:onClick()AboutSpeedPreferencesSpeedPreferences$1:onClick()ConfigActivitySpeedPreferencesSpeedPreferences$2:onClick()DeviceCheckSettingsSettings:onClick()HelpActivity

由此构建org.uc.netspeed的组件转换关系图如图6所示。

S2:控制流分析构造org.uc.netspeed的函数调用关系图。具体包括以下步骤:

(1)利用反编译工具将待测Android应用变成smali代码,获得其中所包含的组件及其执行的方法信息;

(2)分析invoke函数,获得组件的函数跳转关系,包括组件的方法名、调用该方法的函数列表、该方法调用的函数列表;

(3)将组件中所执行到的方法名、调用该方法的函数列表以及该方法调用的函数列表分别存入到method_name、in_list、sd_list中,其中method_name表示某函数的名称,in_list表示调用该函数的函数集合、该函数内所调用的自定义函数集合存入sd_list,从sd_list中取出系统框架层函数存入到API_list中,形成四元组{method_name,in_list,sd_list,API_list}。

将org.uc.netspeed反编译成smali代码,从中获得的组件及执行的方法信息,如图4所示的组件NetStart以及其direct methods或virtual methods信息;依次分析其中的invoke-direct调用链和invoke-virtual调用链,如表4所示。从invoke-direct调用链中提取自定义内部类的被调用的方法,从invoke-virtual调用链中提取框架层API函数名等信息。结合函数调用图四元组结构,形成该函数org.uc.netspeed.NetStart;onCreate方法的调用关系描述,如图5所示。该函数的函数调用关系图中method_name为org/uc/netspeed/NetStart;->onCreate(Landroid/os/Bundle);in_list为空;sd_list为表4中的“invoke-direct”包含的四个被调用方法的自定义内部类方法,API_list为“invoke-virtual”涵盖的三个被调用方法的框架层API函数名。

表4 invoke调用图链示例

S3:步骤S3中所述的获取敏感路径集,具体步骤包括:

S3.1提取出函数调用关系图中的敏感API函数API_list,存入到敏感API集sensitive_API中;

S3.2取出敏感sensitive_API中一个敏感API函数所属的组件名,查找Android应用组件转换关系图,获得调用该组件的组件名和控件事件处理方法widgetID_method,再根据查出的组件名,查找出上一级调用的组件名和控件事件处理方法,直到获得从根组件到达敏感API函数的组件转换路径,存入到敏感路径集sensitive_Path中。

S3.3循环S3.2步骤,直到敏感API集所有元素都处理完成为止。提取org.uc.netspeed的敏感API集sensitive_API,如表5所示,其中BroadcastReceiver为系统敏感API,getDeviceId为用户敏感API。

表5样例org.uc.netspeed的敏感API集sensitive_API

取出敏感API函数BroadcastReceiver,获得其所属组件名NetSpeedService,触发方法为onCreate;查找org.uc.netspeed的组件转换关系图,从中获得触发该组件执行的控件事件处理方法widgetID_method为onClick及其所属组件名为NetStart以及触发的控件为startButton;由于NetStart是根组件,因此形成一条敏感路径NetStart->NetSpeedService,加入到敏感路径集sensitive_Path中;继续取出敏感API函数getDeviceId,获得其所属组件名DeviceCheck,触发方法为onCreate;查找org.uc.netspeed的组件转换关系图,获得触发该组件执行的控件事件处理方法为onClick及其所属组件名为SpeedPreferences,触发控件为checkButton;继续反向查找,获得SpeedPreferences的调用组件为NetStart,其触发控件为speedButton,触发的方法为onClick,至此形成第二条敏感路径NetStart->SpeedPreferences->DeviceCheck,加入到敏感路径集sensitive_Path中;由此,所形成的敏感路径集为表6所示。

表6样例org.uc.netspeed敏感路径集

S4:动态执行敏感路径集,自动化触发测试;具体步骤是:依次自动化触发敏感路径集中的每条路径,将待测Android应用在开源自动化测试框架Appium中自动化安装启动,根据其包名org.uc.netspeed和入口组件NetStart,依次触发步骤S3获取的sensitive_Path中每条从入口组件到敏感API函数组件的路径,若是能执行成功,则表明该敏感路径存在且正确,若不能执行成功,则表明该敏感路径不正确或误报。

本发明使得可能造成用户隐私数据泄漏的敏感路径通过自动化的方式触发检测,从而解决潜在于待测Android应用中的敏感路径可以通过自动化动态触发进行验证等有关问题。

实施例2:

本实施例说明上述方法在实际应用中的正确性。从Google应用商店随机选取的53个市场应用,可分为图像、学习、通讯、地图、系统以及安全等六类进行了测试,结合本发明的方法,测试成功了45个包含敏感API的Android应用,平均测试成功率为84.91%,待测Android应用测试结果如表7所示。

表7待测Android应用的测试结果

进一步分析含有敏感数据泄露行为的通路,如表8所示,具体地分析了表7中测试成功的包含敏感API的45个Android应用的敏感API触发的结果。

表8测试成功的待测Android应用敏感API分析

表中,I表示静态分析得到的敏感API数目;II表示本发明方法触发的敏感API数目。

从表8的实验结果表明,本发明方法能够自动化触发83.33%以上的各种敏感API路径,包括系统敏感API和用户敏感API。因此,本发明可以有效地基于静态分析待测Android应用,自动化触发验证包含敏感API的敏感路径。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号