CN108763924B - 一种安卓应用程序中不可信第三方库访问权限控制方法 - Google Patents
一种安卓应用程序中不可信第三方库访问权限控制方法 Download PDFInfo
- Publication number
- CN108763924B CN108763924B CN201810387894.2A CN201810387894A CN108763924B CN 108763924 B CN108763924 B CN 108763924B CN 201810387894 A CN201810387894 A CN 201810387894A CN 108763924 B CN108763924 B CN 108763924B
- Authority
- CN
- China
- Prior art keywords
- authority
- party library
- api
- access
- permission
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/52—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow
- G06F21/54—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow by adding security routines or objects to programs
Landscapes
- Engineering & Computer Science (AREA)
- Computer Security & Cryptography (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Storage Device Security (AREA)
Abstract
本发明提供了一种安卓应用程序中不可信第三方库访问权限控制方法。所述安卓应用程序中不可信第三方库访问权限控制方法包括如下步骤:对第三方库的权限进行分配;对第三方库的不可调用API集合进行分析,根据第三方库被分配的权限,结合权限与API的映射关系,分析得出第三方库的不可调用API集合;对第三方库的系统API调用安全性进行分析,根据第三方库不可调用的权限API集合、及涉及敏感信息访问的非权限API集合,分析记录第三方库中涉及这两类API的调用信息;根据代码安全性分析结果,在第三方库代码中加入访问控制策略。
Description
技术领域
本发明涉及模式识别技术领域,特别涉及一种安卓应用程序中不可信第三方库访问权限控制方法。
背景技术
第三方库在Android应用程序开发过程中使用非常普遍,开发者为了提高开发效率或者减少开发成本,从而在应用内引入相应功能的第三方库模块。
但是,一旦引入的第三方库存在恶意行为,用户隐私信息将存在泄露的威胁。这种安全问题的主要原因在于:安卓系统的访问权限控制是粗粒度的,无法对应用内模块的访问权限机制隔离控制。第三方库的安全使用主要有两类方案:扩展Android系统的安全机制,利用Android的安全机制,加入对应用程序细粒度的访问控制策略;重写APK文件,反编译字节码为中间码文件,然后对第三方库进行重写,加入细粒度访问控制策略。两种方案都存在着防御方案不便部署、访问控制策略不完善、性能开销大等缺陷。
发明内容
本发明的目的在于针对现有技术的缺陷或问题,提供一种安卓应用程序中不可信第三方库访问权限控制方法,通过对第三方库字节码的静态分析以及重写,实现了对第三方库访问权限的控制,以解决现有方案存在的安全措施不便部署等问题。
本发明的技术方案如下:一种安卓应用程序中不可信第三方库访问权限控制方法包括如下步骤:步骤1、对第三方库的权限进行分配;步骤2、对第三方库的不可调用API集合进行分析,根据第三方库被分配的权限,结合权限与API的映射关系,分析得出第三方库的不可调用API集合;步骤3、对第三方库的系统API调用安全性进行分析,根据第三方库不可调用的权限API集合、及涉及敏感信息访问的非权限API集合,分析记录第三方库中涉及这两类API的调用信息;步骤4、根据代码安全性分析结果,在第三方库代码中加入访问控制策略,所述访问控制策略包括:对第三方库的权限API不合法调用行为进行替换,根据代码安全性分析结果中关于第三方库中出现的权限API不合法行为,对其进行替换操作;对第三方库的非权限API可疑调用行为进行插桩,根据代码安全性分析结果中关于第三方库中出现的非权限API可疑调用行为,对其进行插桩操作。
优选地,步骤1具体包括如下步骤:
步骤1.1、根据第三方库的附加说明信息提取出第三方库申请的访问权限;
步骤1.2、根据库功能依次对第三方库申请的访问权限的合理性进行分析;
步骤1.3、为某条权限申请是否为合理性判定过程,如果为不合理的权限申请,则直接跳转到步骤1.5,如果为合理的权限申请,则进入步骤1.4;
步骤1.4、将合理的权限申请条目加入第三方库权限配置文件ThirdLib_Permissions.xml文件中,并进入步骤1.5;
步骤1.5、判断是否对所有的第三方库权限申请条目分析完成,如果存在权限申请条目未进行分析,则跳转到步骤1.2继续进行分析;如果已完成对所有的权限申请条目合理性分析,则结束权限分配流程。
优选地,ThirdLib_Permissions.xml文件中为对第三方库访问权限的分配。
优选地,步骤2具体包括如下步骤:
步骤2.1、将第三方库的权限集合保存在ThirdLibPermissionSet中;
步骤2.2、初始化第三方库合法权限API调用可调用的权限API集合legalAPISet的过程,初始值为空,即不包含任何可调用的权限API;
步骤2.3、逐条取出ThirdLibPermissionSet的权限Pi,将Pi与权限API映射关系MappingAPIList进行匹配或查找;
步骤2.4、对匹配结果进行判断,如果判断Pi出现在MappingAPIList中,则进入步骤2.5,如果MappingAPIList不包含Pi,则进入步骤2.6;
步骤2.5、记录合法权限API,如果Pi出现在MappingAPIList中说明第三方库可以调用受权限Pi保护的API,则将受Pi保护的所有API添加到legalAPISet集合中;
步骤2.6、判断对ThirdLibPermissionSet中所有条目是否都已完成匹配查找,如果否,则跳转到步骤2.3,如果是,则进入步骤2.7;
步骤2.7、经过权限匹配分析,得到第三方库可调用的权限API集合legalAPISet,第三方库不可调用的权限API集合illegalAPISet取可调用的权限API集合legalAPISet的差集即可。
优选地,步骤3包括如下步骤:
步骤3.1、输入第三方库文件classFiles、不可调用的权限API集合illegalAPISet、可疑的非权限API集合susAPISet;
步骤3.2、初始化分析结果needReplaceAPISet、needInstruAPISet;
步骤3.3、取出classFiles的字节码文件classFileItem_i进行分析;
步骤3.4、利用反编译工具javap对选取出来的字节码文件classFileItem_i文件进行反编译,得到class文件的中间码格式文件,并提取中间码中常量池的内容;
步骤3.5、取出常量池中的所有方法引用,并保存在methodRefSet_i中;
步骤3.6、遍历methodRefSet_i中的元素,即对class文件中出现的方法引用methodRefItem_j逐一分析;
步骤3.7、对于字节码常量池中出现的方法引用methodRefItem_j是否属于不可调用的权限API集合illegalAPISet进行判断,若是,则进入步骤3.8;若不是,则进入步骤3.9;
步骤3.8、第三方库出现的方法引用methodRefItem_j是属于不可调用的权限API集合illegalAPISet的,调用行为是非法的权限API调用行为,则需要将当前classFileItem_i和methodRefItem_j记录到needReplaceAPISet中;
步骤3.9、由于字节码常量池中出现的引用字节码文件methodRefItem_j不属于illegalAPISet,则需要进一步判断引用字节码文件methodRefItem_j是否属于可疑的非权限API集合susAPISet的,如果是,则进入步骤3.10,如果不是,则进入步骤3.11;
步骤3.10、如果引用字节码文件methodRefItem_j属于可疑的非权限API集合susAPISet,则将当前classFileItem_i和methodRefItem_j记录到needInstruAPISet中;
步骤3.11、判断当前class文件的所有方法引用是否完成安全性分析,如果是,则进入步骤3.12,如果剩余方法引用未完成完全性分析,则跳转到步骤3.6;
步骤3.12、安全性结果保存,即保存needReplaceAPISet、needInstruAPISet两部分内容,以供字节码重构模块使用。
优选地,步骤4中对第三方库的权限API不合法调用行为进行替换具体包括如下步骤:
步骤4.11、输入第三方库非法权限调用记录needReplaceAPISet,方法调用指令操作码集mtdCallOpSet;
步骤4.12、取needReplaceSet中classFileItem_i及其中所包含的非法权限API调用集illegalAPISet_i;
步骤4.13、利用ASM框架,读取类文件classFileItem_i,对类中的方法逐一的进行分析处理,本步取类方法mj进行处理;
步骤4.14、提取mj中的所有指令,并保存在临时变量mj_InsnSet中;
步骤4.15、对所有指令进行逐一分析,本步取出一条指令insn_k,并获取该指令的操作码opcode_k和操作数operands_k;
步骤4.16、首先判断该指令操作码是否为方法调用指令,若不是,则进入步骤4.110,若是则进入步骤4.17;
步骤4.17、由于只能确定该条指令为方法调用,则需要进一步判断调用的方法是否为属于第三方库不可调用的权限API,如果不是,则进入步骤4.110,如果是,则进入步骤4.18;
步骤4.18、生成替换函数;
步骤4.19、直接对不合法权限API调用进行替换,替换为空操作函数;
步骤4.110、判断是否对方法mj中所有的指令进行了分析处理,如果是,则进入步骤4.111,如果不是,则跳转到步骤4.15,继续对剩余的指令进行分析处理;
步骤4.111、判断是否对needReplaceAPISet记录中所有的类文件进行了分析处理,如果否,则跳转到步骤4.12,继续对剩余的类文件进行处理,如果是,则结束流程。
优选地,步骤4中替换函数的内部执行包括步骤:
5.1、接收输入参数列表,输入与原权限API参数列表相同;
5.2、替换函数体内部的操作,即无任何实质性的功能操作;
5.3、替换函数的返回值构造,由于第三方库执行的是不合法的权限API调用,所以得不到有效的返回值,故替换函数直接返回无效值。
优选地,步骤4中对第三方库的非权限API可疑调用行为进行插桩包括步骤:
步骤4.21、输入第三方库中可疑非权限API调用记录needInstruAPISet,方法调用指令操作码集mtdCallOpSet;
步骤4.22、取needInstruAPISet中classFileItem_i及其中可疑非权限API调用集susAPISet_i;
步骤4.23、利用ASM框架,读取类文件classFileItem_i,对类中的方法逐一的进行分析处理,本步取类方法mj进行处理;
步骤4.24、提取mj中的所有指令,并保存在临时变量mj_InsnSet中;
步骤4.25、对所有指令进行逐一分析,本步取出一条指令insn_k,并获取该指令的操作码opcode_k和操作数operands_k;
步骤4.26、首先判断该指令操作码是否为方法调用指令,若不是则进入步骤4.210,若是则进入步骤4.27;
步骤4.27、判断调用的方法是否为属于第三方库不可调用的权限API,若不是则进入步骤4.210,若是则进入步骤4.28;
步骤4.28、生成插桩函数;
步骤4.29、直接对可疑的非权限API调用点插桩,在访问前插入插桩函数;
步骤4.210、判断是否对方法mj中所有的指令进行了分析处理,若是进入步骤4.211,若不是跳转到步骤4.25继续对剩余的指令进行分析处理;
步骤4.211、判断是否对needInstruAPISet记录中所有的类文件进行了分析处理,若没有完成则跳转到步骤4.22,继续对剩余的类文件进行处理;如果是,则结束流程。
优选地,步骤4中插桩函数的内部执行包括步骤:
步骤6.1、接收输入参数列表值,如果涉及敏感Content Provider访问,则执行步骤6.2,如果涉及启动敏感操作,则执行步骤6.7;
步骤6.2、检查涉及敏感Content Provider访问的关键参数uriValue;
步骤6.3、判断uriValue值是否属于illegalUriSet,若是,则进入步骤6.6,若不是,则进入步骤6.4;
步骤6.4、表示ContentProvider访问为合法的访问行为,并进行正常的ContentProvider访问;
步骤6.5、返回正常的ContentProvider请求结果;
步骤6.6、表示访问ContentProvider行为是不合法的操作,对其访问行为进行拦截,并返回无效值;
步骤6.7、检查涉及启动敏感操作的关键参数intentActionValue;
步骤6.8、判断intentActionValue是否属于illegalIntentActionSet,若是则进入步骤6.11,若不是则进入步骤6.9;
步骤6.9、表示启动外部操作为合法的操作请求,则向外发送正常intent action启动外部操作;
步骤6.10、表示外部操作完成并返回正常的请求结果;
步骤6.11、表示操作为不合法的调用行为,对其访问行为进行拦截并返回无效值,并结束流程。
本发明提供的技术方案具有如下有益效果:
本发明一种安卓应用程序中不可信第三方库访问权限控制方法,通过对第三方库字节码的静态分析以及重写,实现了对第三方库访问权限的控制,解决了现有方案存在的安全措施不便部署等问题,弥补了现有技术的缺陷。
附图说明
图1为本发明实施例提供的安卓应用程序中不可信第三方库访问权限控制方法的流程示意图;
图2为第三方库访问权限分配流程图;
图3为第三方库不可调用API集合分析流程图;
图4为第三方库系统API调用安全性分析流程图;
图5为第三方库权限API不合法调用行为替换流程图;
图6为替换函数内部执行流程图;
图7为第三方库非权限API可疑调用行为插桩流程图;
图8为插桩函数内部执行流程图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
除非上下文另有特定清楚的描述,本发明中的元件和组件,数量既可以单个的形式存在,也可以多个的形式存在,本发明并不对此进行限定。本发明中的步骤虽然用标号进行了排列,但并不用于限定步骤的先后次序,除非明确说明了步骤的次序或者某步骤的执行需要其他步骤作为基础,否则步骤的相对次序是可以调整的。可以理解,本文中所使用的术语“和/或”涉及且涵盖相关联的所列项目中的一者或一者以上的任何和所有可能的组合。
请参阅图1,本发明实施方式提供一种安卓应用程序中不可信第三方库访问权限控制方法,所述方法包括以下步骤:
步骤1、对第三方库的权限进行分配;
步骤2、对第三方库的不可调用API集合进行分析,根据第三方库被分配的权限,结合权限与API的映射关系,分析得出第三方库的不可调用API集合;
步骤3、对第三方库的系统API调用安全性进行分析,根据第三方库不可调用的权限API集合、及涉及敏感信息访问的非权限API集合,分析记录第三方库中涉及这两类API的调用信息;
步骤4、根据代码安全性分析结果,在第三方库代码中加入访问控制策略,所述访问控制策略包括:
对第三方库的权限API不合法调用行为进行替换,根据代码安全性分析结果中关于第三方库中出现的权限API不合法行为,对其进行替换操作;
对第三方库的非权限API可疑调用行为进行插桩,根据代码安全性分析结果中关于第三方库中出现的非权限API可疑调用行为,对其进行插桩操作。
需要说明的是,所述安卓应用程序中不可信第三方库访问权限控制方法将对第三方库访问权限的控制策略部署到应用程序中,本方法的核心功能对第三方库代码安全性分析、第三方库代码重构,包括三个阶段:第三方库访问权限分配、第三方库代码安全性分析,以及第三方库代码重构。第三方库访问权限分配操作时,由开发者根据第三库的权限申请和功能特征对第三方库的权限进行分配。第三方库代码安全性分析阶段,包括第三方库不可调用API集合分析、第三方库系统API调用安全性分析等2个关键操作。第三方库不可调用API集合分析操作是安全性分析的准备工作。根据第三方库被分配的权限,结合权限与API的映射关系,分析得出第三方库不可调用的API集合。第三方库系统API调用安全性分析操作时,根据第三方库不可调用的权限API集合、涉及敏感信息访问的非权限API集合,分析记录第三方库中涉及这两类API调用信息。第三方库代码重构阶段,根据代码安全性分析结果,在第三方库代码中加入访问控制策略。包括2个关键操作:第三方库权限API不合法调用行为替换,根据代码安全性分析结果中关于第三方库中出现的权限API不合法行为,对其进行替换操作;第三方库非权限API可疑调用行为插桩,根据代码安全性分析结果中关于第三方库中出现的非权限API可疑调用行为,对其进行插桩操作。经过对原第三方库的安全性分析和重构,将访问控制策略部署到第三方库相关的应用程序代码中,从而保证第三方库严格按照其所具有的权限进行敏感资源访问。
如图2所示,在步骤1中,开发者根据第三方库的申请权限集,并结合第三方库的功能,判断哪些权限可以赋予给第三方库。所以本部分主要由开发者仔细分析第三方库的功能文档和说明文件逐条对第三库申请的权限来确定是否赋予第三方库的权限。本过程作用于APP开发过程中,开发者通过分析第三方库的说明信息以及对权限申请的合理性,来确定第三方库的访问权限集合。
具体地,步骤1具体包括如下步骤:
步骤1.1、根据第三方库的附加说明信息提取出第三方库申请的访问权限;
步骤1.2、根据库功能依次对第三方库申请的访问权限的合理性进行分析;
步骤1.3、为某条权限申请是否为合理性判定过程,如果为不合理的权限申请,则直接跳转到步骤1.5,如果为合理的权限申请,则进入步骤1.4;
步骤1.4、将合理的权限申请条目加入第三方库权限配置文件ThirdLib_Permissions.xml文件中,并进入步骤1.5;
步骤1.5、判断是否对所有的第三方库权限申请条目分析完成,如果存在权限申请条目未进行分析,则跳转到步骤1.2继续进行分析;如果已完成对所有的权限申请条目合理性分析,则结束权限分配流程。
而且,ThirdLib_Permissions.xml文件中为对第三方库访问权限的分配。
如图3所示,步骤2是关于第三方库权限API调用安全性分析的准备工作,权限API是受权限保护的,任何出现权限API调用的同时,需要申请相应的权限,本过程就是根据第三方库的被赋予权限集合,来判断第三方库不可调用的权限API集合,以供安全性分析使用。利用开发者赋予第三方库的权限集合ThirdLibPermissionSet以及权限与API的映射关系MappingAPIList,根据第三方库具有的权限,得出第三方库的可调用权限API集合legalAPISet,输出结果为第三方库不可调用的权限API集合illegalAPISet即legalAPISet的补集,供代码安全性分析使用。同样的操作流程,可以将受权限保护的另外两种敏感资源Content Provider和Intent访问规范得出,即第三方库不可访问的Content Provider Uri集合illegalUriSet和第三方库不可启动的Intent Action集合illegalIntentActionSet,供代码重构模块使用。而且,本过程的输入为第三方库的权限集合,通过权限与API映射关系进行匹配,剔除第三方库的可调用权限API,最后得到第三方库不可调用的权限API集合。
具体地,步骤2具体包括如下步骤:
步骤2.1、将第三方库的权限集合保存在ThirdLibPermissionSet中;
步骤2.2、初始化第三方库合法权限API调用可调用的权限API集合legalAPISet的过程,初始值为空,即不包含任何可调用的权限API;
步骤2.3、逐条取出ThirdLibPermissionSet的权限Pi,将Pi与权限API映射关系MappingAPIList进行匹配或查找;
步骤2.4、对匹配结果进行判断,如果判断Pi出现在MappingAPIList中,则进入步骤2.5,如果MappingAPIList不包含Pi,则进入步骤2.6;
步骤2.5、记录合法权限API,如果Pi出现在MappingAPIList中说明第三方库可以调用受权限Pi保护的API,则将受Pi保护的所有API添加到legalAPISet集合中;
步骤2.6、判断对ThirdLibPermissionSet中所有条目是否都已完成匹配查找,如果否,则跳转到步骤2.3,如果是,则进入步骤2.7;
步骤2.7、经过权限匹配分析,得到第三方库可调用的权限API集合legalAPISet,第三方库不可调用的权限API集合illegalAPISet取可调用的权限API集合legalAPISet的差集即可。
如图4所示,步骤3中,本过程输入包括第三方库字节码文件classFiles、第三方库不可调用的权限API集合illegalAPISet以及涉及敏感资源调用的非权限API集合susAPISet.通过代码分析得到的结果包括两部分:即第三方库代码中非法调用权限API记录和第三方库中调用可疑非权限API记录,供代码重构模块使用。通过分析字节码中的方法引用,将涉及illegalAPISet和susAPISet中方法引用记录下来。因为字节码文件中的常量池包含所有方法区的类方法引用,所以直接分析第三方库的常量池内容即可判断类方法中是否有敏感方法调用,从而避免分析整个方法区内容,大大的提升了分析效率。关于分析结果的保存,将非法的权限API调用记录保存在needReplaceAPISet中,将可疑的非权限API调用记录保存在needInstruAPISet中,供代码重构操作使用。而且,本过程的输入为classFiles、illegalAPISet、susAPISet,输出为needReplaceAPISet、needInstruAPISet。
具体地,步骤3包括如下步骤:
步骤3.1、输入第三方库文件classFiles、不可调用的权限API集合illegalAPISet、可疑的非权限API集合susAPISet;
步骤3.2、初始化分析结果needReplaceAPISet、needInstruAPISet;
步骤3.3、取出classFiles的字节码文件classFileItem_i进行分析;
步骤3.4、利用反编译工具javap对选取出来的字节码文件classFileItem_i文件进行反编译,得到class文件的中间码格式文件,并提取中间码中常量池的内容;
步骤3.5、取出常量池中的所有方法引用,并保存在methodRefSet_i中;
步骤3.6、遍历methodRefSet_i中的元素,即对class文件中出现的方法引用methodRefItem_j逐一分析;
步骤3.7、对于字节码常量池中出现的方法引用methodRefItem_j是否属于不可调用的权限API集合illegalAPISet进行判断,若是,则进入步骤3.8;若不是,则进入步骤3.9;
步骤3.8、第三方库出现的方法引用methodRefItem_j是属于不可调用的权限API集合illegalAPISet的,调用行为是非法的权限API调用行为,则需要将当前classFileItem_i和methodRefItem_j记录到needReplaceAPISet中;
步骤3.9、由于字节码常量池中出现的引用字节码文件methodRefItem_j不属于illegalAPISet,则需要进一步判断引用字节码文件methodRefItem_j是否属于可疑的非权限API集合susAPISet的,如果是,则进入步骤3.10,如果不是,则进入步骤3.11;
步骤3.10、如果引用字节码文件methodRefItem_j属于可疑的非权限API集合susAPISet,则将当前classFileItem_i和methodRefItem_j记录到needInstruAPISet中;
步骤3.11、判断当前class文件的所有方法引用是否完成安全性分析,如果是,则进入步骤3.12,如果剩余方法引用未完成完全性分析,则跳转到步骤3.6;
步骤3.12、安全性结果保存,即保存needReplaceAPISet、needInstruAPISet两部分内容,以供字节码重构模块使用。
如图5所示,步骤4中的第三方库权限API不合法调用行为替换操作,是本方法关于第三方库访问权限控制的核心操作之一,此过程根据第三方库安全性分析结果对第三方库的进行重构。根据安全性分析结果needReplaceAPISet,该集合记录了第三方库中涉及不合法调用权限API的Class文件,替换操作的主要功能就是对这些class文件进行重写,对相应的不合法调用点进行替换,替换函数无任何功能性操作,且返回值为无效值。重写过程主要是对类方法的方法调用指令进行分析处理,Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的操作码(Opcode)以及跟随其后的零至多个代表此操作所需参数的操作数(Operands)所构成。Java字节码中关于方法调用的操作码集合mtdCallOpSet包括invokevirtual、invokeinterface、invokespecial、invokestatic和invokedynamic,在对第三方库类方法的指令分析时,主要是分析这五种指令操作符;具体是否需要对指令进行替换则根据指令的操作数决定,当操作数即调用方法的引用属于illegalAPISet,则将它替换为空操作函数。本方法中关于代码重写实施,采用ASM字节码操作框架来直接对字节码文件进行修改。本过程主要是根据第三方库安全性分析结果needReplaceAPISet,对相关的字节码文件中出现的不合法权限API调用进行替换,从而限制第三方库的访问权限。
具体地,步骤4中对第三方库的权限API不合法调用行为进行替换具体包括如下步骤:
步骤4.11、输入第三方库非法权限调用记录needReplaceAPISet,方法调用指令操作码集mtdCallOpSet;
步骤4.12、取needReplaceSet中classFileItem_i及其中所包含的非法权限API调用集illegalAPISet_i;
步骤4.13、利用ASM框架,读取类文件classFileItem_i,对类中的方法逐一的进行分析处理,本步取类方法mj进行处理;
步骤4.14、提取mj中的所有指令,并保存在临时变量mj_InsnSet中;
步骤4.15、对所有指令进行逐一分析,本步取出一条指令insn_k,并获取该指令的操作码opcode_k和操作数operands_k;
步骤4.16、首先判断该指令操作码是否为方法调用指令,若不是,则进入步骤4.110,若是则进入步骤4.17;
步骤4.17、由于只能确定该条指令为方法调用,则需要进一步判断调用的方法是否为属于第三方库不可调用的权限API,如果不是,则进入步骤4.110,如果是,则进入步骤4.18;
步骤4.18、生成替换函数;
步骤4.19、直接对不合法权限API调用进行替换,替换为空操作函数;
步骤4.110、判断是否对方法mj中所有的指令进行了分析处理,如果是,则进入步骤4.111,如果不是,则跳转到步骤4.15,继续对剩余的指令进行分析处理;
步骤4.111、判断是否对needReplaceAPISet记录中所有的类文件进行了分析处理,如果否,则跳转到步骤4.12,继续对剩余的类文件进行处理,如果是,则结束流程。
而且,如图6所示,替换函数将代替第三方库不合法调用权限API的行为,故该函数无任何实质性的功能,主要是保证参数列表和返回类型与原权限API相同,相同的参数列表和返回类型保证替换后不会破坏mj的方法调用栈结构,确保修改后原程序能正常执行。
具体地,步骤4中替换函数的内部执行包括步骤:
5.1、接收输入参数列表,输入与原权限API参数列表相同;
5.2、替换函数体内部的操作,即无任何实质性的功能操作;
5.3、替换函数的返回值构造,由于第三方库执行的是不合法的权限API调用,所以得不到有效的返回值,故替换函数直接返回无效值。
如图7所示,步骤4中对第三方库的非权限API可疑调用行为进行插桩的操作同样也是本方法的核心操作,此过程根据第三方库安全性分析结果对第三方库的进行重构。根据安全性分析结果needInstruAPISet,该集合记录了第三方库中涉及可疑的非权限API调用的Class文件,插桩操作的主要功能就是对这些class文件进行重写,对此类非权限调用点进行插桩,插桩函数的主要功能是运行时对第三方库的访问受权限保护的ContentProvider和IntentAction行为进行合法性检查,对不合法的敏感资源访问进行拦截。重写的原理与操作5类似,也是分析类方法的指令,对方法调用指令进行过滤分析,对属于needInstruAPISet的API调用进行插桩。插桩过程的实施仍然借助ASM字节码操作框架直接对第三方库字节码文件进行重构。而且,本过程主要是根据第三方库安全性分析结果needInstruAPISet,对相关的字节码文件中出现的可疑非权限API调用进行插桩,以便运行时限制第三方库的访问权限。
具体地,步骤4中对第三方库的非权限API可疑调用行为进行插桩包括步骤:
步骤4.21、输入第三方库中可疑非权限API调用记录needInstruAPISet,方法调用指令操作码集mtdCallOpSet;
步骤4.22、取needInstruAPISet中classFileItem_i及其中可疑非权限API调用集susAPISet_i;
步骤4.23、利用ASM框架,读取类文件classFileItem_i,对类中的方法逐一的进行分析处理,本步取类方法mj进行处理;
步骤4.24、提取mj中的所有指令,并保存在临时变量mj_InsnSet中;
步骤4.25、对所有指令进行逐一分析,本步取出一条指令insn_k,并获取该指令的操作码opcode_k和操作数operands_k;
步骤4.26、首先判断该指令操作码是否为方法调用指令,若不是则进入步骤4.210,若是则进入步骤4.27;
步骤4.27、判断调用的方法是否为属于第三方库不可调用的权限API,若不是则进入步骤4.210,若是则进入步骤4.28;
步骤4.28、生成插桩函数;
步骤4.29、直接对可疑的非权限API调用点插桩,在访问前插入插桩函数;
步骤4.210、判断是否对方法mj中所有的指令进行了分析处理,若是进入步骤4.211,若不是跳转到步骤4.25继续对剩余的指令进行分析处理;
步骤4.211、判断是否对needInstruAPISet记录中所有的类文件进行了分析处理,若没有完成则跳转到步骤4.22,继续对剩余的类文件进行处理;如果是,则结束流程。
如图8所示,步骤4中插桩函数的内部功能主要是运行时对可疑的非权限API的访问行为进行检查。根据受权限保护资源的分类,除了权限API之外,一些保存敏感信息的系统ContentProvider和由Intent启动的敏感操作也受权限保护,但是访问ContentProvider和通过Intent启动敏感操作都是通过不受权限保护的API(即非权限API)进行的,本方法将此类API称为可疑的非权限API。由于难以通过静态分析来确定相关非权限API是否进行敏感资源调用,故需要对该API调用进行插桩,以便在运行时通过对参数进行检查。涉及Content Provider访问的关键参数为ContentProvider的Uri值,涉及敏感操作启动的关键参数为IntentAction值。为了简化图示部分,本过程中将访问Content Provider和启动其他操作的插桩函数整合在一起说明。而且,插桩函数的主要功能是运行时对关键参数Uri、IntentAction检查。
具体地,步骤4中插桩函数的内部执行包括步骤:
步骤6.1、接收输入参数列表值,如果涉及敏感Content Provider访问,则执行步骤6.2,如果涉及启动敏感操作,则执行步骤6.7;
步骤6.2、检查涉及敏感Content Provider访问的关键参数uriValue;
步骤6.3、判断uriValue值是否属于illegalUriSet,若是,则进入步骤6.6,若不是,则进入步骤6.4;
步骤6.4、表示ContentProvider访问为合法的访问行为,并进行正常的ContentProvider访问;
步骤6.5、返回正常的ContentProvider请求结果;
步骤6.6、表示访问ContentProvider行为是不合法的操作,对其访问行为进行拦截,并返回无效值;
步骤6.7、检查涉及启动敏感操作的关键参数intentActionValue;
步骤6.8、判断intentActionValue是否属于illegalIntentActionSet,若是则进入步骤6.11,若不是则进入步骤6.9;
步骤6.9、表示启动外部操作为合法的操作请求,则向外发送正常intent action启动外部操作;
步骤6.10、表示外部操作完成并返回正常的请求结果;
步骤6.11、表示操作为不合法的调用行为,对其访问行为进行拦截并返回无效值,并结束流程。
对于本领域技术人员而言,显然本发明不限于上述示范性实施例的细节,而且在不背离本发明的精神或基本特征的情况下,能够以其他的具体形式实现本发明。因此,无论从哪一点来看,均应将实施例看作是示范性的,而且是非限制性的,本发明的范围由所附权利要求而不是上述说明限定,因此旨在将落在权利要求的等同要件的含义和范围内的所有变化囊括在本发明内。不应将权利要求中的任何附图标记视为限制所涉及的权利要求。
此外,应当理解,虽然本说明书按照实施方式加以描述,但并非每个实施方式仅包含一个独立的技术方案,说明书的这种叙述方式仅仅是为清楚起见,本领域技术人员应当将说明书作为一个整体,各实施例中的技术方案也可以经适当组合,形成本领域技术人员可以理解的其他实施方式。
Claims (8)
1.一种安卓应用程序中不可信第三方库访问权限控制方法,其特征在于,包括如下步骤:
步骤1、对第三方库的权限进行分配;
步骤2、对第三方库的不可调用API集合进行分析,根据第三方库被分配的权限,结合权限与API的映射关系,分析得出第三方库的不可调用API集合;
步骤3、对第三方库的系统API调用安全性进行分析,根据第三方库不可调用的权限API集合、及涉及敏感信息访问的非权限API集合,分析记录第三方库中涉及这两类API的调用信息,具体过程包括如下步骤:
步骤3.1、输入第三方库文件classFiles、不可调用的权限API集合illegalAPISet、可疑的非权限API集合susAPISet;
步骤3.2、初始化分析结果非法权限API调用记录needReplaceAPISet、可疑非权限API调用记录needInstruAPISet;
步骤3.3、取出classFiles的字节码文件classFileItem_i进行分析;
步骤3.4、利用反编译工具javap对选取出来的字节码文件classFileItem_i文件进行反编译,得到class文件的中间码格式文件,并提取中间码中常量池的内容;
步骤3.5、取出常量池中的所有方法引用,并保存在类方法引用集合methodRefSet_i中;
步骤3.6、遍历methodRefSet_i中的元素,即对class文件中出现的方法引用methodRefItem_j逐一分析;
步骤3.7、对于字节码常量池中出现的方法引用methodRefItem_j是否属于不可调用的权限API集合illegalAPISet进行判断,若是,则进入步骤3.8;若不是,则进入步骤3.9;
步骤3.8、第三方库出现的方法引用methodRefItem_j是属于不可调用的权限API集合illegalAPISet的,调用行为是非法的权限API调用行为,则需要将当前classFileItem_i和methodRefItem_j记录到needReplaceAPISet中;
步骤3.9、由于字节码常量池中出现的引用字节码文件methodRefItem_j不属于illegalAPISet,则需要进一步判断引用字节码文件methodRefItem_j是否属于可疑的非权限API集合susAPISet的,如果是,则进入步骤3.10,如果不是,则进入步骤3.11;
步骤3.10、如果引用字节码文件methodRefItem_j属于可疑的非权限API集合susAPISet,则将当前classFileItem_i和methodRefItem_j记录到needInstruAPISet中;
步骤3.11、判断当前class文件的所有方法引用是否完成安全性分析,如果是,则进入步骤3.12,如果剩余方法引用未完成完全性分析,则跳转到步骤3.6;
步骤3.12、安全性结果保存,即保存needReplaceAPISet、needInstruAPISet两部分内容,以供字节码重构模块使用;
步骤4、根据代码安全性分析结果,在第三方库代码中加入访问控制策略,所述访问控制策略包括:
对第三方库的权限API不合法调用行为进行替换,根据代码安全性分析结果中关于第三方库中出现的权限API不合法行为,对其进行替换操作;
对第三方库的非权限API可疑调用行为进行插桩,根据代码安全性分析结果中关于第三方库中出现的非权限API可疑调用行为,对其进行插桩操作。
2.根据权利要求1所述的安卓应用程序中不可信第三方库访问权限控制方法,其特征在于,步骤1具体包括如下步骤:
步骤1.1、根据第三方库的附加说明信息提取出第三方库申请的访问权限;
步骤1.2、根据库功能依次对第三方库申请的访问权限的合理性进行分析;
步骤1.3、为某条权限申请是否为合理性判定过程,如果为不合理的权限申请,则直接跳转到步骤1.5,如果为合理的权限申请,则进入步骤1.4;
步骤1.4、将合理的权限申请条目加入第三方库权限配置文件ThirdLib_Permissions.xml文件中,并进入步骤1.5;
步骤1.5、判断是否对所有的第三方库权限申请条目分析完成,如果存在权限申请条目未进行分析,则跳转到步骤1.2继续进行分析;如果已完成对所有的权限申请条目合理性分析,则结束权限分配流程。
3.根据权利要求2所述的安卓应用程序中不可信第三方库访问权限控制方法,其特征在于,ThirdLib_Permissions.xml文件中为对第三方库访问权限的分配。
4.根据权利要求1所述的安卓应用程序中不可信第三方库访问权限控制方法,其特征在于,步骤2具体包括如下步骤:
步骤2.1、将第三方库的权限集合保存在第三方库权限集合ThirdLibPermissionSet中;
步骤2.2、初始化第三方库合法权限API调用可调用的权限API集合legalAPISet的过程,初始值为空,即不包含任何可调用的权限API;
步骤2.3、逐条取出ThirdLibPermissionSet的权限Pi,将Pi与权限API映射关系表MappingAPIList进行匹配或查找;
步骤2.4、对匹配结果进行判断,如果判断Pi出现在MappingAPIList中,则进入步骤2.5,如果MappingAPIList不包含Pi,则进入步骤2.6;
步骤2.5、记录合法权限API,如果Pi出现在MappingAPIList中说明第三方库可以调用受权限Pi保护的API,则将受Pi保护的所有API添加到legalAPISet集合中;
步骤2.6、判断对ThirdLibPermissionSet中所有条目是否都已完成匹配查找,如果否,则跳转到步骤2.3,如果是,则进入步骤2.7;
步骤2.7、经过权限匹配分析,得到第三方库可调用的权限API集合legalAPISet,第三方库不可调用的权限API集合illegalAPISet取可调用的权限API集合legalAPISet的差集即可。
5.根据权利要求1所述的安卓应用程序中不可信第三方库访问权限控制方法,其特征在于,步骤4中对第三方库的权限API不合法调用行为进行替换具体包括如下步骤:
步骤4.11、输入第三方库非法权限调用记录needReplaceAPISet方法调用指令操作码集mtdCallOpSet;
步骤4.12、取needReplaceSet中classFileItem_i及其中所包含的非法权限API调用集illegalAPISet_i;
步骤4.13、利用ASM框架,读取类文件classFileItem_i,对类中的方法逐一的进行分析处理,本步取类方法mj进行处理;
步骤4.14、提取mj中的所有指令,并保存在临时变量mj_InsnSet中;
步骤4.15、对所有指令进行逐一分析,本步取出一条指令insn_k,并获取该指令的操作码opcode_k和操作数operands_k;
步骤4.16、首先判断该指令操作码是否为方法调用指令,若不是,则进入步骤4.110,若是则进入步骤4.17;
步骤4.17、由于只能确定该条指令为方法调用,则需要进一步判断调用的方法是否为属于第三方库不可调用的权限API,如果不是,则进入步骤4.110,如果是,则进入步骤4.18;
步骤4.18、生成替换函数;
步骤4.19、直接对不合法权限API调用进行替换,替换为空操作函数;
步骤4.110、判断是否对方法mj中所有的指令进行了分析处理,如果是,则进入步骤4.111,如果不是,则跳转到步骤4.15,继续对剩余的指令进行分析处理;
步骤4.111、判断是否对needReplaceAPISet中所有的类文件进行了分析处理,如果否,则跳转到步骤4.12,继续对剩余的类文件进行处理,如果是,则结束流程。
6.根据权利要求5所述的安卓应用程序中不可信第三方库访问权限控制方法,其特征在于,步骤4中替换函数的内部执行包括步骤:
5.1、接收输入参数列表,输入与原权限API参数列表相同;
5.2、替换函数体内部的操作,即无任何实质性的功能操作;
5.3、替换函数的返回值构造,由于第三方库执行的是不合法的权限API调用,所以得不到有效的返回值,故替换函数直接返回无效值。
7.根据权利要求5所述的安卓应用程序中不可信第三方库访问权限控制方法,其特征在于,步骤4中对第三方库的非权限API可疑调用行为进行插桩包括步骤:
步骤4.21、输入第三方库中可疑非权限API调用记录needInstruAPISet方法调用指令操作码集mtdCallOpSet;
步骤4.22、取needInstruAPISet中类文件classFileItem_i及其中可疑非权限API调用集susAPISet_i;
步骤4.23、利用ASM框架,读取类文件classFileItem_i,对类中的方法逐一的进行分析处理,本步取类方法mj进行处理;
步骤4.24、提取mj中的所有指令,并保存在临时变量mj_InsnSet中;
步骤4.25、对所有指令进行逐一分析,本步取出一条指令insn_k并获取该指令的操作码opcode_k和操作数operands_k;
步骤4.26、首先判断该指令操作码是否为方法调用指令,若不是则进入步骤4.210,若是则进入步骤4.27;
步骤4.27、判断调用的方法是否为属于第三方库不可调用的权限API,若不是则进入步骤4.210,若是则进入步骤4.28;
步骤4.28、生成插桩函数;
步骤4.29、直接对可疑的非权限API调用点插桩,在访问前插入插桩函数;
步骤4.210、判断是否对方法mj中所有的指令进行了分析处理,若是进入步骤4.211,若不是跳转到步骤4.25继续对剩余的指令进行分析处理;
步骤4.211、判断是否对可疑非权限API调用记录needInstruAPISet中所有的类文件进行了分析处理,若没有完成则跳转到步骤4.22,继续对剩余的类文件进行处理;如果是,则结束流程。
8.根据权利要求7所述的安卓应用程序中不可信第三方库访问权限控制方法,其特征在于,步骤4中插桩函数的内部执行包括步骤:
步骤6.1、接收输入参数列表值,如果涉及系统敏感内容提供器Content Provider访问,则执行步骤6.2,如果涉及启动敏感操作,则执行步骤6.7;
步骤6.2、检查涉及敏感Content Provider访问的关键参数uriValue;
步骤6.3、判断uriValue值是否属于非法Uri集合illegalUriSet,若是,则进入步骤6.6,若不是,则进入步骤6.4;
步骤6.4、表示ContentProvider访问为合法的访问行为,并进行正常的ContentProvider访问;
步骤6.5、返回正常的ContentProvider请求结果;
步骤6.6、表示访问ContentProvider行为是不合法的操作,对其访问行为进行拦截,并返回无效值;
步骤6.7、检查涉及启动敏感操作的关键参数intentActionValue;
步骤6.8、判断关键参数intentActionValue是否属于illegalIntentActionSet,若是则进入步骤6.11,若不是则进入步骤6.9;
步骤6.9、表示启动外部操作为合法的操作请求,则向外发送正常intent action启动外部操作;
步骤6.10、表示外部操作完成并返回正常的请求结果;
步骤6.11、表示操作为不合法的调用行为,对其访问行为进行拦截并返回无效值,并结束流程。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810387894.2A CN108763924B (zh) | 2018-04-26 | 2018-04-26 | 一种安卓应用程序中不可信第三方库访问权限控制方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810387894.2A CN108763924B (zh) | 2018-04-26 | 2018-04-26 | 一种安卓应用程序中不可信第三方库访问权限控制方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108763924A CN108763924A (zh) | 2018-11-06 |
CN108763924B true CN108763924B (zh) | 2022-04-22 |
Family
ID=64011941
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810387894.2A Active CN108763924B (zh) | 2018-04-26 | 2018-04-26 | 一种安卓应用程序中不可信第三方库访问权限控制方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108763924B (zh) |
Families Citing this family (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109255235B (zh) * | 2018-09-17 | 2021-08-24 | 西安电子科技大学 | 基于用户态沙箱的移动应用第三方库隔离方法 |
CN111221733A (zh) * | 2020-01-06 | 2020-06-02 | 北京小米移动软件有限公司 | 信息处理方法、装置、移动终端及存储介质 |
CN111400757B (zh) * | 2020-03-13 | 2022-09-27 | 西安电子科技大学 | 防止安卓第三方库中native代码泄露用户隐私的方法 |
CN114491553B (zh) * | 2022-01-02 | 2024-05-14 | 西安电子科技大学 | 基于多粒度匹配的Android第三方功能库检测方法 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104408366A (zh) * | 2014-11-26 | 2015-03-11 | 清华大学 | 基于插装技术的安卓应用程序权限使用行为跟踪方法 |
CN106446672A (zh) * | 2016-07-25 | 2017-02-22 | 中国科学院大学 | 一种Android第三方类库权限隔离方法及装置 |
CN106951786A (zh) * | 2017-03-30 | 2017-07-14 | 国网江苏省电力公司电力科学研究院 | 面向安卓平台的移动应用权限安全分析方法 |
CN107066878A (zh) * | 2017-01-19 | 2017-08-18 | 国网江苏省电力公司电力科学研究院 | 一种面向安卓平台的移动应用安全防护方法 |
CN107358103A (zh) * | 2017-07-20 | 2017-11-17 | 国网上海市电力公司 | 基于敏感函数调用插桩的安卓敏感行为监控方法和系统 |
-
2018
- 2018-04-26 CN CN201810387894.2A patent/CN108763924B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104408366A (zh) * | 2014-11-26 | 2015-03-11 | 清华大学 | 基于插装技术的安卓应用程序权限使用行为跟踪方法 |
CN106446672A (zh) * | 2016-07-25 | 2017-02-22 | 中国科学院大学 | 一种Android第三方类库权限隔离方法及装置 |
CN107066878A (zh) * | 2017-01-19 | 2017-08-18 | 国网江苏省电力公司电力科学研究院 | 一种面向安卓平台的移动应用安全防护方法 |
CN106951786A (zh) * | 2017-03-30 | 2017-07-14 | 国网江苏省电力公司电力科学研究院 | 面向安卓平台的移动应用权限安全分析方法 |
CN107358103A (zh) * | 2017-07-20 | 2017-11-17 | 国网上海市电力公司 | 基于敏感函数调用插桩的安卓敏感行为监控方法和系统 |
Also Published As
Publication number | Publication date |
---|---|
CN108763924A (zh) | 2018-11-06 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108763924B (zh) | 一种安卓应用程序中不可信第三方库访问权限控制方法 | |
US7937693B2 (en) | System and method for obfuscation of reverse compiled computer code | |
US7254586B2 (en) | Secure and opaque type library providing secure data protection of variables | |
Bouffard et al. | Combined software and hardware attacks on the java card control flow | |
KR101503785B1 (ko) | 동적 라이브러리를 보호하는 방법 및 장치 | |
Holzinger et al. | An in-depth study of more than ten years of java exploitation | |
Linn et al. | Protecting Against Unexpected System Calls. | |
JP4892167B2 (ja) | ディジタル・データ保護構成 | |
US7607122B2 (en) | Post build process to record stack and call tree information | |
CN109255235B (zh) | 基于用户态沙箱的移动应用第三方库隔离方法 | |
US6862683B1 (en) | Method and system for protecting native libraries | |
Arasteh et al. | Forensic memory analysis: From stack and code to execution history | |
El-Harake et al. | Blocking advertisements on android devices using monitoring techniques | |
CN113779578A (zh) | 移动端应用的智能混淆方法和系统 | |
Abbadini et al. | Lightweight cloud application sandboxing | |
Tanner et al. | Protecting android APPS from repackaging using native code | |
Qiu et al. | Libcapsule: Complete confinement of third-party libraries in android applications | |
CN111475168A (zh) | 一种代码编译方法及装置 | |
Lanet et al. | Memory forensics of a java card dump | |
Durães et al. | A methodology for the automated identification of buffer overflow vulnerabilities in executable software without source-code | |
Bouffard et al. | Accessing secure information using export file fraudulence | |
Holzinger et al. | A Systematic Hardening of Java's Information Hiding | |
Metula | Managed code rootkits: hooking into runtime environments | |
Amusuo et al. | Preventing Supply Chain Vulnerabilities in Java with a Fine-Grained Permission Manager | |
Bao et al. | DroidPro: An AOTC-based bytecode-hiding scheme for packing the android applications |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |