Group of Software Security In Progress

GoSSIP @ LoCCS.Shanghai Jiao Tong University

EdgeMiner: Automatically Detecting Implicit Control Flow Transitions Through the Android Framework

论文下载

摘要和简介

当下,大多数静态分析工具通过手工添加或者是一些启发式的算法对回调函数建模。比如Flowdroid,通过类似白名单的方式,手工定义了这些可能用到的回调函数,这两种方法是不精确的,并不能完全的分析所有的回调函数,使得一些恶意程序能够通过一些隐式控制流的方法躲避分析工具的检查。

作者根据上述问题,提出一种静态的分析工具EdgeMiner。它能够通过分析整个android框架,寻找框架中描述隐式控制流的注册函数和回调函数对。同时,EdgeMiner的运行结果可以辅助当下比较流行的静态分析工具,提高精确度。

EdgeMiner的分析框架

Fig

  • 回调函数是一种需要应用实现,但是由android框架去调用。由于这种函数的特征,会导致一般绘制调用图的时候没有对应指向的边,当静态分析工具利用不精确的调用图去分析,其结果也是不精确的。
  • 将android的框架源码作为输入
  • 先提取所有可能的回调函数和调用这些回调函数的回调点的列表,然后通过前向数据流分析追踪调用点中事件的起源。如果一个事件作为注册函数的参数传入,那么这个事件可以将用户代码和框架代码连接起来,最后EdgeMiner输出这对registration-callback。

  • 预处理:EdgeMiner首先会将框架中每一个方法翻译成一个SSA的形式,然后提取类的层次结构和接口的定义,然后画出一个近似的call graph。同时,EdgeMiner在图中标记所有可能的回调函数,最后,找出一些描述类的元信息。

  • 前向数据分析:通过在使用-定义链的关系,检查每一个方法的参数传递关系、方法的调用、成员的修改和静态的定义,递归的遍历,直到发现该方法没有调用者或者回调函数的接收对象已经被定义了。

实现

  • 整个EdgeMiner用dx中使用的ROP中间语言实现。
  • 一个近似的调用图需要考虑到反射调用和native代码。
  • 反射调用:根据调用的特征,可以很快找到所有的反射调用。
  • native代码:native代码必须通过dvmCallMethod函数才能调用android的方法,根据这个特征,也能够很快找到所有的调用。

一些影响分析的因素

  1. 通过XML注册的回调函数:这种方法只使用于很少一部分回调函数,而现存在的大多数分析工具都能处理这些情况,没有必要去支持这种功能。
  2. Android Looper:其中消息传递的机制本质就是成员变量的传递,已经囊括在我们的算法中。
  3. IPC:现有的检测工具已经考虑到这种机制的影响,做了相应的处理,不需要再去添加算法。
  4. 同一个注册函数对应的不同回调函数:由于异步事件的存在,算法不能很好的计算回调函数执行的顺序,这个问题将作为作者未来的工作继续研究。

实验

Fig

Fig

在36GB内存的环境中,耗时4个小时,总共发现24089个类,196252个方法。为了检查误报率,手工分析随机抽取的200个样本,发现由于使用近似的调用表,使得有96%的误报率。为了辅助Flowdroid更加精确的分析,修改其源码,对比未修改的版本,准确度有明显的提高。