基于控制依赖分析的Android远程控制类恶意软件检测
李京哲, 梁彬, 游伟, 王鹏, 石文昌
中国人民大学 信息学院, 北京 100872

作者简介: 李京哲(1988—), 男(汉), 吉林, 助理研究员。E-mail:lijingzhe@ruc.edu.cn

摘要

为检测Android远程控制类恶意软件,该文通过对实际的该类软件进行分析,提出一种基于控制依赖分析的动态污点检测方法。动态污点分析技术是一种检测恶意软件的主流技术。该文对传统的动态污点分析进行扩展以检测Android远程控制类恶意软件。首先采用静态分析确定条件转移指令的控制范围; 再使用静态插桩在目标应用中添加分析控制依赖的功能。插桩后的应用可在运行时检查敏感操作是否控制依赖于污染数据,进而对远程控制类恶意软件进行有效的分析和检测。该文实现了一个原型检测系统。实验结果表明: 应用此方法可以有效地检测出实际的Android远程控制类恶意应用。

关键词: 远程控制类恶意软件; 动态污点分析; 控制依赖
中图分类号:TP309.2 文献标志码:A 文章编号:1000-0054(2014)01-0008-06
Control dependency analyses for detecting remote control Android malware
Jingzhe LI, Bin LIANG, Wei YOU, Peng WANG, Wenchang SHI
School of Information, Renmin University of China, Beijing 100872, China
Abstract

A method is given to detect remote control Android malware using a control dependency analysis based on real-world malware characteristics. The malware is detected using dynamic taint analysis. An extended dynamic taint analysis method is used to detect remote control malware. A static analysis is used first to identify the control range of the conditional instructions, and the static instrumentation technique insered into the target application to track the control dependence. The instrumented application can then check whether the current sensitive operation depends on the tainted data at runtime. Then users can then effectively analyze and detect remote control malware. A prototype system based on the method shows that this method effectively detects real remote control malware.

Keyword: remote control malware; dynamic taint analysis; control dependence

恶意软件给Android手机安全带来了极大的危害,它们常常窃取用户的隐私、消耗资费或者破坏手机的正常功能。较为复杂的Android恶意软件还常常具有远程控制功能。在Jiang等的研究中[1],其所发现的1 260个Android恶意软件样本中有1 172个样本可被归为远程控制类。在网秦公司2013年发布的安全报告[2]中, 22%的Android恶意软件归为远程控制类,该比例仅次于资费消耗类的27%。

针对Android平台上恶意软件的分析和检测, Jiang等开发了DroidRanker[3], 根据对已知恶意软件的特征检测恶意软件的变种,并根据启发式规则发现未知的恶意代码。该启发式规则将程序动态加载的Dalvik字节码认为是可疑的。该方法不能针对远程控制类恶意软件进行检测。一些研究通过静态分析Android程序的代码,检查程序是否存在可能的恶意行为。例如, Christian等开发的FlowDroid[4]使用数据流分析检测Android隐私泄露类恶意软件。类似的静态分析工具还有Gibler 等开发的AndroidLeaks[5]。在静态分析中,由于存在很多不可判定的问题[6],分析结果常常存在误报和漏报。静态方法无法适用于高精度的分析和检测。

在恶意软件的分析和检测方面,该技术是一种主流的技术[7]。该方法通过在程序运行时对污染数据(taint data)进行跟踪以发现程序的恶意行为,将分析目标限制在程序实际运行的路径上,具有很高的精确性。具有代表性的是针对隐私泄露恶意行为Enck等的TaintDroid[8]和Lok等的DroidScope[9]。TaintDroid在Dalvik虚拟机上添加污点分析的功能, DroidScope则是对Android模拟器进行修改。

动态污点分析可以直接用于检测敏感操作使用网络数据这样的远程控制类恶意软件。在检测过程中,来自网络的数据被标记为被污染的,通过动态污点分析跟踪污染数据的传播,在敏感操作所在的程序点上检查特定的数据是否是污染的。但是,在远程控制类恶意软件中,并不是所有的敏感操作都使用非可信的数据。例如Geinimi恶意软件[10]在执行删除短信记录恶意操作时,其敏感操作不使用非可信数据,而仅仅使用程序内部的数据。动态污点分析无法直接用于检测敏感操作和非可信数据不存在数据依赖关系的远程控制类恶意软件。

通过对典型的Android远程控制类恶意软件样本进行分析,可以发现其中与程序恶意功能直接相关的敏感操作通常控制依赖于非可信的数据。因此,针对控制依赖的分析可以检测远程控制行为。虽然一些在x86平台的动态污点分析工作已经考虑到基于控制依赖传播的隐式信息流,如DTA++[11]、 Dytan[12]等,但是隐式信息流的分析更关注控制依赖下的污染信息的传播,而针对远程控制行为的分析则关注污染数据是否可能控制驱动敏感的操作。

为检测Android远程控制恶意软件,本文提出了一种引入控制依赖分析的动态污点分析方法。该方法根据后支配树(post dominator tree, PDT)分析条件转移指令的控制范围,在此基础上,使用静态插桩技术在目标软件中插入动态污点分析和控制依赖分析的实施代码。使得程序在运行时,可以检查敏感操作是否控制依赖于非可信数据,进而对Android远程控制类恶意软进行分析和检测。

1 典型远程控制类恶意软件分析

Android远程控制类恶意软件常常具有多种恶意功能。以Genimi恶意软件为例,其可以根据网络控制命令有选择地执行发送短信、拨打电话、删除手机短信记录等敏感操作。

图1给出了Geinimi实现发送短信和删除手机短信记录操作的反编译代码片段。在发送短信的过程中,其使用的短信号码以及短信内容等关键数据,即变量 b c的取值,都来自网络。在删除短信记录的操作中,程序查找手机的短信记录中是否包含了网络数据所指定的电话号码,其中 s2的值是一条短息记录中的电话号码, as[ l1]的值是一个来自网络的字符串。如果短息记录中的电话号码包含了指定的号码,程序将根据变量 s的值,即短息记录的标识(Identity, ID), 删除该短信记录。

图1 Geinimi实现发送短信和删除短信记录的关键代码片段

对于图1所示的情况,利用传统的动态污点分析可以有效地检测远程控制发送短信的情况。其方法是将来自网络的数据标记为被污染的,利用动态污点分析跟踪污染数据在程序中的传播,检查敏感操作sendTextMessage的参数是否是污染的。但是,传统的动态污点分析无法检测删除短信记录的情况。主要原因是敏感操作delete所使用的数据并非来自网络的非可信数据。通过分析可以发现,变量as[l1]中的数据来自网络,决定delete操作是否执行。敏感操作delete控制依赖于来自网络的非可信数据。

恶意程序还可以利用Java程序的多态性实现远程控制。图2给出了Geinimi根据网络数据选择执行恶意操作的代码片段。在代码片段中,方法 a( x[ i])的返回值可能是来自网络的数据或者是空值。如果其取值非空,程序将根据 x[ i]的不同取值构造一个继承类com.ericliu.cg5.main.b.a的不同类型的对象,并将其存入容器中。在此之后,程序依次将容器中的对象取出,并调用对象的 b方法。不同类型对象的 b方法执行不同的恶意行为。方法 a( x[ i])的返回值,即来自网络的非可信数据,对 a1的类型具有控制作用,决定了程序调用哪个类的 b方法,使程序选择执行不同的敏感操作。这些敏感操作实际上都控制依赖于网络非可信数据。

图2 Geinimi选择控制操作的代码片段

通过上述分析可以发现,在Android远程控制类恶意软件中,一些敏感操作控制依赖于非可信数据。然而,当前的动态污点分析工具仅仅跟踪数据依赖上的污点传播,无法判断敏感操作是否控制依赖于非可信的数据。

2 方法及实现

引入控制依赖分析(control dependence analysis)的动态污点分析方法,通过分析目标程序所执行的敏感操作是否控制依赖于非可信数据,判断程序是否存在远程控制恶意行为。

