Android恶意软件沙盒自动化分析原理与实现

【作者】:riusksk(泉哥)
【团队】:腾讯安全应急响应中心
【日期】:2012年10月2日

一、 前言

据网秦发布的《2012年上半年全球手机安全报告》,2012年上半年Android病毒感染量增长迅猛,尤以5、6月最为突出,上半年感染手机1283万部,比2011年下半年增长62%。在全球范围内,中国大陆地区被感染率占居首位。面对增长如此迅速的Android软件,安全研究人员常常需要逆向分析样本,分析出其恶意行为,但手工分析较费时间。在DEX文件反混淆技术的不遍推广和普及下,比如今年的BlackHat就有DEX反混淆的专题及相应工具公布,现在已有很多恶意软件使用到这些反混淆技术,这就加大了样本分析的难度及所花费的时间。本文主要讲述如何利用Android沙盘实现自动化分析恶意软件的方法,其中介绍了Android沙盘的原理,以及由笔者编写的Android沙盘——MalDroidAnalyzer,后面会提供由MalDroidAnalyzer分析真实病毒时自动生成的分析报告。

二、 Android常见恶意软件行为

1、 恶意扣费

病毒在后台发送扣费短信、拔打电话进行恶意扣费,同时会对服务商发回的服务短信进行屏蔽,破坏系统的正常功能,同时对用户造成资费损失。

2、隐私窃取

病毒通过后台服务窃取用户隐私信息,包括通话录音、短信内容、IMEI、IMSI、地理位置、通讯录、浏览器历史记录等信息,然后上传到黑客控制的远程服务器。

3、远程控制

病毒在后台开机自动,并与C&C服务器进行通讯,并从中获取加密的指令,解密后执行相应的恶意操作,也有通过SMS进行控制,构造出botnet,从而大规模地远程控制用户的手机。比如之前著名的AnserverBot病毒,就是通过新浪博客进行远程控制,也是首个利用第三方站点作为C&C服务器的Android病毒。

4、系统破坏

病毒通过系统漏洞进行ROOT提权,并执行高权限操作,在后台静默安装子程序包,或者通过伪造成杀毒软件、提示更新等方式欺骗用户安装第三方恶意程序。病毒可能会更改网络状态、APN,或者替换系统文件、添加恶意书签、屏蔽运营商短信、中止杀软进程等方式进行系统破坏。

5、其它

病毒在后台联网下载大量软件,消耗用户手机流量,或者执行一些比较耗电的操作来消耗手机电量,进而影响正常的手机通信。也有些一些病毒通过钓鱼欺骗等方式,诱骗用户下载伪装软件,导致帐户密码失窃。

三、 Android沙盘原理

本文主要介绍一款Android恶意软件行为自动分析平台——MalDroidAnalyzer,其主要结合静态分析和动态分析技术来实现恶意软件行为自动化分析。MalDroidAnalyzer是笔者使用Perl语言编写的,用于辅助分析Android软件行为,提高恶意软件的分析效率。

首先,MalDroidAnalyzer直接以apk文件作为输入,整个分析过程主要分析两部分:静态分析和动态分析。静态分析会通过反编译apk文件,分析其中的权限、组件、敏感函数等信息,这些可以弥补动态分析中因未触发恶意行为而漏掉的行为。动态分析主要通过在模拟器运行Android软件,然后再对软件进行一些操作以触发尽可能多的恶意行为,接着输出到log中,再通过脚本对日志进行分析。由于Android系统默认情况下,一些输出日志里面缺乏我们所需的信息,比如发送短信时,只在log中记录手机号,而没有短信内容,此时就需要通过修改Android源码或者反汇编system.img中的相关类或者库进行修改,可以在短信发送函数sendTextMessage(位于system.img中的framework/framework.jar)里面添加短信内容的日志输出:

下面是可能需要修改的相关文件,包括源码位置和编译后所对应的相关文件,可根据自身需要进行修改:

1
2
3
4
5
6
7
发送短信:android.telephony.SmsManager(system.img中的framework/framework.jar)
文件操作:org.apache.harmony.luni.platform.OSFileSystem(system.img中的framework/core.jar)
网络操作:org.apache.harmony.luni.platform.OSNetworkSystem(system.img中的framework/core.jar)
拔打电话:android.app.Activity(system.img中的framework/framework.jar)
启动服务:android.content.ContextWrapper(system.img中的framework/framework.jar)
数据加解密:javax.crypto.Cipher(system.img中的framework/core.jar)
核心库:dalvik/vm/native(system.img中的lib/libdvm.so)

关于apk文件及MalDroidAnalyzer的工作流程如下图所示:

1、静态分析

沙盘MalDroidAnalyzer主要在电脑端对APK进行静态分析,通过apktool先进行反编译处理。正常的APK文件主要是以zip格式进行压缩捆绑的文档,里面主要包含AndroidManifest.xml、Classes.dex和res等文件。在反编译后会得到明文的AndroidManifest.xml,里面定义各组件、组件权限和启动位置、软件基本信息等,通过对该xml文件的分析,可以获取到软件名称、包名等基本信息,同时对包含的各个组件进行分析,特别是Broadcast Receiver组件的触发条件,可能就包含有开机自启动项用于启动后台服务,这些在报告中都会被高亮显示出来。

在动态分析过程中,可能由于恶意行为的时间限制,或者模拟器的功能限制(比如蓝牙、Wifi),导致病毒的一些恶意行为无法触发。此时,我们通过检测Android软件调用的API函数可弥补这里的不足,比如发送扣费短信通常会调用sendTextMessage()函数,执行外部命令可能会调用java.lang.Runtime.exec()。下面是笔者收集整理的一些敏感API函数列表,欢迎各位读者补充和改进:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
my %apis = (
"IActivityManager\$Stub\$Proxy\;\-\>shutdown" => '关机',
"ActivityManager\;\-\>killBackgroundProcesses" => '中断进程,可用于关闭杀软',
'ActivityManagerNative;->killBackgroundProcesses' => '中断进程,可用于关闭杀软',
'ActivityManagerNative;->restartPackage' => ' 中断进程,可用于关闭杀软',
'ActivityManager;->restartPackage' => ' 中断进程,可用于关闭杀软',
#"BluetoothAdapter\;\-\>enable" => '开启蓝牙',
#"BluetoothSocket\;\-\>connect" => '连接蓝牙',
#"IBluetoothPbap\$Stub\$Proxy\;\-\>connect" => '连接蓝牙',
"ContentResolver\;\-\>query" => '读取联系人、短信等数据库',
"ContentService\;\-\>dump" => '转储联系人、短信等信息',
"PackageManager\;\-\>installPackage" => '安装apk包',
"Camera\;\-\>open" => '开启相机',
"MediaRecorder\;\-\>setAudioSource" => '开启录音功能',
"MediaRecorder\;\-\>setVideoSource" => '开启视频录制',
"LocationManager\;\-\>getLastKnownLocation" => '获取地址位置',
"Downloads\$ByUri\;\-\>startDownloadByUri" => '下载文件',
"Downloads\$DownloadBase\;\-\>startDownloadByUri" => '下载文件',
"PowerManager\;\-\>reboot" => '重启手机',
"Settings\$Bookmarks\;\-\>add" => '添加浏览器书签',
"TelephonyManager\;\-\>getDeviceId" => '搜集用户手机IMEI码、电话号码、系统版本号等信息',
"TelephonyManager\;\-\>getSimSerialNumber()" => '获取SIM序列号',
"Telephony\$Mms\;\-\>query" => '读取短信',
"TelephonyManager\;\-\>getLine1Number" => '获取手机号',
"SpeechRecognizer\;\-\>startListening" => '开启麦克风',
"WifiManager\;\-\>setWifiEnabled" => '开启WIFI',
"SmsManager\;\-\>getAllMessagesFromSim" => '获取sim卡上的短信',
"SmsManager\;\-\>sendDataMessage" => '发送二进制消息',
"SmsManager\;\-\>sendMultipartTextMessage" => '发送彩信',
"SmsManager\;\-\>sendTextMessage" => '发送普通短信',
#"http/multipart/FilePart;->sendData" => '发送http请求',
#"http/multipart/Part\;\-\>send" => '发送http请求',
#"http/multipart/Part\;\-\>sendParts" => '发送http请求',
#"http/multipart/StringPart\;\-\>sendData" => '发送http请求',
"internal/telephony/ISms\$Stub\$Proxy\;\-\>sendData" => '发送短信',
"internal/telephony/ISms\$Stub\$Proxy\;\-\>sendMultipartText" => '发送短信',
"internal/telephony/ISms\$Stub\$Proxy\;\-\>sendText" => '发送短信',
"internal/telephony/ITelephony\$Stub\$Proxy\;\-\>call" => '拔打电话',
"java/lang/Runtime\;\-\>exec" => '执行字符串命令',
"java/net/HttpURLConnection\;\-\>connect" => '连接URL',
#"java/net/URL\;\-\>getContent" => '获取网页内容',
"java/net/URL\;\-\>openConnection" => '连接URL',
"java/net/URLConnection\;\-\>connect" => '连接URL',
"DefaultHttpClient\;\-\>execute" => '发送HTTP请求',
"HttpClient\;\-\>execute" => '请求远程服务器', 'android/app/NotificationManager;->notify' => '信息通知栏',
"SmsReceiver\;\-\>abortBroadcast" => '拦截短信接收',
"ContentResolver\;\-\>delete" => '删除短信、联系人',
"chmod " => '更改文件权限',
"getRuntime" => '获取命令行环境',
#'content://telephony/carriers' => '获取所有的APN(网络接入点)配置信息',
'content://telephony/carriers/preferapn' => '可能用于篡改APN(网络接入点)以调用应用市场M-Market扣费接口并验证',
'content://sms' => '获取短信数据库',
'content://browser/bookmarks' => '获取浏览器书签',
'mount -o remount' => '重新挂载档案系统',
'/system/bin/sh' => '执行shell',
'/proc/mounts' => '加载文件系统',
'/system/bin/cp' => '复制文件',
'/root/su' => '切换用户',
'/system/bin/rm ' => '删除文件',
);

