基于静态污点分析和符号执行的安卓应用漏洞挖掘方法与流程

文档序号:12064201阅读:1383来源:国知局
基于静态污点分析和符号执行的安卓应用漏洞挖掘方法与流程

本发明属于网络与系统安全领域,具体涉及安卓应用漏洞挖掘方法,可用于由外部注入引起的安卓程序漏洞的分析和研究。



背景技术:

污点传播分析是根据数据依赖关系对程序进行分析的一种技术,常用于检测二进制程序中与数据相关的漏洞,比如隐私泄露漏洞和组件劫持漏洞等。按照是否需要目标程序运行,污点传播分析可分为静态和动态两种类型。

静态污点分析方法,相对基于多次执行的动态污点分析,只需要执行一次就可以得到整体分析结果,具有分析路径更全面和效率更高的优点。其分析过程主要利用了控制流分析和数据流分析技术,其中:

控制流分析,是针对程序控制流的静态分析技术,先根据程序执行方向将代码解析成一个有向图G=(B,E),其中B是基本程序语句构成的节点集合{B1,B2,…,Bn},E是有向边集合{(Bi,Bj),(Bk,Bl),…},其中边(Bi,Bj)表示在某个执行序列中Bj位于Bi之后;然后通过对图连通性质的研究来提取代码中的可达路径以及路径之上的约束求解。

数据流分析,其过程是从程序代码中收集程序的语义信息,并通过代数的方法确定程序中变量的定义和使用情况。优势是可以不必实际运行程序就能够发现程序数据方面的特性,并发现其中存在的问题。

静态污点分析方法的检测目标包括,污染源函数source函数和陷入函数sink函数这两种函数,其中:

污染源函数source,是数据流记录的起点,在执行路径上所有与source存在数据依赖关系的变量都将被标记为污染数据;

陷入函数sink,是数据流记录的终点,如果有污染数据进入sink就可认为存在安全隐患。

对于安卓程序的静态污点分析大多数应用于研究领域。已知的静态的污点分析系统多用于检测程序的隐私泄露,却不适用于挖掘程序漏洞。以目前最为精确的安卓程序静态污点分析系统FlowDroid为例,其执行流程如图1所示,当把其用于对安卓程序漏洞进行挖掘时会十分乏力,主要存在以下缺陷:

1.当前的静态污点分析系统为了追求自动化,极少为用户提供自定义接口,其分析的目标一般由安全机构硬编码到分析系统中,是固定的分析起点和终点集合,限制了漏洞分析的范围。

2.当前的静态分析系统执行时会分析整个程序的所有数据流,其中包含着大量与用户意愿不一致的数据流目标。相对于一个程序控制流的数量,数据流往往会多出数倍,并且由于语言特性,其分析过程也相当复杂,所以冗余的数据流分析会直接造成静态污点分析巨大的内存消耗和时间花费。

3.由于静态污点分析具备“一次性全面分析”的理论特性,其分析过程是“路径不敏感”的,即分析过程中遇到条件分支语句,无法辨别程序走向,只能全路径分析,如果不引入新的技术进行优化,这会导致最终分析结果可能产生误报,例如可能会报出一条污染路径,但是在程序的执行中,该路径会因为条件语句的控制而完全不可达。



技术实现要素:

本发明的目的在于针对传统的安卓程序静态污点分析过程中的缺陷,提出一种基于静态污点分析和符号执行的安卓应用漏洞挖掘方法,以扩展静态污点分析系统对漏洞挖掘类型的范围和针对性,减少静态污点分析挖掘漏洞过程中的内存和时间消耗,提高漏洞挖掘结果的精确度。

为实现上述目的,本发明的技术方案包括如下:

1)配置分析目标并解析源码:

1a)构造两个链表结构,分别用来保存用户定义在配置文件中的污染源函数source和陷入函数sink;

1b)输入安卓程序源码,调用开源java语义分析工具soot对二进制源码进行逆向拆解,输出可读的中间语言代码存储在内存中;

2)控制流分析:

2a)调用java开源分析工具soot,输入步骤1b)生成的中间语言代码,输出函数内控制流图CFG到内存中;

2b)遍历步骤2a)生成的控制流图CFG,收集其中的函数调用语句,从这些函数调用语句中直接提取出函数调用关系,用这些函数调用关系的集合作为函数调用图CG,利用该调用图CG与2a)生成的控制流图CFG共同构成过程间控制流图ICFG;

2c)构造一个无参数的空函数D,把过程间控制流图ICFG中所有的入口都加入D函数中,使D成为过程间控制流图ICFG的总入口;

3)用户确认source函数:

3a)构造一个函数集合M,从2d)中的D函数开始,遍历过程间控制流图ICFG,并将遍历过程中遇到的全部函数加入集合M中;

3b)从3a)得到的函数集合M中寻找source函数,将source函数在程序中的位置写入文本文件中,并输出给用户;

3c)用户对3b)的文本文件进行选择,系统根据选择结果更新记录source函数的链表;

4)数据流分析:

4a)以3)中的D函数为起点,遍历过程间控制流图ICFG,每次提取图中的一个节点;

4b)对4a)提取的节点进行判断,当提取到的节点包含source函数时,记录该语句节点上的变量为污染数据;

4c)对4a)提取的节点进行判断,当提取到的节点不包含source函数或sink函数时,调用开源静态污点分析工具FlowDroid中的数据流函数F进行数据污染传递;

4d)对4a)提取的节点进行判断,当提取到的节点包含sink函数的时,检查污染数据是否在当前的sink函数中,若是,则以当前sink函数为终点生成一条污染路径;

4e)遍历完过程间控制流图ICFG后,结束数据流分析,并生成污染路径集合来记录4d)生成的所有污染路径;

5)静态符号执行:

5a)遍历4e)中生成的污染路径集合,每次读取一条污染路径L;

5b)记录污染路径L中分支语句的条件表达式,并用字母符号替换条件表达式中的变量,生成符号表达式;

5c)新建文本文件SF.smt2,按照可满足性理论2.0版本SMT2的标准格式,将5b)收集的符号表达式进行字符串拼接,并写入文本文件SF.smt2中;

5d)调用微软公司的符号约束求解器Z3求解文本文件SF.smt2中的符号表达式,若求得符号表达式无解,就将当前污染路径L从污染路径集合中删除,否则不做处理;

5e)求解完所有的污染路径后,若污染路径集合不为空,则警告用户程序存在漏洞,并且打印污染路径集合,若为空,则提示无漏洞。本发明与现有技术相比具有以下优点:

1.本发明采用配置文件设定用户需求的方式,与传统的分析系统相比,分析的目标不再是直接由权威的安全机构给出的危险函数,而是根据用户需求进行设定,可以使分析对于特定的漏洞更具有针对性,进而提高效率和漏洞分析可用性。

2.本发明将用户的选择结合到了程序分析过程的开始和中间阶段,增加了程序分析的运行效率,相对于传统的全面数据流分析过程,待分析程序被切割成了原来的一部分,极大节省了程序分析所需的内存。

3.本发明将符号执行的方法结合到安卓程序静态污点分析中,解决了静态污点分析方法自身路径不敏感问题,使分析结果更加准确。

附图说明

图1为传统的安卓程序静态污点分析工具-FlowDorid的分析流程图;

图2为本发明的实现总流程图;

图3为本发明中的控制流分析子流程图;

图4为本发明中的用户确认source函数子流程图;

图5为本发明中的数据流分析子流程图;

图6为本发明中的静态符号执行子流程图。

具体实施方式

在当今的社会中,移动智能设备的用户数量已经远远超过了主机端的用户数量,安卓手机用户又在终端用户中占绝大部分,而安卓系统框架的开源特性使得安卓手机应用一直是漏洞频现的重灾区,这严重影响到了个人信息安全和社会安全。

在当前的技术条件下,对于安卓手机应用程序的漏洞挖掘主要使用的动态分析方法,虽然准确性较高但是需要程序分析人员有丰富的安全分析经验,并且手动的动态分析会耗费大量的人力资源和时间。因此如何更高效自动地对安卓应用进行漏洞挖掘成为了信息安全领域一个亟待解决的问题。

本发明基于程序静态污点分析的理论,在开源java分析框架soot和安卓静态污点分析工具FlowDroid的基础上,增加了用户交互的过程,结合了静态符号执行的技术,针对安卓手机应用中由外部输入引起的漏洞提出了一种新的漏洞挖掘方法。下面结合附图,对本发明做进一步详细的说明。

参照图2,本发明的实施步骤如下:

步骤1,配置分析目标并解析源码。

1a)整个程序分析开始之前通过配置文件的方式设定程序的分析起点和分析终点,即设置的污染源函数source和陷入函数sink,通常将暴露在外部的函数设置为source函数,将程序内部执行关键逻辑的函数设置为sink函数,如果经过分析能得到从污染源函数source到陷入函数sink的有可达路径,则表示存在一条潜在的安全漏洞;

所述source函数与sink函数均用函数签名的方式在文本文件中表示,函数签名的表示形式为“<包名+类名+返回值+函数名+参数>”,函数签名在一个项目中唯一标识一个函数,程序读取后用链表记录在内存中,分别命名sourceList和sinkLsit。相对于图1中传统针对隐私泄露静态分析中固定分析起点的方式,用户的选择使得静态污点分析对于特定漏洞更具备针对性,分析的函数范围也可以根据用户需求而扩展;

1b)在进行程序分析时,通过程序所在的绝对路径查找被分析程序所在位置,并通过java开源分析框架soot实现对于安卓字节码程序的逆向拆解,即使用开源分析框架soot生成语法简洁的中间语言jimple的表示形式,使所有源程序的字节码变量对应到中间语言表示的新数据结构中,从而完整的表达程序的控制流信息和数据传递信息。

步骤2,控制流分析。

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

2a)调用java开源分析框架soot的控制流生成功能,即用soot对1b)中的中间语言表示形式进行转化得到函数内控制流图CFG,转化过程是将每条语句对应成一个控制流图节点Bi,并根据执行顺序在每条语句上保存其前驱节点Bp和后继节点Bs

2b)生成调用图CG:

绝大部分程序的执行会涉及函数调用,当函数之间存在调用关系时,就需要进行函数调用关系的模拟,即解析代码中的函数调用语句,将调用函数和被调用的函数进行映射,并将映射关系用HashMap的数据结构保存在调用语句节点中,生成相应的调用图CG;

2c)将调用图CG和函数内控制流图CFG复合生成一个新的类,该类称为过程间控制流图ICFG,该图用于描述整个被分析程序的;

2d)读取安卓程序配置文件manifest.xml:

读入安卓程序的manifest.xml主配置文件,即通过提取文件中<activity>标签下的元素,获取安卓程序的组件名;

2e)根据安卓程序的组件名,从控制流图ICFG中找到对应的组件的回调函数和安卓生命周期函数,将这些函数以函数调用的形式添加到一个统一的空函数中,该函数命名为D,作为过程间控制流图ICFG的总入口点。

步骤3,用户确认source函数。

该步骤的目的是通过对程序控制流实施剪枝来精确分析对象减少内存消耗,在挖掘由外部输入引发的漏洞时,没有必要分析程序中所有的source,可以让用户根据漏洞的已知的情况来选择分析程序的一部分而非整体,这是本发明的着重优化点。

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

3a)创建可达函数集合M:

3b)从D函数开始,循环提取过程间控制流图ICFG中每个节点的后继节点:

若提取到的节点包含函数调用,则将被调函数的函数名和函数调用的位置保存在集合M中,否则,就忽略提取到的节点;

3d)从可达函数集合M中的函数取出一条函数,将该函数与1a)的sourceList链表中的source函数进行函数签名匹配:

若不匹配,就将函数从可达函数集合M中删除,否则,就保留该函数在可达函数集合M中;

3e)构造文本文件sourceSelect.txt,将可达函数集合M中的函数签名和函数位置写成字符串输出到文本文件sourceSelect.txt中;

3f)等待用户对文件sourceSelect.txt的内容进行筛选;

3g)读入用户筛选后的文件sourceSelect.txt,将其中的函数签名和函数位置取出放入ArrayList<String,String>型的链表中,并用该链表替换1a)的source函数链表sourceList;

步骤4,数据流分析。

该步骤的目标是通过标记污染数据,传递污染数据和追踪污染数据这些手段将程序执行过程中数据的传递记录下来,并分析source函数和sink函数之间是否有数据的交互关系,其主要流程是根据图的深度搜索算法在控制流图中提取语句节点,分析语句节点上的数据,对其中用户关心的数据进行污染记录。

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

4a)新建一个污点数据集合T,用来记录污点数据;

4b)以2e)中的D函数为起点,根据图的深度遍历算法遍历过程间控制流图ICFG,每次提取该控制流图ICFG中的一个节点,进行判断:

若提取到的节点包含source函数,则将该语句上所有的变量加入到污点数据集合T中,产生初始污点数据,并以每个污点数据为头节点,新建若干条污染链表TLi;由于步骤3中加入了用户的source函数选择,所以更新后的source函数链表会有大规模的缩减,标记为污点的数据也会大量减少,因此相对于传统的静态污点分析方法,本发明数据流分析过程所需的内存和时间也会大量减少;

若提取到的节点不包含source函数或sink函数,则调用开源静态污点分析工具FlowDroid中的数据流函数F进行数据污染传递,即通过函数F将被污点数据影响的变量加入污点数据集合T,并根据污染来源在对应污染链表TLi中记录变量间的污染关系;所述F函数是工具FlowDroid中对污染传递规则的代码描述;

若提取到的语句节点包含定义的sink函数,则进一步判断sink函数是否使用了污点数据集合T中的变量:如果是,就将当前的sink函数作为尾节点添加到对应的污染链表TLi中,当前的污染链表TLi就构成了一条完整的污染路径,否则,不作处理;

4c)当4b)中过程间控制流图ICFG的遍历结束之后,数据流分析随之结束,此时收集所有的污染链表TLi构成污染路径集合。

步骤5,静态符号执行过滤。

该步骤主要是用静态符号执行的技术对静态污点分析过程产生的分析结果进行验证性过滤,以实现提高静态污点分析精确度的要求。

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

5a)遍历4c)中生成的污染路径集合,每次读取一条污染路径Li

5b)从污染路径Li的尾节点开始逆向的查找,并以字符串形式记录污染路径中经过的if条件语句与条件变量的数据依赖,该字符串称为条件表达式;

5c)用字母符号替换条件表达式中的条件变量,构成符号表达式;

5d)将符号表达式用“与”的逻辑运算符连接起来,并按照可满足性理论2.0版本SMT2的标准添加控制命令,写入文本文件SF.smt2中;所述可满足性理论2.0版本SMT2,是用逻辑表达式进行问题描述的一种公用标准,通过使用支持SMT2标准的约束求解器可以求解按照SMT2标准描述的问题,得到该问题是否有解;

5e)调用微软公司的符号约束求解器Z3求解文本文件SF.smt2中的符号表达式,并判断返回结果:

若求得符号表达式无解,就标明该条污染路径Li是程序执行过程中不可能实现的,将当前污染路径L从污染路径集合中删除;

若求得的符号表达式有解,则保留污染路径Li在污染路径集合中;

所述Z3解析器是微软公司开发的支持SMT2标准的约束解析器,对符号执行中的符号表达式求解有良好的性能;

5f)求解完污染路径集合中所有的污染路径后,判断污染路径集合是否为空:若不为空,警告用户程序存在漏洞,并且打印污染路径集合,否则,提示用户分析结束没有找到漏洞。由于本发明增加了静态符号执行过滤的过程,相对于传统的静态污点分析方法,最终输出的漏洞警告避免了“路径不敏感”问题,精确度更高。

以上描述仅是本发明的一个具体实例,不构成对本发明的任何限制,显然对于本领域的专业人员来说,在了解本发明内容和原理后都可能在不背离本发明原理、结构的情况下进行形式和细节上的各种修正和改变,但是这些基于本发明思想的修正和改变仍在本发明的权利要求保护范围之内。

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