《System Service Call-oriented Symbolic Execution of Android Framework with Applications to...》论文阅读笔记

System Service Call-oriented Symbolic Execution of Android Framework with Applications to Vulnerability Discovery and Exploit Generation

用于Android框架与应用程序的面向系统服务调用的符号执行来进行漏洞发现和漏洞利用生成

概要

Android应用程序框架上的一个漏洞可以被利用导致大规模的网络攻击,并对用户的安全和隐私造成严重的危害,然而现在大多数现有研究仅限于分析Android应用程序,而很少有开发用于分析Android框架的技术和工具。文献提出了第一个用于Android框架的符号执行系统,Centaur。为了避免由于复杂的初始化而导致状态空间爆炸问题,提出了分阶段的从具体执行到符号执行(PC2SE),在初始化阶段运行具体执行,为符号执行提供执行上下文。而在执行上下文中存在大量的变量,微小污染分析(slim tainting)跟踪特征访问模式,用以识别从恶意应用程序到出的变量,并作为符号输入。为了实现解耦设计,将符号执行器从Android中分离出来,将具体执行提供的执行上下文从Android ART进程迁移到Java VM。最后文章对这个系统进行了评估,评估表明Centuar在漏洞发现和漏洞利用方面都非常有效。

问题与解决方案

问题:现有的研究大多局限于分析Android应用程序,很少有技术和工具是为分析Android框架而研发的,且先前的工作中没有通过符号执行来分析Android框架的。本文的动机是填充这方面的空白。

解决方案:设计开发出一个能够实现对Android框架的代码进行符号执行的系统(Centaur),然后根据给出的利用Android框架的新型攻击的描述,将系统应用于准确和自动地查找零日漏洞实例,并生成PoC漏洞以验证结构。

方案难点

由于Android框架的中间件性质和复杂性会导致以下难点:

难点1:Android框的初始化阶段很复杂,如果符号执行从main入口进行,会导致路径爆炸问题,如果跳过初始阶段,直接分析一个服务接口方法,会导致上下文信息(比如变量的类型和值)丢失,如何处理上下文信息丢失是一个难题。
解决方案:采用一种结合具体执行和符号执行的分析方案,提出了PC2SE,先运行初始化阶段作为全系统的具体执行,然后根据具体执行提供的执行上下文,从中间件的一个入口点方法开始执行符号执行。

难点2:Android应用程序框架包含了大量为系统服务和应用程序保存的数据结构,而给定的一个恶意软件派生出来的变量以对象字段和数组元素的形式散布在众多的数据结构中,难点在于如何在大量复杂的数据结构中识别来自调用应用程序的变量,并作为符号输入。

传统解决方法:为确定指定app派生出来的变量,传统方法是通过污点分析追踪从app到Android框架的信息流,但是这样非常复杂,且现存的污点分析方法只能追踪指定的系统服务调用流返回的信息,而不是从整个app应用层次来分析,且分析结果不精确。

解决方案:不是跟踪信息从应用程序流向框架的方式,而是假设当框架服务app调用时存在用于访问app特定信息的固定模式(基于数组的变量使用索引来获取app的信息,基于哈希表的变量使用包名作为访问元素的关键),根据这个模式如何在系统服务调用时访问app特定变量,设计一个称为微小污染的污点分析方法,在路径探索过程中精确和自动地确定app特定变量,并作为符号输入识别。

难点3:如果将符号执行引擎放在Android系统中,虽然可以使分析器利用主机执行环境,但是这样使得符号执行器的实现变得非常复杂,且由于各种不兼容问题使系统变得脆弱而难以调试同时耦合性高,如何设计实现可以利用Android执行环境而不会导致复杂的和耦合的架构是一个难题。

解决方案:提出一种解耦设计的新型架构,适用于PC2SE,通过在Android系统外构建符号执行引擎,但是仍然能够利用Android执行环境。该系统的创新和关键组件是将Android中生成的信息(如类和对象)迁移到符号执行环境。

符号执行

符号执行适合漏洞发现的原因:

1、  能够有效和自动地探索所有可能的路径,能够发现尽可能多的漏洞实例

2、  对于探索的每个路径,记录描述路径被采用时输入值应该满足的条件的符号表达式,即路径条件

Slim Tainting

由污染源(taint sources)、污染传播逻辑(taint propagation logic)、污染池(taint sinks)组成


如何确定符号输入:

首先通过应用程序的唯一标识UID或者包名作为污染源,然后根据污染传播逻辑传播,最后通过get函数将通过被污染的索引访问到的元素设置为符号输入。

Centaur的体系架构


在Android系统上执行具体执行,Android系统和符号执行引擎之间的执行上下文查询服务器用于将上下文信息从Android中移植到符号执行引擎

执行上下文移植

只有执行上下文中的堆(类和对象的集合)需要被移植

Snapshot:快照,执行上下文中的堆内存映像。

● 移植快照中捕获的堆信息需要解决的三个问题:

1、  如何获得快照中位和字节的语义

2、  在符号执行过程中如何进行移植

3、  如何引导移植

● 移植算法存在的问题与解决方案

存在的问题:对于引用类型字段,深层复制太低效,而对于简单的浅层复制,引用值将因其只显示具体执行环境中对象的位置(快照捕获的地方)而不起作用

解决方案:选择一个变形的简单的浅层复制,当移植对象时,简单地复制所有的字段值,但是对于每个引用类型字段,标记它为对具体执行环境中的一个引用值,然后当使用这种引用类型字段中的来访问目标对象时,目标对象将被移植,或者如果目标对象已经被移植则在符号执行环境中将这个字段值用这个引用值更新。

● 哈希表conc2Sym:将具体执行环境中的引用值映射到符号执行环境中的引用值●

维护哈希表的目的:1、防止对象的重复移植  2、将存在在哈希表中的具体执行环境中的引用值转为符号执行环境中的引用值

● 如何移植一个对象

1、  如果对象是字符串,则算法现在虚拟机的运行时常量池中搜索具有相同值的字符串已进行符号执行,如果没找到则在符号执行环境中创建一个具有相同值的新字符串

2、  如果对象是数组,则会分配一个数组将所有元素复制到新数组中。因为该算法是浅拷贝,所以如果是多维数组,只复制顶层数组中的元素,当要调用其他元素时必须调用aaload指令,这也是为了移植多维数组而改写aaload的解释的原因。由于浅拷贝在访问对象的引用前不会复制数组对象。

3、  对于普通对象,通过分配一个新对象并复制所有字段来处理。

引导字段

对引导字段的访问能够触发第一个对象的移植。引导字段位于测试驱动程序类中,它是对包含入口点方法的系统服务类的调用。下图为移植一个堆的例子

可疑漏洞的验证

传统的验证方法:用基于可达性分析的静态分析来查找ISPE bugs可能会导致假阳性,由于一些路径在实际执行中是不可行的。目前,主要是通过人工检查每条报告路径的代码,但是这样是费力且乏味的,也难以验证手动检查结果的正确性。

本文的解决方法:结合静态分析和符号执行来查找ISPE bugs。对于静态分析报告的每个可疑漏洞,Centaur:(1)找到能到达敏感操作的所有可行路径(2)给出每个可行路径所需的权限(3)验证可行路径之间的权限一致性(4)生成执行可行路径的输入来验证可疑漏洞

贡献

1、  第一个支持Android框架的符号执行系统,提供了一种在Android框架中自动和精确探索路径的方法,可以潜在地应用于其他复杂中间件的符号执行。

2、  分别分析中间件的服务接口方法,大大提高可扩展性同时提供了完整的执行上下文。

3、  提出了一种新颖的污染分析技术来精确识别从给定的app出来派生的框架变量。

4、  在Android系统外构建符号执行器,设计出将执行上下文信息从Android迁移到符号执行器的强大算法。

不足

1、Centaur只能执行Java代码的符号执行


PS:如果本人关于Centaur的理解有误,欢迎指出,我将及时更正。另外文中图片来自于文献截图~


猜你喜欢

转载自blog.csdn.net/qq_22408539/article/details/77752872