掌桥专利:专业的专利平台
掌桥专利
首页

Android动态权限申请的缺陷检测方法

文献发布时间:2023-06-19 11:52:33


Android动态权限申请的缺陷检测方法

技术领域

本发明涉及软件可靠性技术领域,具体涉及一种Android动态权限申请的缺陷检测方法。

背景技术

随着Android系统的演化,在新版本的发布中,不断加强了隐私的管理,约束了应用程序在权限方面获取的自由度,开发者需要手动的去适配应用程序使用到的危险权限的处理步骤,并且需要完整的适配不同版本之间的演化状况。随着动态权限机制在Android6.0的引入以及后续版本的不断演化,到目前的Android 11,开发者兼顾所有版本的特性,无法适配好所有的版本,如果开发者适配不完整,会导致应用在运行时所需的权限存在未被赋予的情况,经常会出现一些应用崩溃、闪退、相关功能不可用等现象,产生软件缺陷。在对Android应用程序测试不充分的情况下,对危险权限处理步骤不完整以及动态权限演化的情况处理不完整会导致应用在运行的时候出现开发者和用户都不想接收的异常,比如Java.lang.SecurityException。Android Studio编译器本身集成的代码分析工具Lint可以提示一部分缺失的情况,但是它本身缺乏跨方法的分析策略、缺乏目前处理的权限与API所需是否对应的情况以及缺失对动态权限机制版本演化带来的问题的处理。

DalivkVM虚拟机中定义的Class格式文件是编译Java类文件后产生的字节码,每一个Class文件都对应着唯一一个类或接口的定义信息,这些Class文件后续会被处理成Dex文件解析运行,Java类文件中的属性、方法,以及类中的常量信息,都会被存储在.class文件中。相对于易于程序开发者读写的Java文件,class文件的格式被更加严格的定义,以此方便于被程序分析。目前有Soot、Javassist等流行的工具可以在class形式的字节码文件进行操作,进行Java类的产生、分析、修改,完成一系列静态分析操作。FlowDroid是基于Soot创建,并对Android程序的分析进行了优化,可以模拟生命周期,分析出Android程序的完整的函数调用图,所以借助于FlowDroid等Java优化框架可以分析Android程序的内部结构,既能从单个Java文件的角度分析每一条Java语句,也可以从整个Android程序的角度分析每个Java类、Java方法以及常量之间的关系。

检测Android应用程序中的对动态权限步骤缺失的情况,能帮助开发者提前处理这种风险,结合当前应用程序的处理情况,分析程序内部对方法的调用,可以根据每种缺失的情况提醒出其缺少处理的类型,能更进一步的帮助软件开发者避免程序在运行时候崩溃,但是,目前针对动态权限处理步骤不完整的情况,并没有工具给予理想并可用的解决方案。

发明内容

针对现有技术的不足,本发明提出一种Android动态权限申请的缺陷检测方法,包括:

步骤1:获取待检测程序使用到的所有危险权限以及使用每个危险权限的方法,将危险权限的使用方法存储到文件DangerousMethodSet中,将危险权限及其使用方法保存到文件MethodToPermissionsMap中;

步骤2:寻找每个危险权限使用方法的完整调用链路;

步骤3:判断MethodToPermissionsMap中的每个危险权限是否缺失权限声明,将缺失声明权限的使用方法标记为NotDeclare;

步骤4:判断MethodToPermissionsMap中的每个危险权限是否缺失检查和申请权限的步骤,并判断危险权限的使用方法所使用到的危险权限与应用内检查和申请的权限是否一致;

步骤5:针对存在不同版本之间演化的文件MethodToPermissionsMap,判断开发者是否处理好了存在不同版本之间演化的情况。

所述步骤3包括:

步骤3.1:提取应用当前声明的危险权限,保存至文件DeclaredPermissions;

步骤3.2:遍历文件MethodToPermissionsMap,判断危险权限是否存在DeclaredPermissions文件中,如果不存在则将所述危险权限使用的方法标记为缺失权限声明,即标记为NotDeclare。