在传统的动态污点分析的基础上,引入一个特殊的污染标签记录当前程序的执行路径是否受到非可信数据的控制。如果某个敏感操作在执行时,此污染标签记录了非可信数据的信息,则该敏感操作控制依赖于该非可信数据。由于Android应用常是多线程的,这个特殊的污染标签可以选择添加在线程上。为了避免过度污染所引起的误报问题,还需要在条件控制转移指令的控制结束处,对由该条件转移指令所引入的污染标记进行去除。为此,需要根据PDT在代码中确定条件转移指令的控制结束处来在合适位置插入相应的污染清除代码。

此外,在动态污点分析中,如果污染数据传播到条件控制转移指令上,污染数据的污染标签将赋值给线程污染标签。由于在动态污点分析中,不同类型数据的污染标签以不同的方式进行存储,所以获得污染数据的污染标签需要预知数据类型。分析寄存器的数据类型和构建PDT都需要用到控制流图(control flow graph, CFG)。

2.1 整体流程

使用静态方法对Android程序的Dalvik字节码进行分析,构建CFG和PDT。利用PDT在代码中确定条件转移指令的控制结束处。使用G分析条件转移指令的寄存器的数据类型。基于这些分析结果在程序字节码中插入动态污点分析和控制依赖分析的实施代码,在程序运行时分析和判断敏感操作是否控制依赖于非可信的数据。主要过程如图3所示。

图3 Android远程控制类恶意软件的检测流程

1) 解包Android应用程序,得到其Dalvik字节码文件classes.dex以及程序的资源文件和配置文件;

2) 对classes.dex文件中Dalvik字节码进行静态分析。为程序实现的每一个方法构建其CFG和PDT, 并分析条件转移指令所使用的寄存器的数据类型;

3) 通过静态插桩在目标程序中插入动态污点分析和控制依赖实施分析的代码,得到插过桩的classes.dex;

4) 将插过桩的classes.dex和资源文件和配置文件一起打包并签名,得到插过桩的应用程序;

5) 将插过桩的应用程序安装到手机中并运行。在程序运行时,检查在非可信数据控制的路径上是否存在被执行的敏感操作。

2.2 解包、打包和签名

解包过程主要为了获得应用程序的Dalvik字节码文件classes.dex, 随后的静态分析过程将把字节码文件作为分析对象。静态插桩过程也将在字节码层面进行,在其中插入动态污点分析和控制依赖分析的实施代码。打包过程将插过桩的classes.dex和解包得到的资源文件及配置文件一起打包成未签名的Android程序压缩包。该压缩包经过签名得到插过桩的Android应用程序。

2.3 静态分析

静态分析的目的是为静态插桩过程提供数据支持,主要包括程序的CFG、 PDT以及条件转移指令使用的寄存器的数据类型等。利用该数据支持,静态插桩过程可以在特定的程序点插入相应的控制依赖分析的实施代码。

2.3.1 构建CFG

CFG是用于描述程序控制流结构的有向图。其结点是基本块,基本块中的指令顺序执行。CFG的有向边表示结点之间存在控制转移。CFG有唯一的入口和出口结点。本方法为程序所实现的每一个方法构建CFG。构建CFG的目的是为了在CFG的基础上构建PDT并且分析寄存器的数据类型。

构建CFG可以采用编译技术中的经典方法[13]。通过解析classes.dex可以得到程序实现的每一个方法的Dalvik指令序列。通过分析其中的条件转移指令等影响程序执行路径的指令,可以将Dalvik指令序列划分为基本块的序列。在此基础上,通过分析每一个基本块中的最后一条指令,可以得到该指令可能的下一条指令的地址。最后根据这些地址信息,将基本块连起来,得到CFG。图4给出了一段示例代码,以及该段代码的CFG和PDT。

图4 示例代码片段以及其CFG和PDT

2.3.2 构建PDT

