安卓应用升级的安全性补丁检测方法

文档序号:29049305发布日期:2022-02-25 23:20阅读:221来源:国知局
安卓应用升级的安全性补丁检测方法

1.本发明涉及一种信息安全领域的技术,具体涉及一种用于安卓应用升级的安全性补丁检测方法。


背景技术:

2.对于程序的安全性补丁和功能性更新区分,现有的方案大多是通过特定的模式进行匹配,或者利用详细的更新信息进行分析,但是这些方案在真实场景下会存在很多局限:使用模式匹配的方式只能提取特定模式的更新补丁,无法应对复杂的真实场景引入的代码修复,定义的模式需要依据安全分析人员的经验;除开源项目外,安卓应用的更新描述非常简略,通常只有“修复已知问题”的提示。


技术实现要素:

3.本发明针对现有技术对于应用更新补丁分析的不足,提出一种安卓应用升级的安全性补丁检测方法,能够通过对升级前后版本的安卓应用进行差分分析获得程序分析中存在的安全相关的补丁,达到减少安全审计人员分析的目标和学习新的漏洞模式的目标。大幅度降低安全工作者分析的目标。能够抵御常见程序混淆,且不需要对源代码进行侵入式改变。不需要依赖安全工作者的经验定义安全补丁模式,能够定位到更加复杂的安全性补丁。
4.本发明是通过以下技术方案实现的:
5.本发明涉及一种安卓应用升级的安全性补丁检测方法,通过还原升级前后的安卓应用程序结构层次和反汇编代码特征值,在升级前后安卓应用程序之间进行函数匹配,对更新补丁所在函数的所有调用点进行数据流分析,建立更新补丁所在的升级前后的两个版本函数的控制流图,在控制流图上提取与可变参数有关的数据依赖和控制依赖并根据依赖关系得到安全性检测结果。
6.所述的结构层次包括:包的层次结构、包与类的包含关系、类和嵌套类的所属关系、类包含的成员变量字段和成员方法。
7.本发明涉及一种实现上述方法的系统,包括:补丁定位模块、调用点分析模块和补丁判定模块,其中:补丁定位模块定位升级补丁所在的函数,调用点分析模块定位补丁函数的调用站点并确定是否接受可变参数,补丁判定单元判定函数的更新是否与安全相关。技术效果
8.本发明通过补丁定位模块建立类和其嵌套类的关系,减少具有较少特征的嵌套类在两个版本之间匹配时的误报;并且考虑函数在程序结构中的特征进行两个版本之间的匹配,从而获得优于已有方法直接在函数之间进行匹配的效果,其中补丁判定模块没有使用传统模式匹配的方式进行匹配安全性补丁的模式,而是通过对比更新前后的函数中对可变参数使用的一致性来判断补丁是否为安全性补丁,能够定位到更复杂的安全性补丁。
附图说明
9.图1是本发明的整体流程图;
10.图2为定位补丁所在函数的流程;
11.图3为对补丁所在函数的调用点分析流程;
12.图4为判定是否为安全补丁的流程。
具体实施方式
13.如图1所示,为本实施例涉及的一种安卓应用升级的安全性补丁检测方法,包括以下步骤:
14.步骤1、如图2所示,通过还原升级前后的安卓应用程序的结构层次和反汇编代码特征值,在升级前后应用程序之间进行函数匹配,具体包括:
15.步骤101.对升级前后的安卓应用文件进行解包,反汇编程序的字节码,其中:安卓应用程序的反汇编代码为smali代码;反汇编后的应用程序后,程序的每个类以单独的“.smali”后缀的文件形式存在。
16.步骤102.构建程序的结构层次:通过解包安卓安装包文件后,遍历文件目录获得包与包的层次结构和包与类的包含关系;通过解析反汇编后单个的smali文件获得类包含的成员字段和成员方法,通过smali代码的注解类或通过启发式规则获取类和嵌套类的所属关系。
17.所述的成员字段以标识符“.field”开头,成员方法的内容以标识符“.method”开头,“.end method”结束。
18.所述的smali代码的注解类中,包含嵌套类关系的注解类为:ldalvik/annotation/memberclasses、ldalvik/annotation/enclosingclass和ldalvik/annotation/enclosingmethod。
19.所述的启发式规则,针对无注解的类(大多为lambda表达式),以确定是否为嵌套类,该规则包括:
20.a.只在一个类或其所属的类中被调用;
21.b.实现某个接口;
22.c.有静态初始化方法的类,只有1或者2个成员变量,并且都是静态成员,其中一个静态成员类型为它自身;无静态初始化方法的类,必须有构造方法,并且构造方法的的参数列表包括其所有的成员,参数列表第一个为其所属的类。
23.步骤103.将自定义标识符、资源常量id,指令跳转地址进行模糊处理后计算函数的模糊哈希及其基本块的模糊哈希值作为反汇编代码特征值,具体为:首先划分函数的基本块,提取基本块中指令的操作符和常量字符串,以及在运算中涉及到的常量等不易被程序混淆影响部分作为基本块的特征。对于基本块的特征计算哈希作为基本块的特征值。将基本块特征值进行排序后再次进行计算哈希,获得基本块位置无关的哈希,再加上函数的参数类型和函数属性标志,计算函数的特征值。
24.步骤104.对比两个版本程序的反汇编代码特征值,遍历步骤102中还原的层次结构,在两个应用的层次结构中具有等价关系的函数集合中进行相互匹配,并以特征值相似度最高的函数为匹配函数,输出函数匹配关系,将所有的函数标记为新增、删除、变化或相
同中的一个,标记为变化的函数被视为潜在补丁所在的函数。
25.所述的函数标记中,