所述步骤4包括:

步骤4.1:配置用于检查和申请危险权限的API集合,将用于检测权限是否赋予的API记录到文件CheckPermissionsAPIs中,将用于请求的危险权限的API记录到文件RequestPermissionsAPIs中;

步骤4.2:遍历每个危险权限使用方法的完整调用链路,判断每个调用链路是否包含文件CheckPermissionsAPIs以及RequestPermissionsAPIs内的API,如果不包含文件CheckPermissionsAPIs中的API,则将该调用链路所对应的使用方法标记为缺少权限检测的操作,即标记为NotChecked,如果不包含文件RequestPermissionsAPIs中的API,则将该调用链路所对应的使用方法标记为缺少请求权限的操作,即标记为NotRequested;

步骤4.3:将CheckPermissionsAPIs文件内的所有API定位到危险权限使用方法的调用链路中,构建以每个API开始的数据流图,并得到API的False分支的流程图;将RequestPermissionsAPIs文件中所有API定位到危险权限使用方法的调用链路中,并判断申请危险权限的API是否落入False分支的流程图内,如果没有落入则将该申请危险权限的API所对应的使用方法标记为缺失请求权限的步骤,即标记为NotRequested;

步骤4.4:判断危险权限的使用方法所使用到的危险权限与应用内检查和申请的危险权限是否一致。

所述步骤4.4包括:

步骤4.4.1:对于执行步骤4.3后剩余的未进行标记的使用方法的调用链路,构建使用方法的调用链路中包含检查危险权限的API为起始点的数据流图,提取出当前应用所检查的所有危险权限,存储到文件CheckedPermissionsSet中;

步骤4.4.2:构建请求危险权限的API为起始点的数据流图,提取出当前应用所请求的所有危险权限,得存储到文件RequestedPermissionsSet中;

步骤4.4.3:从文件MethodToPermissionsMap中获取每个使用方法的危险权限,并存储到文件PermissionsNeededSet中,对比文件PermissionsNeededSet与CheckedPermissionsSet,如果文件PermissionsNeededSet中的危险权限没有全部存在于文件CheckedPermissionsSet中,则判定为待检测的使用方法所需的危险权限没有被检查,即待检测的使用方法缺失检测权限的步骤,标记为NotChecked;

步骤4.4.4:对比文件PermissionsNeededSet与RequestedPermissionsSet,如果文件PermissionsNeededSet中的危险权限没有全部存在于集合RequestedPermissionsSet中,则判定为待检测的使用方法所需的危险权限没有被请求,即待检测的使用方法缺失申请权限的步骤,标记为NotRequested。

所述步骤5包括:

步骤5.1:提取应用的配置文件,读取与版本号相关的标签,获得当前应用所指定的平台版本,标记为该应用的属性targetSDKVersion,并根据该版本号读取不同版本之间的差异数据,得到当前targetSDKVersion版本下的演化数据,将演化数据集保存至文件EvolutionMappingsMap中;

步骤5.2:遍历文件MethodToPermissionsMap中的所有方法,判断每个使用方法以及对应权限是否存在文件EvolutionMappingsMap中,如果存在,则标记该使用方法为可能存在动态权限版本兼容的方法,并保存至文件EvolutionMethodLists中;

步骤5.3:遍历步骤5.2得到的文件EvolutionMethodLists,以每个危险权限的使用方法为终点,提取该危险权限使用方法的调用链路并构建完整的数据流图,判断该调用链路内以及数据流图中是否存在对属性targetSDKVersion的判断,判断当前检测危险权限使用方法是否落入属性Build.VERSION.SDK_INT的True分支之中,如果不存在或者不落入,则判定当前应用存在版本间的兼容性问题,标记为NotCompatible。

本发明的有益效果是:

本发明提出了一种Android动态权限申请的缺陷检测方法,Android Studio本身集成的代码分析功能Lint,可以判断应用是否缺失声明的权限以及在同一个方法内是否检查了权限,但是在实际的应用程序中,会出现许多假阳性的报警信息,这会导致误导开发者去处理这种情况。本发明是基于静态分析工具FlowDroid所开发,能为开发者同更多关于动态权限处理缺陷的信息,不仅仅可以提示哪些权限没有正确被声明,而且会根据应用程序的类和方法之间的关系去评估是否存在步骤的缺失,将每种缺陷的情况更清晰的输出给开发者,了解到项目中存在的风险。

附图说明

图1为本发明中的Android动态权限申请的缺陷检测方法流程图;

图2为本发明中的检测程序所需危险权限是否声明的流程图;

图3为本发明中的检测程序所需危险权限是否检查和请求、检查与请求的权限是否正确的流程图;

图4为本发明中的检查程序是否处理动态权限方面版本之间的演化情况的流程图。

具体实施方式

下面结合附图和具体实施实例对发明做进一步说明。

如图1所示,一种Android动态权限申请的缺陷检测方法,采用Java编程实现,包括:

步骤1:获取待检测程序使用到的所有危险权限以及使用每个危险权限的方法,将危险权限的使用方法存储到文件DangerousMethodSet中,将危险权限及其使用方法保存到文件MethodToPermissionsMap中;

获取当前应用程序在运行时候使用到的需要危险权限的方法以及对应的危险权限,根据应用程序的字节码构建待检测程序的函数调用图,遍历函数调用图时,首先提取应用调用的方法,然后判断应用调用的方法是否需要危险权限,将危险权限的使用方法存储到文件DangerousMethodSet中,将危险权限及其使用方法保存到文件MethodToPermissionsMap中;

步骤2:寻找每个危险权限使用方法的完整调用链路;

对所有需要危险权限的使用方法回溯的寻找其完整的调用链路,Android程序内的方法调用存在完整的调用链路,在静态分析中,将所有调用链路的起始点定义为DummyMain,遍历步骤1得到的DangerousMethodSet文件,对每一个危险权限的使用方法,寻找其调用者,并不断向上回溯,在回溯过程中不断寻找调用者,直到最后的调用者是DummyMain,此时停止回溯,保存当前方法与对应的调用链路;

步骤3:如图2所示,判断MethodToPermissionsMap中的每个危险权限是否缺失权限声明,将缺失声明权限的使用方法标记为NotDeclare;包括:

步骤3.1:提取应用当前声明的危险权限,保存至文件DeclaredPermissions;具体表述为:

(1)提取应用的配置文件,解析获取配置文件中的所有标签,危险权限的声明标签会使用进行标识,遍历配置文件中声明的所有标签,记录危险权限的声明标签以及所声明的权限;

(2)遍历已经得到的以及配置的值,遍历提取出标签内的权限值,由此可以得到应用声明的所有权限集合,保存至文件DeclaredPermissions中;

步骤3.2:遍历文件MethodToPermissionsMap,判断当前方法所使用的危险权限是否存在DeclaredPermissions文件中,如果不存在则将所述危险权限使用的方法标记为缺失权限声明,即标记为NotDeclare;

步骤4:如图3所示,判断MethodToPermissionsMap中的每个危险权限是否缺失检查和申请权限的步骤,并判断危险权限的使用方法所使用到的危险权限与应用内检查和申请的权限是否一致;包括:

步骤4.1:配置用于检查和申请危险权限的API集合,将用于检测权限是否赋予的API记录到文件CheckPermissionsAPIs中,将用于请求的危险权限的API记录到文件RequestPermissionsAPIs中;

步骤4.2:遍历每个危险权限使用方法的完整调用链路,通过对每个方法的调用链路的遍历,在遍历过程中,判断每个调用链路是否包含文件CheckPermissionsAPIs以及RequestPermissionsAPIs内的API,如果不包含文件CheckPermissionsAPIs中的API,则将该调用链路所对应的使用方法标记为缺少权限检测的操作,即标记为NotChecked,如果不包含文件RequestPermissionsAPIs中的API,则将该调用链路所对应的使用方法标记为缺少请求权限的操作,即标记为NotRequested;