PDT是用于描述后支配关系的树。其结点是基本块。树中的父节点直接支配子节点。其中,支配关系可以这样理解,如果从节点 a到CFG的出口的所有路径都经过结点 b, 那么 b支配 a, 在后支配树中, a b的子节点或者在 b的子树中。

利用PDT可以得到条件转移指令控制结束的位置。在这个位置处,需要插入代码除去条件转移指令所引入的线程污染标记。在PDT中,条件转移指令所在基本块的父节点的起始处就是该条件转移指令的控制结束处。例如在图4中,第1行的if条件语句在基本块1中,基本块1的父节点是基本块6, 条件语句的控制在9行结束。构建PDT可以使用经典的Lenguer-Torjan[14]算法,这里不再赘述。

2.3.3 分析寄存器数据类型

在动态污点分析中,不同类型的数据的污染标签使用不同的方式存储。如int型数据使用添加的寄存器存储污染标签, string对象则是使用全局数组存储其对象内部数据的污染标签。为获得条件转移指令的寄存器的数据污染状态用于对线程进行标记,需要预知寄存器的数据类型。例如对于指令if-nez v0, cond_1, 为获得 v0的污染状态,需要分析其数据类型是对象数据类型还是基本数据类型。根据插桩代码设计的需要,静态分析仅仅需要检查寄存器是基本数据类型还是对象数据类型。

使用逆向遍历控制流图方法可以相对简单快速地获得寄存器的数据类型。从目标寄存器所在的条件转移指令开始,深度优先逆向遍历CFG, 在可以确定目标寄存器数据类型的指令处停止遍历当前路径。如果多条路径得到的寄存器的数据类型不同,那么将以对象类型进行处理。在条件语句前插桩的代码将对类型不同的情况做出进一步的处理。

2.4 静态插桩

静态插桩通过在Dalvik字节码中插入动态污点分析和控制依赖分析的代码,使程序可以在运行时可以跟踪非可信数据的传播,并分析敏感操作是否受到非可信数据的控制。

静态插桩过程可以基于Baksmali和Smali工具实现。Baksmali可以将Dalvik字节码转化为易于理解的Smali格式的代码。Smali工具可以将Smali代码编译成Dalvik字节码。通过修改Baksmali程序,可以在字节码转化为Smali代码的过程中,添加动态污点分析和控制依赖分析的代码。

2.4.1 污点分析代码的引入

引入非可信数据的程序点将作为污点分析的source点,相应的数据需要被添加污染标记。例如对于获得网络数据的方法调用read(通过分析其接收对象,确定其是否是读网络数据的调用), 调用该方法的程序点将作为source点,从网络获得的数据将被添加污染标签。不同类别的source点获得的数据使用不同的污染标签。例如从网络接收的数据和从短信接收的数据使用不同的污染标签。

sink点是一些和远程控制相关的敏感操作。这些操作,如sendTextMessage(发送短信相关)、 delete(删除短信记录相关)等,如果受到非可信数据的控制,程序将极有可能存在远程控制恶意行为。在sink点的方法调用前,需要添加语句检查敏感操作是否受到污染数据的控制。例如对于delete方法,首先根据其参数的取值检查其是否是一个删除短息记录的操作,如果是,继续检查其执行是否受到污染数据的控制。

为实现对污点数据传播的跟踪,这里在每一条可以带来数据传递的指令前,根据污点传播规则,插入污染值传播指令。例如对于指令move v0, v1在该指令前插入指令move v0 ', v1 ', 其中 v0 ' v1 '分别记录 v0和 v1的污染情况。

2.4.2 控制依赖分析代码的引入

引入控制依赖分析实施代码,程序可以在运行时检查敏感操作是否依赖于非可信的数据。需要在条件控制转移指令前插入代码,根据指令使用的寄存器的污染情况,为当前线程添加污染标记。在条件转移指令的控制结束处,插入代码用于清除该条件转移指令引入的污染标记。