2、动态分析

动态分析是Android沙盘的主要功能,主要使用Google Android模拟器作为沙盘环境,同时以前面修改过的system.img来启动模拟器,以在操作过程中生成我们所需的日志信息:

1
system('start emulator -avd MalDroidAnalyzer -scale 0.8  -system images/root-system.img -ramdisk images/ramdisk.img -kernel images/zImage  -prop dalvik.vm.execution-mode=int:portable &');

这里的root-system.img是经过root的,默认情况下,Android模拟器是没有root权限的,需要自己手工修改,这个可通过YAFFS2 img浏览器来修改system.img,将su和superuser放置到系统应用目录下,并将build.prop中的ro.config.nocheckin=yes注释掉,将修改后的system.img替换原文件即可。。这样在一些需要root权限的病毒才能正常地模拟器运行,以触发更多的恶意行为。

启动模拟器后,利用adb安装APK到模拟器上。业界多数沙盘是通过monkey去自动操作软件以触发恶意行为,但这种做法过于盲目,不容易触发恶意行为,同时当操作过于频繁时容易导致程序崩溃,因此在MalDroidAnalyzer中选择由用户自主手工操作,操作时间由用户自己把握。手工操作可能更有利于触发恶意行为,因为病毒作者通常会更多地依赖用户的操作习惯来触发恶意行为,比如点击、拔打电话等行为。
为了避免生成过多的无用日志,因此在使用logcat命令时可提前过滤下,并输出到log.txt文件:

1
system("adb logcat -v time ActivityManager:I camera:V AudioHardware:D Telephony:V CallNotifier:D su:D MediaProvider:V videocamera:V BluetoothEnabler:V BluetoothHIDService:I dalvikvm:W *:S  > log.txt");

最后对生成的日志log.txt进行分析,由于修改过system.img,它会按照json格式输出我们所需的信息,而有些原本Android系统输出的日志可直接拿来作行为检测,就未作修改。日志格式如下:

1
2
3
4
5
6
7
09-16 10:18:04.583 W/dalvikvm(  299): MalDroid: { "DexClassLoader": { "path": "/data/data/com.test/files/anserverb.db" } }
09-16 10:17:27.963 W/dalvikvm( 281): MalDroid: { "SendNet": { "desthost": "www.google.com", "destport": "80", "data": "7b2263656c6c5f746f77657273223a5b7b226d6f62696c655f6e6574776f726b5f636f6465223a32362c226c6f636174696f6e5f617265615f636f6465223a2d312c226d6f62696c655f636f756e7472795f636f6465223a3331302c2263656c6c5f6964223a2d317d5d2c22726571756573745f61646472657373223a747275652c22686f7374223a226d6170732e676f6f676c652e636f6d222c2276657273696f6e223a22312e312e30227d" } }
09-09 08:37:10.371 W/dalvikvm( 191): MalDroid: { "CryptoUsage": { "operation": "keyalgo", "key": "53, 52, 67, 68, 65, 48, 54, 51, 67, 68, 53, 56, 68, 56, 53, 70", "algorithm": "AES" } }
09-09 08:37:12.560 W/dalvikvm( 191): MalDroid: { "CryptoUsage": { "operation": "encryption", "algorithm": "AES/CBC/PKCS5Padding", "data": "ylmftg6" } }
09-17 20:17:14.302 W/dalvikvm( 274): MalDroid: { "ServiceStart": { "name": "com.android.md5.Settings" } }
09-17 20:24:24.944 W/dalvikvm( 126): MalDroid: { "FdAccess": { "path": "2f646174612f646174612f636f6d2e616e64726f69642e6c61756e636865722f66696c65732f6c61756e636865722e707265666572656e636573", "id": "588716465" } }
09-17 20:24:24.965 W/dalvikvm( 126): MalDroid: { "FileRW": { "operation": "read", "data": "0005", "id": "588716465" } }

生成日志后,MalDroidAnalyzer会去分析日志,生成统计图数据,然后生成报告。下面是一些真实病毒样本的恶意行为记录:

1、窃取通讯录:

2、通话录音:

3、发送收费短信:

4、动态加载类文件:

5、Root提权:

四、 真实案例

在Google Android官方市场上,曾出现过多起应用程序嵌入恶意代码的事件,比如“功夫病毒”,可进行root提权,并破坏文件系统,同时窃取用户隐私信息,感染了上百万用户,危害甚广。病毒作者通过对知名软件进行修改,嵌入恶意代码然后重打包,然后诱骗用户下载这些伪造软件。除“功夫病毒”外,还有DroidDream、AnserverBot、PhoneSpy等恶意软件。下面是MalDroidAnalyzer针对PhoneSpy病毒Gmail.apk给出的分析报告,该病毒会窃取用户隐私信息、通话录音等恶意行为。由于该病毒无GUI界面,而是以后台服务在运行,因此报告中的截图是主页界面:




五、 总结

当前手机用户量增长越来越快,尤其是中国,手机用户量已超10亿,即大约75%的中国人拥有自己的手机。正因为手机越来越智能化,携带也方便,因此许多人将隐私信息存储在手机上,且在多处场景下无形地公开化,而这些信息正是许多病毒作者所热衷的。在移动终端上的安全也将比电脑终端越来越重要,移动安全也已成为安全领域的另一新战场。

六、 鸣谢

感谢Dflower同学(0day2作者之一)在笔者编写MalDroidAnalyzer过程中给予的帮助。

七、 参考资料

1、 DroidBox:http://code.google.com/p/droidbox
2、 SandDroid:http://sanddroid.xjtu.edu.cn
3、 apktool:http://code.google.com/p/android-apktool
4、 网秦《2012年上半年全球手机安全报告》:http://cn.nq.com/neirong/2012shang.pdf
5、 Android权限中文描述大全:http://wenku.baidu.com/view/b1f6f9ff0242a8956bece4e7.html
6、 Android Permission Map:http://www.android-permissions.org/permissionmap.html