ANTSdroid:面向安卓应用的自动恶意软件家族行为生成与分析
摘要
恶意软件开发者经常使用各种混淆技术来生成多态性和变种的恶意软件版本。及时跟上新变种并为每个个体创建签名一直是杀毒公司面临的重要问题,但这项工作十分繁琐。这促使我们提出了不再与变种周旋的想法。本文旨在直接找出与恶意软件家族意图密切相关的主要特征操作。我们提出了全局执行序列对齐与分割算法,以生成恶意软件家族的执行阶段图,该图表简明直观地展示了生命周期以及各个变种在不同阶段执行的共性与差异操作。我们还提出了一种自动化的动态Android恶意软件画像与家族安全分析系统,重点关注恶意软件家族变种中敏感及权限相关API调用的执行序列,即所谓的模体。为实现这一目标,我们对安卓调试桥(ADB)工具进行了改进,增加了若干新功能,包括支持记录API调用的参数和返回值、支持基于UID的画像以捕获所有进程和线程,从而全面理解目标恶意软件应用的行为,以及实现每线程跟踪生成。最后,我们使用真实世界数据集验证了所提出的系统和方法。生成的家族阶段图和模体可为安全分析师提供关于恶意软件家族设计与实现方式的语义丰富的理解。恶意软件家族的主要特征API调用序列未来可用作签名,以实现高效且有效的恶意软件检测。
关键词
Android恶意软件家族行为分析,执行序列对齐与分割,Dynamic分析,安卓安全
1 引言
智能手机已成为我们生活中不可或缺的一部分。近期报告显示,按安装付费(PPI)模式下的商业行为导致了不需要的软件安装量日益增加,软件开发者在安装过程中捆绑第三方应用程序以获取报酬[1]。因此,许多恶意软件,如木马、后门和激进的广告软件被下载到用户的设备中。与此同时,我们观察到恶意软件开发者经常使用各种混淆技术来生成多态和变种的恶意软件版本。因此,同一恶意软件家族的变种通常表现出相似的行为。最重要的是,它们具备某些共同的核心代码,以实现相同的设计目的。
本文提出了一种新颖的自动动态Android恶意软件画像与家族安全分析系统,该系统聚焦于恶意软件家族变种的敏感及权限相关API调用的执行序列,即所谓的模体。我们提出了一种全局执行序列比对算法和一种用于恶意软件家族行为分析的分割算法,以发现该家族的共性及主要特征模体。
过去,研究人员提出了多种恶意软件行为分析方法。基本可分为两类:静态分析和动态分析。在静态分析中,研究对象主要是APK文件、DEX文件、AndroidManifest.xml文件以及应用程序所使用的权限。通过分析嵌入在这些文件中的信息(例如所使用的权限[2–6]和污染信息[7, 8]),研究人员可以评估应用程序的威胁程度。另一方面,动态分析工具在受控环境中收集运行时执行信息(例如系统调用和API调用)[9–13],以刻画和检查应用程序的行为。与这些工作不同,本文聚焦于从Android恶意软件家族变种的过滤后的执行轨迹中,自动生成其共同且主要的与安全相关的特征API调用序列。所生成的恶意软件家族的共性或特征API调用序列,未来可作为签名用于有效恶意软件检测。
我们的贡献包括:(1)设计并实现了一个针对安卓应用的自动化分析及恶意软件家族行为分析系统;(2)修改安卓调试桥(ADB)工具,新增功能,包括支持记录API调用的参数和返回值、支持基于UID的分析模式以捕获从主进程派生的所有进程和线程,从而全面理解目标恶意软件应用的活动,以及每线程跟踪生成;(3)整理了一套敏感及与权限相关的API集合,用于捕获应用的安全相关活动;(4)设计并实现了一种全局执行序列比对算法和一种分段算法,以生成恶意软件家族的执行阶段图,该图简洁直观地展示了生命周期以及各个阶段中各变种的共性与差异操作;(5)使用真实数据集验证所提出的系统,识别恶意软件家族的共性和主要特征操作(API调用序列),以用于高效检测。
本文的其余部分组织如下。在第2节中,我们简要回顾了安卓恶意软件行为分析的相关工作。在第3节中,我们描述了ANTSdroid:自动恶意软件家族行为生成797所提出的自动化分析和家族行为分析系统的设计与实现。在第4节中,我们采用一个安卓恶意软件数据集来验证所提出的系统和算法。最后,第5节给出结论。
2 相关工作
Barrera等人[3]使用自组织映射来分析安卓的基于权限的安全模型。PScout[4]讨论了权限与Java API之间的关系。VetDroid[5]是一个动态分析平台,能够揭示应用程序如何使用权限访问敏感系统资源,以及这些获取的资源如何被应用程序进一步利用。AppsPlayground[6]在安卓模拟器中进行动态分析,基于对隐私敏感信息的污点追踪、敏感API监控和内核级跟踪,以识别已知漏洞和不期望的功能。Apposcopy[7]专注于组件间调用图的静态污点分析,用于恶意软件家族分类。TaintDroid[8]采用污点分析技术,提供一个全系统动态污点追踪系统,能够追踪多个敏感数据源。
Peiravian等人[9]使用静态分析来提取安卓应用的权限和API调用,并应用机器学习技术来检测恶意安卓应用。DroidAPIMiner[10]在API级别提取恶意软件特征,并采用机器学习方法对恶意应用和良性应用以及通用应用所使用的API进行分类。Droidmat[11]也在应用的清单文件和API调用特征上应用机器学习算法,以区分安卓恶意软件。DroidScope[12]采用虚拟机自省(VMI)技术在虚拟机中检查安卓应用。在CopperDroid[13]中,作者同样应用VMI技术执行以系统调用为中心的分析,并生成详细的行为配置文件,将大量的低级系统调用抽象为简洁的高级语义。然而,这些工作并未像我们一样关注应用的线程结构和Java API调用序列。
3 系统设计
在我们提出的恶意软件动态分析与家族行为分析系统中,第一步是对目标恶意软件应用的执行过程进行分析。这里的主要问题是确定需要记录哪些信息,以便执行轨迹包含足够详细的信息,且不遗漏任何可疑或恶意操作。同时,我们也希望避免记录过多细节而引入大量不必要的噪声。图1展示了所提出的分析与家族行为分析系统的架构。该分析与家族行为分析过程包括三个阶段。
3.1 为每个线程生成所有APIs执行轨迹
我们首先利用安卓SDK命令“am profile”来获取应用的初始跟踪信息。然而,该命令仅提供类名、方法名和线程名称和参数类型。我们修改了安卓调试桥(ADB)的代码,增加了几项新功能:(a)启用对API调用的参数和返回值的记录;(b)将基于PID的分析模式更改为基于UID,以捕获从主进程派生的所有进程和线程,从而全面了解目标应用的活动情况;(c)按线程分离并生成API调用轨迹。
广播消息:触发恶意软件行为。在动态分析中,如何尽可能触发目标恶意软件行为是一个问题。为此,我们在分析系统中实现了广播消息机制,以确保尽可能多地触发恶意软件APK的行为。在实验中,49个恶意软件家族中有29个监控BOOT_COMPLETED事件,21个家族监听_SMS_RECEIVED事件。还观察到大多数恶意软件应用注册了多个事件。通过这种方式,我们在实验中将服务组件的激活率从0.009提高到了0.74。
3.2 敏感和权限相关API的过滤
从第一阶段获得的执行轨迹包含应用程序执行过程中调用的所有API。由于并非所有API都与可疑或恶意活动相关,因此我们重点关注需要用户权限才能调用的API以及与敏感操作相关的API。
需要权限的API 。由于谷歌未提供所有API权限要求的官方规范文档,为了找出需要权限的API,我们编写了一个程序,于2016年4月爬取Android开发者网站[14],共发现4382个类、35033个API和135项权限。其中265个API需要权限,仅有36个在网站上公开,其余通常被称为未公开API。在PScout[4]中,作者开发了一种工具,从四个版本的Android操作系统源代码(2.2至4.0)中提取权限规范,并整理出权限-API映射列表。从中我们重点关注了包含40项不同权限的2456个API。
敏感API 。除了需要权限的API外,我们还识别出530个无需权限但常被恶意软件调用的API[10, 15]。它们被分为九个使用类别,如表1所示。这些API共计2986个,在本研究中作为敏感及与权限相关的API集合,用于过滤第一阶段执行轨迹中无关的API。生成的轨迹称为执行配置文件。
表1. 敏感API集合
| 类别(API数量) | 无需权限的API |
|---|---|
| 文件管理(440) | java/io/File、DataOutputStream、DataInputStream等 |
| Java反射(3) | java/lang/Class.getName,forName,getMethod |
| 执行命令(2) | java/lang/Runtime.exec, getRuntime |
| 加密/解密(3) | javax/crypto/Cipher.getInstance, doFinal |
| 代码加载(3) | dalvik/system/DexClassLoader.loadClass, PathClassLoader。 |
| 字符串操作(4) | *java/lang/StringBuffer.append, subString, java/lang/StringBuilder.append, subString |
| 数据库查询(65) | android/content/CursorWrapper(40),android/content/ContentProvider(24) |
| 常用网络库 & 网络相关的API(4) | org/apache/http/impl/client/AbstractHttpClient.execute,org/apache/http/client/utils/URLEncodedUtils.encode |
| 共享偏好文件(6) | android/content/ContextWrapper.getSharedPreference |
| ## 3.3 恶意软件家族全局执行序列对齐与分割及阶段图生成 | |
| 在获得一个恶意软件家族各变种的执行配置文件后,我们希望找到该家族的公共且具有特征性的模体(执行片段)。考虑一个恶意软件家族 FM,其变种为 {v1,v2,…, vN},对应的执行配置文件为 {P1, P2,… PN}。我们设计并开发了一种称为API_GSA的全局API调用序列比对算法。在该算法中,我们首先随机选择一个执行配置文件作为基线,记为 P(B)。然后对每个执行配置文件与该基线进行成对全局序列比对。该算法旨在对每个执行配置文件中的每一条API调用进行对齐,以寻找最佳匹配,从而优化两个配置文件之间的相似性。我们还开发了一种分段算法,用于将对齐的API调用序列矩阵划分为多个阶段,并生成家族执行阶段图。通过该图,我们现在可以全面了解各个变种在每个阶段的行为。最重要的是,可以从图中轻松识别出所有变种都具有相同模体的公共阶段,即执行相同的调用序列。通过连接所有公共阶段的模体,我们便可得到该家族的公共执行序列。 |
4 评估
我们的自动化安卓恶意软件应用分析与家族行为分析系统基于QEMU和KVM构建。物理机器配置为英特尔i7‐3770S 3.1 GHz四核CPU,8 GB内存,运行Ubuntu 14.04操作系统。我们采用Drebin项目中的一个包含十个家族共2568个恶意软件样本的数据集[16]。然而,在实验中,并非所有样本都可运行。
特征安全API序列分析
首先,我们证明所选的敏感且与权限相关的API集合足以揭示恶意软件家族的主要特征活动。由于篇幅限制,我们以恶意软件家族ADRD为例进行说明。ADRD是一个木马家族,其主要特征行为之一是窃取设备信息并定期将数据发送出去。在Drebin数据集中,有25个标记为ADRD家族的可运行变种样本。这些样本共创建了64个进程(每个样本可能除主进程外还生成零到三个子进程)以及94个线程。我们应用UPGMA这一凝聚层次聚类方法对它们的操作进行粗略分类,然后运行所提出的全局执行序列对齐与分割算法,对每个簇进行深入的特征行为分析。图2展示了其中一个簇生成的执行阶段图。在表2中,我们列出了ADRD家族的技术描述与其家族行为分析中识别出的主要特征API调用之间的映射关系。诸如获取IMSI和IMEI等主要特征出现在大多数变种中。一个有趣的发现是通过使用“设置应用程序的激活日期和时间”以及“oldtime”和更新_flag.xml并配置警报来定期激活后台组件。
表2. ADRD家族主要特征行为摘要
| 特征活动 | 代码序列 |
|---|---|
| 加密与认证 | java/lang/Class.forName( “com.adroid.org.conscrypt.KeyManagerFactryImpl”, true, ,) java/lang/Class.forName( “com.android.org.bouncycastle.jcajce.provider.keystore.bc.BcKeyStoreSpi$Std”, true, ,) java/lang/Class.forName( “com.android.org.conscrypt.TrustManagerFactoryImpl”, true, ,) java/lang/Class.forName( “com.android.org.conscrypt.TrustedCertificateKeyStoreSpi”, true, ,) java/lang/Class.forName( “com.android.org.bouncycastle.jce.provider.PKIXCertPathValidto‐Spi”, true, ,) |
| 发送HTTP请求 |
ava/net/URI.parseURI(
““,)
java/net/URL.openConnection() java/net/URI.解析URI( “http://sd.3g.qq.com/g/softdown/util/apkskin.jsp”, false,) org/apache/http/impl/client/AbstractHttpClient.execute( , ,) org/apache/http/impl/client/AbstractHttpClient.execute( , ,) |
| 获取IMSI、IMEI |
android/content/ContextWrapper.获取系统服务 (
“电话”,)
android/telephony/TelephonyManager.getDeviceId() android/telephony/TelephonyManager.getSubscriberId() |
| 检查互联网连接 |
android/content/ContextWrapper.获取系统服务(
“connectivity”,)
android/net/ConnectivityManager.getActiveNetworkInfo() |
| 激活日期和时间 | android/content/ContextWrapper.getSharedPreferences ( “update_flag”, 0,) |
| 激活日期和时间 |
android/app/SharedPreferencesImpl.getLong (
“oldtime”,
0,)
java/util/Date.getTime(); android/app/SharedPreferencesImpl.edit() |
| 配置警报以定期激活后台组件 |
android/content/ContextWrapper.getSystemService(
“alarm”,) android/content/Intent.setAction( “com.lz.myservicestart”,) android/app/PendingIntent.getBroadcast( , 0, , 0,) android/content/Intent.writeToParcel ( , 0,) android/app/AlarmManager.set() |
5 结论与未来工作
恶意软件变种的激增使得为每个个体及时创建签名的方法变得低效且成本高昂。这促使我们提出了不再与变种“共舞”的理念。不同于以往的动态恶意软件分析工作和工具,本文专注于从恶意软件变种的过滤后执行轨迹中,自动生成Android恶意软件家族共有的主要特征性与安全相关的API调用序列。我们修改了ADB的源代码,以实现记录API调用的参数和返回值,并支持基于UID的分析模式,从而捕获从主进程中派生出的所有进程和线程,全面理解目标恶意软件应用的行为,并为每个线程生成执行轨迹。我们还提出了全局执行序列对齐与分割算法,用于生成恶意软件家族的执行阶段图,该图简明直观地展示了恶意软件家族生命周期中各个阶段的共同操作和不同操作。该家族执行阶段图以及模体也为安全分析师提供了关于恶意软件家族设计与实现方式的语义丰富的理解。我们的系统及生成的恶意软件家族特征API调用序列,未来可用作签名,实现高效且有效的恶意软件检测。




被折叠的 条评论
为什么被折叠?