在标记线程执行流的污染状态时,需要区分不同位置的条件转移指令所引入的污染标记。这样做可以保证不同程序点上插入的清除操作都针对与其对应的条件转移指令所引入的污染标记。选择利用基本块的编号对不同条件转移指令引入的污染标记加以区分。例如对于图3所示的示例代码及其CFG和PDT, 如果基本块1中的条件语句中, x带有污染标记 t, 那么条件语句执行前,线程的污染状态将带有污染标记 t, 同时用一个局部变量保留 <1, t>数值对,作为记录污染标记的信息。如果在第3行,变量 y带有污染标记 t2, 程序将保留 <2, t2 >数值对。在基本块4处,程序检查数值对中第一个值为2的数值对是否存在,如果存在则将其去除。在此之后,如果数值对中不存在和 t2相关的数值对,则将线程的污染标记 t2去除。在基本块6处,对数值对进行类似的处理。

此外,恶意程序可能在实现远程控制的过程中利用多态性,如图2所示。为分析利用多态性的控制行为,为程序所实现的每一个类添加一个实例域,用于记录对象实例的污染标记,作为对象的污染标签。如果当前的方法是一个对象的初始化方法,那么在方法的起始处插入代码,将线程的污染标记赋值给对象的污染标记。如果当前的方法是程序实现的非静态方法,在方法的起始处插入代码,对线程的污染标记添加对象的污染标记,并在方法的结束处,为线程除去方法起始处所添加的污染标记。

3 实 验

实验样本取自Geinimi、 GoldDream、 Anserverbot等几个典型的Android远程控制类恶意软件样本集。系统可以成功检测全部15个样本(表1)。

表1 Android远程控制类恶意软件检测结果

实验中,目标软件在插桩后运行时性能有所下降。例如,在Geinimi程序中对比插桩前后程序接收网络命令到执行敏感操作的时间,插桩前为 0.919 s, 插桩后为1.190 s。程序经过插桩都可正常运行,并且性能下降不会对使用造成严重影响。以检测Geinimi恶意软件为例,在图2代码片段的条件转移语句处,静态插桩插入代码在程序运行时获得方法 a( x[ i])返回值的污染标记。该值包含来自网络的数据,程序将当前线程标记为被污染的。在方法com.ericliu.cg5.main.b.e.a中,程序创建了继承com.ericliu.cg5.main.b.a类型的对象,此时线程的污染标记将赋值给该对象的污染标记。之后,在该对象的 b方法被调用时,由于对象标记为被污染的,在方法起始处插入的代码将线程标记为被污染的,并在方法调用结束时,插入的代码对线程的污染状态进行清除。对于图2中代码片,在运行时,方法 b是一个污染对象的方法。直到该方法调用结束,线程都被标识为被污染的。此方法 b调用了静态方法 a, a方法调用了sendText-Messsage方法发送短信,所插入的控制依赖分析代码将发现此敏感操作受到污染数据的控制,将给出提示信息表示目标应用存在可疑的远程控制行为。

4 结 论

本文通过对典型的Android远程控制类恶意软件样本进行分析,发现其中与程序恶意功能直接相关的敏感操作控制依赖于非可信的数据。根据这样的观察分析,本文提出了一种引入控制依赖分析的动态污点分析方法用于检测Android远程控制类恶意软件。该方法首先在Android程序的Dalvik字节码上进行静态分析,构建PDT, 然后利用PDT确定条件转移指令的控制范围; 再使用静态插桩技术在Dalvik字节码上添加动态污点分析和控制依赖分析的实施代码,使得程序在运行时可以在动态污点分析的基础上分析污染数据对程序执行路径的控制。如果程序在执行过程中,敏感操作在污染数据的控制路径上被执行,那么该程序将极有可能存在远程控制恶意行为。该方法本质上是分析敏感操作是否和非可信的数据之间存在控制依赖关系,可以在一定程度上弥补传统的动态污点分析在检测远程控制类恶意软件方面的不足。本文使用上述方法实现了一个针对Android远程控制类恶意软件的原型检测系统,并对实际的远程控制类恶意软件进行检测和分析。实验结果表明,该方法可以有效地检测Android远程控制类恶意软件。

The authors have declared that no competing interests exist.