步骤4.3:将CheckPermissionsAPIs文件内的所有API定位到危险权限使用方法的调用链路中,构建以每个API开始的数据流图,并得到API的False分支的流程图;将RequestPermissionsAPIs文件中所有API定位到危险权限使用方法的调用链路中,并判断申请危险权限的API是否落入False分支的流程图内,如果没有落入则将该申请危险权限的API所对应的使用方法标记为缺失请求权限的步骤,即标记为NotRequested;

步骤4.4:判断危险权限的使用方法所使用到的危险权限与应用内检查和申请的危险权限是否一致;包括:

步骤4.4.1:对于执行步骤4.3后剩余的未进行标记的使用方法的调用链路,构建使用方法的调用链路中包含检查危险权限的API为起始点的数据流图,提取出当前应用所检查的所有危险权限,存储到文件CheckedPermissionsSet中;

步骤4.4.2:构建请求危险权限的API为起始点的数据流图,提取出当前应用所请求的所有危险权限,得存储到文件RequestedPermissionsSet中;

步骤4.4.3:从文件MethodToPermissionsMap中获取每个使用方法的危险权限,并存储到文件PermissionsNeededSet中,对比文件PermissionsNeededSet与CheckedPermissionsSet,如果文件PermissionsNeededSet中的危险权限没有全部存在于文件CheckedPermissionsSet中,则判定为待检测的使用方法所需的危险权限没有被检查,即待检测的使用方法缺失检测权限的步骤,标记为NotChecked;

步骤4.4.4:对比文件PermissionsNeededSet与RequestedPermissionsSet,如果文件PermissionsNeededSet中的危险权限没有全部存在于集合RequestedPermissionsSet中,则判定为待检测的使用方法所需的危险权限没有被请求,即待检测的使用方法缺失申请权限的步骤,标记为NotRequested;

步骤5:如图4所示,针对存在不同版本之间演化的文件MethodToPermissionsMap,判断开发者是否处理好了存在不同版本之间演化的情况;包括:

步骤5.1:提取应用的配置文件,读取与版本号相关的标签,获得当前应用所指定的平台版本,标记为该应用的属性targetSDKVersion,并根据该版本号读取不同版本之间的差异数据(比如权限的增加、删除,使用方法所需要的权限的修改等均属于演化数据集),得到当前targetSDKVersion版本下的演化数据,将演化数据集保存至文件EvolutionMappingsMap中;

步骤5.2:遍历文件MethodToPermissionsMap中的所有方法,判断每个使用方法以及对应权限是否存在文件EvolutionMappingsMap中,如果存在,即当前应用使用到了与动态权限演化有关的API或者权限,则标记该使用方法为可能存在动态权限版本兼容的方法,并保存至文件EvolutionMethodLists中;

步骤5.3:遍历步骤5.2得到的文件EvolutionMethodLists,以每个危险权限的使用方法为终点,提取该危险权限使用方法的调用链路并构建完整的数据流图,判断该调用链路内以及数据流图中是否存在对属性targetSDKVersion的判断,判断当前检测危险权限使用方法是否落入属性Build.VERSION.SDK_INT的True分支之中,如果不存在或者不落入,则判定当前应用存在版本间的兼容性问题,标记为NotCompatible。

最后将评估结果封装到结构化的数据当中,对于同一个结构化的数据,实现xml和html两种不同的展现逻辑,可以向工具使用者以多种形式展现检测结果,应用程序开发者可以根据本发明提示的输出信息,可以更快的定位到有缺陷的代码块,并消除错误,降低应用程序在运行时候异常的风险。

相关技术
  • Android动态权限申请的缺陷检测方法
  • Android图片加载行为缺陷动态检测方法
技术分类

06120113084134