具有完全相同特征值的函数对被标记为相同;对于特征值不同的函数,通过基本块的特征值计算函数的相似度,即具有相同特征值的基本块的长度之和占整个函数长度的比例;

特征值相似度超过0.2且不等于1(可根据精度需要调节)的函数被认为是相似的函数;具有最高相似度的函数被视为变化;

新版本应用程序中不具有相同/变化函数的函数标记为新增;

旧版本应用程序中不具有相同/变化函数的函数标记为删除。
26.步骤2、如图3所示,对补丁所在函数的所有调用点进行数据流分析,判断补丁所在函数在调用点是否接受外部可变的参数,具体包括:
27.步骤201.缓存步骤1得到的标记为变化的函数并将其标为污点槽函数,在应用程序的每个函数内进行污点分析,具体为:建立以语句为单个节点的函数控制流图,遍历控制流图的每个节点:当语句包含函数参数使用、成员变量使用或者外部函数调用中的任一,并且该语句具有左值,则将语句的左值变量标记为被污染值,否则分析语句的右值表达式是否包含被污染值的使用,如果右值表达式使用到被污染值则将左值视为被污染,否则将左值定为未被污染;当节点包含对事先定义的污点槽函数的调用,则保存当前槽函数使用参数的污点状态。
28.所述的控制流图,其节点为函数的一条指令。
29.所述的污点槽函数是污点分析所关注的是否会被污染的函数调用,这里使用从补丁定位模块输出的变化函数作为污点槽函数。
30.该步骤基于开源的安卓漏洞检测工具(find security bugs)中的污点分析引擎实现,原污点分析引擎对于一条包含槽函数的语句只会报告一个它使用的被污染的参数,本发明提取污点函数的所有参数是否被污染的情况,以支持步骤202的结果聚合。
31.步骤202.按照槽函数的调用点对记录的结果聚合并输出同一个调用点的槽函数对应所有被污染的参数的索引以及调用点所在的函数,具体为:确定相同调用点的槽函数的所有参数是否被污染;对于同一个调用点,合并不同的污染路径得到的污染结果。
32.步骤3、如图4所示,在控制流图上提取与可变参数有关的数据依赖和控制依赖,根据依赖关系得到安全性检测结果,具体包括:
33.步骤301.提取更新后的版本中能够被污点传播的槽函数,当其在旧版本中对应的函数是同样能够被污点传播的槽函数,对两个槽函数的调用点进行匹配,确认其调用点所在的函数是否具有匹配关系,即为相同或者变化的函数。当存在匹配关系,则视为该函数对的此调用点和其该污染状态之间具有匹配关系,进行下一步分析;否则不会使用此污染状态的匹配进行下一步的分析。
34.步骤302.建立更新前后两个版本的控制流图,控制流图的节点为一条指令,在控制流图上对调用点能够匹配的函数对以及该调用点匹配的污点状态进行函数内的依赖提取;分别对两个函数的控制流图进行遍历,在控制流图上标记所有与被污染参数具有直接和间接数据依赖关系的节点,并记录这些节点所有的控制依赖节点,按照函数的基本块合并控制依赖和数据依赖结果。
35.所述的数据依赖关系包括:直接数据依赖和间接数据依赖;对于赋值表达式的左值变量对右值表达式中使用到的所有变量具有直接数据依赖关系,数据依赖具有可传递
性,当变量a依赖于b,b依赖于c,那么c对于a具有间接数据依赖;对于条件分支语句内的指令都对该条件分支语句具有控制依赖关系,当遍历到分支汇聚点,则后续的指令对该条件分支无控制依赖关系。
36.步骤303.对调用点能够匹配的函数进行基于控制流图结构及其基本块指令的匹配,具体为:先将步骤302中使用的单条指令级别的控制流图转换为以基本块为节点的控制流图,分别对两个函数的控制流图进行遍历,使用控制流图上基本块的遍历顺序和基本块包含的特征指令作为基本块的特征,在两个函数之间进行基本块的匹配。
37.所述的基本块以广度优先的顺序进行遍历,遇到环状结构和函数的出口点停止遍历。
38.所述的特征指令包括:函数调用、return语句、条件语句、异常语句、数组访问语句和包含非资源id的常量值的语句。
39.由于两个函数的控制流结构的改变,匹配结果中可能存在基本块之间具有一对一,一对多,多对多的匹配结果。
40.步骤304.生成安全性检测结果,具体为:对比匹配的基本块所涉及到的数据依赖和控制依赖,当函数对之间的匹配的基本块之间提取的所有控制依赖和数据依赖都相同,则将该函数的更新视为非安全补丁;当不同时,则视为安全性补丁。
41.经过具体实际实验,在搭载ubuntu20.04系统,amd ryzen threadripper 3970x处理器,256g ram的服务器上进行测试,测试数据集包含441对安卓应用程序的更新前后的版本,结果显示在总共36,337,758个函数中,定位到224,112个函数为变化函数,共计报告39,081个函数包含安全性补丁,说明本发明可以大幅度降低安全审计的目标;在随机抽取结果进行人工分析证实,在报告结果中存在多种模式安全性补丁,其中包括但不限于空指针引用检查,异常捕获,黑/白名单过滤,去除程序中硬编码密钥使用等;在时间开销上,83.64%的应用程序的更新对可以在5分钟内分析完毕,89.55%的更新对可以在10分钟内分析完毕,96.17%的更新对可以在20分钟内分析完毕,说明此发明在真实场景下可以使用。
42.上述具体实施可由本领域技术人员在不背离本发明原理和宗旨的前提下以不同的方式对其进行局部调整,本发明的保护范围以权利要求书为准且不由上述具体实施所限,在其范围内的各个实现方案均受本发明之约束。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1