参考文献
[1] ZHOU Yajin, JIANG Xuxian. Dissecting Android malware: Characterization and evolution [C]// Proceedings of the IEEE Symposium on Security and Privacy. San Francisco, USA: IEEE, 2012: 95-109. [本文引用:1]
[2] 网秦公司. 2013年上半年网秦全球手机安全报告 [Z/OL]. (2013-11-25), http: //cn. nq. com/neirong/2013Q2. pdf.
Wangqin Company. Wangqin global moble phone security in the first half of 2013 [Z/OL]. (2013-10-25), http://cn.nq.com/neirong/2013Q2.pdf. (in Chinese) [本文引用:1]
[3] ZHOU Yajin, WANG Zhi, WU Zhou, et al. Hey, you, get off of my market: Detecting malicious apps in official and alternative Android markets [C]// Proceedings of the Network and Distributed System Security Symposium. San Diego, USA: Internet Society, 2012. [本文引用:1]
[4] Fritz C, Arzt S, Rasthofer S, et al. Highly precise taint analysis for android applications [Z/OL]. (2013-11-25), http://www.bodden.de/pubs/TUD-CS-2013-0113.pdf. [本文引用:1]
[5] Gibler C, Crussell J, Erickson J, et al. AndroidLeaks: Automatically detecting potential privacy leaks in Android applications on a large scale [C]// Proceedings of the 5th International Conference, TRUST 2012. Vienna, Austria: Springer, 2012: 291-307 [本文引用:1]
[6] Schwartzbach M I. Lecture notes on static analysis [Z/OL]. (2013-11-25), http://pp.ipd.kit.edu/lehre/SS2009/compiler2/schwarzbach-static-analysis.pdf. [本文引用:1]
[7] Schwartz E J, Avgerinos T, Brumley D. All you ever wanted to know about dynamic taint analysis and forward symbolic execution [C]// Proceedings of the IEEE Symposium on Security and Privacy. Oakland, USA: IEEE, 2010, 317-331 [本文引用:1]
[8] Enck W, Gilbert P, Chun B G, et al. TaintDroid: An information-fiow tracking system for realtime privacy monitoring on smartphones [C]// Proceedings of the 9th USENIX Conference on Operating Systems Design and Implementation. Vancouver, Canada: USENIX, 2010: 1-6. [本文引用:1]
[9] Yan L, Yin H. DroidScope: Seamlessly reconstructing the OS and Dalvik semantic views for dynamic Android malware analysis [C]// Proceedings of the 21st USENIX Security Symposium. Bellevue, USA: USENIX, 2012: 29-29. [本文引用:1]
[10] Strazzere T, Wyatt T. Geinimi Trojan technical teardown [Z/OL]. (2013-11-25), https://blog.lookout.com/_media/Geinimi_Trojan_Teardown.pdf. [本文引用:1]
[11] Kang M G, McCamant S, Poosankam P, et al. DTA++: Dynamic taint analysis with targeted control-flow propagation [C]// Proceedings of the Network and Distributed System Security Symposium. San Diego, USA: Internet Society2011. [本文引用:1]
[12] Clause J, LI Wanchun, Orso A. Dytan: A generic dynamic taint analysis framework [C]// Proceedings of the 2007 International Symposium on Software Testing and Analysis. New York, USA: ACM, 2011: 196-206 [本文引用:1]
[13] Aho A V, Lam M S, Sethi R, et al. Compilers Principles, Techniques, and Tools [M]. 赵建华, 郑滔, 戴新宇, 译. 北京: 机械工业出版社, 2009
Aho A V, Lam M S, Sethi R, et al. Compilers Principles, Techniques, and Tools [M]. ZHAO Jianhua, ZHENG Tao, DAI Xinyu. Beijing: China Machine Press, 2009
(in Chinese) [本文引用:1]
[14] Lengauer T, Tarjan R E. A fast algorithm for finding dominators in a flowgraph [C]// Proceedings of ACM Transactions on Programming Languages and Systems. New York, USA: Association for Computing Machinery, 1979: 121-141. [本文引用:1]