GDAblog-中国首款交互式Android反编译器

GDA数据流分析使用向导

作者:gjden

时间:2018115

一、FlashFlow污点分析引擎简述

一直以来,学术界都试图将数据流分析技术应用现实的安全分析中,但常常会出现很多问题,比如环境配置复杂、不够稳定、速度慢、路径爆炸问题、内存消耗大、硬盘爆炸问题等等,使得实际应用起来非常不方便,大部分被应用于学术研究中。因而2018年开始写了一个为公开的轻量级静态污点分析引擎--FlashFlow,基本可以解决以上比较尖锐的问题,大概年末的时候完成了引擎的测试,后加入到了GDA反编译器的发布版本中(从GDA3.62开始了支持了变量和寄存器的追踪)。FlashFlow是一个以模拟人工分析的方式工作的高速数据流分析引擎。数据流分析速度非常快,在我的不完全测试中(仅仅拿了flowdroid进行对比测试:把flowdroid中的SourcesAndSinks.txt特征导入,通过对apk的代码进行全面扫描测试),通过对大部分主流APP的进行数据流分析以报告隐私泄露情况,FlashFlow都能在几秒内完成扫描分析,并报告出隐私泄露的结果,而flowdroid基本上需要花费几分钟甚至数10个小时才能完成一次分析。80%以上的apk样例的测试速度比flowdroid快100倍以上,极端的情况下高达500倍。有少部分apk文件,我实现的轻量级引擎只需要2秒的世界,而flowdroid会花费7个多小时。

FlashFlow采用上下文无关的数据流分析算法,可实现任意位置任意变量或寄存器的追踪,并且无需对环境进行初始化,无需做任何配置。这样使得FlashFlow可以GDA反编译器进行很好的结合,成为一个极为简单易用的辅助功能。该功能可对单个变量和寄存器进行分析(隐私扫描功能目前仅用于测试,没有开放在GDA反编译器中),目前支持smali代码下的任意寄存器的值数据流分析,以及java代码中对一个method的参数和返回值进行数据流分析。

二、GDA操作向导

1. Java代码数据流分析

首先我们以一个简单的例子来说明GDA中FlashFlow功能的使用方法。如下图的方法摘自于一个恶意APP。

该方法会获取当前设备的ID并返回带有ID的字符串,一般情况下,我们会通过交叉引用找到该方法的调用,然后继续往下分析。但有时候,该方法的调用者太多或者调用者对返回值的处理逻辑太过复杂,但是我们却并不关心中间的处理过程,我们只关心该设备ID最终会去往什么地方,是写入了某个文件,还是被上传到互联网,又或者是以短信方式发送给了某个手机号码等等。此时基于污点追踪的数据流分析就能大大的简化这一分析过程,在GDA中我定义了包含文件写入、网络传输、短信发送等等操作的锚点,通过FlashFlow分析后,这些锚点都被高亮标记出来,以此可以快速决定该变量的流向。在此处,我们无需做任何上下文配置,只需简单按下快捷键’F’,便会弹出如下对话框:

然后选择并双击其中一项进行分析。这里p0,p1是当前方法的参数,ret是返回值。在这个案例中我们希望追踪返回值,所以双击ret便会弹出分析结果:

上图中,对话框的左边是正向传播的结果,右边是反向传播的结果,每一个节点代表返回值传递过程中所流过的节点(节点以单个指令为单位),其中第一个节点为起始方法。

其中,返回值v0反向传播到语句“v0 = "6&"+p0.getSystemService("phone").getDeviceId();”后结束,反向传播的节点为空。这里我们主要看对话框的左边,左边部分是正向传播的分析结果,此处我们可以看出返回值所经历的每一个节点,这里的节点我做了过滤,只展示了该变量所经过的方法,其他节点(如数据传输指令节点、逻辑运算指令节点、算数运算指令节点等等)没有显示出来。

通过正向传播的分析结果中可以明显的看出,该返回值的数据流向了两个敏感位置(高亮的锚点方法),分别为:android.util.Log.d和android.telephony.SmsManager.sendTextMessage,这表明方法com.itcast.cn112.a.a所获取设备ID信息最后会被记录到日志中,并且会以短信的方式发送到指定手机上。

展开节点,我们还可以看到数据流向的目的寄存器、调用的层级和数据流节点所在的方法,如下图,数据流到调用Log.d方法时,存储在寄存器v1中,调用层级为3,数据流当前处在com.itcast.cn112.a.d方法中。

如果想进一步分析数据流出现的上下文逻辑,我们可以点击节点,GDA会反编译节点所在的方法,并高亮显示数据流所处的位置。如图:

2.Smali代码数据流分析

在smali代码中,我们可以选取任意一个寄存器进行追踪分析。Smali代码中可以有三种选择:正向分析,反向分析和双向分析。以如下图所示的方法为例。

如果想对007处的v1进行正向分析,我们可以右键->Taint-Follow. 窗口右边便会弹出分析结果对话框。

此外右键菜单里还有Taint-Source(反向数据流分析),Taint-Bidirection(双向数据流分析)。在反向数据流分析时,分析结果展示是所有的指令节点,没有进行过滤,方便一些细节的呈现。同时也将一些有意义的结果进行了高亮,如寄存器值的来源是一个字符串,便会做高亮显示。

同样,通过点击这些节点,GDA可对节点所处的方法进行反编译并且对节点指令进行高亮显示。

有任何问题和建议,请留言。

三、结论

可见,FlashFlow应用在GDA中可以非常灵活的做污点传播分析(或者污点分析),并且速度极快。由于FlashFlow数据轻量级的数据流分析引擎,所以也会有许多不足之处,还请见谅。后续我还会对该引擎进行持续的优化改进,感谢各位支持。