利用挂钩框架扩大 Android 平台上的恶意软件检测覆盖范围

2023年 10月 7日 57.8k 0

执行摘要

我们在大规模分析 Android 应用程序包 (APK) 样本时面临的最大挑战之一是恶意软件作者使用的 Android 平台版本的多样性。当尝试在恶意软件检测领域利用静态和动态分析技术时,平台版本的多样性可能会让人感到不知所措。

在本文中,我们将讨论恶意软件作者如何使用混淆来使分析 Android 恶意软件更具挑战性。我们将回顾两个此类案例研究,以说明这些混淆技术的实际应用。最后,我们将介绍研究人员可以用来解决这些障碍的一些总体技术。

Advanced WildFire (AWF) 云提供的恶意软件分析服务可准确识别本博客中讨论的恶意样本。拥有有效 AWF 订阅的 Palo Alto Networks 客户会自动获得针对这些威胁的保护。

基于 Hook 的沙箱

恶意软件研究人员经常使用静态和动态分析技术。前者涉及检查磁盘上恶意软件样本的特征。后者涉及观察示例的运行情况,例如在沙箱中。将这两种技术结合在一起有助于我们全面了解威胁的行为。

在Android平台上,动态分析跟踪APK样本的执行并提取运行时信息以进行恶意软件检测和分析。我们可以用于动态分析的一种沙箱技术是构建一个挂钩框架。

挂钩是一种拦截样本在分析运行期间进行的 Android Framework API 调用的技术,特别是捕获和/或操作函数的参数和返回值(如果存在)。这并不是 Android 平台所特有的。同样的基本理论适用于当今所有主要操作系统上的本机代码和托管代码。

挂钩是通过在运行时插入到用户指定的“挂钩”函数的重定向来完成的,如图 1 所示。现代沙箱依靠挂钩技术在运行时提供代码、数据(字符串)和嵌入有效负载的多功能反混淆。

挂钩框架不是固定于某个 Android 平台版本,而是通过动态向示例的运行时添加跟踪逻辑来灵活支持各种 Android API 级别。这使得追踪开发能够专注于恶意行为的触发和提取。

该框架的一个限制是它无法检测执行的 Android 框架 API 函数中的每一行代码。这是因为检测在函数序言(即函数的开头)修补字节以跳转到钩子函数,而不是在每个指令级别。然而,在实践中,这通常是研究人员可以接受的“足够好”的权衡。

图 1. 挂钩代码流程修改

除了挂钩之外,实现 Android 沙箱的另一种方法是将特定兴趣点的检测添加到 Android 开源项目 (AOSP) 代码库中。由于 Android 生态系统的开源性质,出于动态分析目的创建 Android 代码库的自定义构建是可能的。

研究人员通过在某些战略点插入仪器代码来获取价值。与读取短消息服务 (SMS) 文本消息相关的敏感 Android 框架 API 函数是适合检测的示例,因为这些函数通常被恶意软件作者滥用。这样做可以让研究人员更好地了解样本的行为。

与 hooking 相比,这种方法的一个优点是它保证了对整个 Android Framework API 的全面覆盖。研究人员只需在感兴趣的行插入额外的检测代码,然后重新编译 AOSP 代码库即可检测每一行代码,尽管重新编译可能是一项相当重要的任务。

此方法对于正在分析的样本也是透明的,这意味着样本可能无法区分它是否在检测的 AOSP 环境中运行。仪器还加速了分析过程,因为研究人员必须在引爆之前解压实际的反混淆恶意负载(可能在内存中,或带有丢失的文件)。

不幸的是,随着 Android 平台的发展,这种方法的成本很高,需要定期维护经过大量修改的 AOSP 映像的可重复构建。在对 API 进行重大升级或更改后,这尤其成问题,因为我们必须更新跟踪模块以支持这些新版本。一个例子是 Google 从使用旧的 Dalvik 运行时更改为当前的 Android 运行时 (ART)。这本质上是一项艰巨的维护工作。

扩展 API 级别覆盖范围

随着时间的推移,谷歌不断发展 Android 平台,并由此产生了不同的版本。这会创建与这些版本相关的不同 API 级别。图 2 显示了截至 2023 年 5 月的不同 Android 版本。

每个 API 级别都可能会弃用过时的功能或对设备所有者构成安全风险的功能,同时引入新功能。这对于动态检测 APK 示例可能会出现问题,因为开发人员需要根据 Android 框架 API 函数规范的更改定期维护现有的挂钩。

这就是挂钩的亮点,因为它默认是可扩展的。这是指它能够按需支持多个Android 框架 API 级别。

图2. API级别分布图(来源:Android 分布图 – 可组合项)

我们搜索了VirusTotal (VT),在 2023 年 8 月 27 日至 9 月 7 日的 12 天内发现了 12,394 个恶意 APK 样本。这些 APK 恶意软件样本的最低 API 级别运行时要求从 API 级别 19 到 API 级别 30 不等。图3是总结这些结果的图表。

图 3.APK 恶意软件样本 (VirusTotal)

注意:根据Android API Levels网站,minSdkVersion是指“您的应用程序将支持的最低 SDK 版本,在build.gradle中定义”。例如,如果您的minSdk为 26,则该 SDK 版本对应 API Level 26,即 Android 8。这意味着您的应用只能在 Android 8 或更高版本的设备上运行。

根据我们在同一时间范围内的内部遥测,我们观察到类似的结果,如下图 4 所示。

图 4.APK 示例(内部)

对于此类示例,最近的最低 API 级别运行时要求也广泛存在。其范围从 API 级别 19 一直到最新的 API 级别 34,如图 5 所示。

图 5.APK 恶意软件样本(内部)

Google 最近宣布于 2023 年 8 月 31 日对 Google Play 应用执行目标 API 级别要求,此后每年执行一次。通过这样的公告,我们可以预期 APK 示例的可用 API 级别范围将持续扩展。这是因为升级总是有一个宽限期,并且还有替代方案,例如通过第三方应用程序商店进行分发。

根据 Google 目前的检测,在 Google Play 上未发现包含本文中讨论的恶意软件样本的应用程序。Google Play Protect 通过 Google Play 服务保护用户免受 Android 设备上已知包含恶意软件的应用的侵害,即使这些应用来自其他来源。

因此,这意味着我们的 WildFire 沙箱需要跟上随着 Google 发布的更新 API 级别的发展趋势。基于挂钩的沙箱将简化维护任务,因为可以按需添加或删除挂钩。

运行时反混淆

Android 平台上的 APK 样本所采用的混淆之所以存在,是因为它的目的是阻碍传统的静态分析工作,就像所有其他平台上发生的情况一样。威胁行为者和供应商都有大量可用的选项,可以在各种混淆策略之间轻松切换。这些选项的范围从现成的商业现成解决方案到免费开源软件。

相同类型的挑战不会像经典静态分析那样对动态分析方法产生不利影响。动态分析擅长捕获和提取完全反混淆和解压的核心工件。

APK/Dalvik 字节码 (DEX) 有效负载和 URL 字符串是此类工件的一些示例。APK 指的是 Android 应用程序,DEX 指的是为 Android 应用程序提供支持的核心编程代码,而 URL 字符串是通过网络联系远程端点的服务器地址(例如https://paloaltonetworks.com)。

研究人员需要这些文物来进行识别和检测,以及进行进一步的分析。尽管更深入的分析确实会导致更长的运行时间,因为它会向我们报告其活动,但这仍然是必要的,因为我们需要时间来充分观察 APK 样本在仪器化环境中爆炸时的相互作用。

研究人员需要意识到,恶意软件作者在分发之前将每种规避技术应用于其 APK 样本时,需要进行大量相关的研发投资。威胁行为者通常会选择最简单的机制,使他们能够在考虑升级技术之前突破防御。

采用动态分析方法比传统静态分析更能有效应对混淆挑战。沙箱可以克服此类规避技术,在运行时以明文形式发现有用的工件。

否则,这些工件将需要我们投入一些精力来跟踪 APK 样本中 DEX 的流程。它还需要我们投入资源来手动解析棘手的值,例如数据库解密密钥。通过逆向工程工作,我们发现了从 APK 样本附带的代码签名数字签名派生的密钥。

实例探究

Cerberus 银行木马

Cerberus是一种银行木马,可以从 Android 移动设备窃取有价值的信息。攻击者还可以使用它来访问和控制设备,冒充其所有者代表他们执行操作。

图 6.Android 启动器菜单屏幕和应用程序列表

Cerberus 示例 (SHA-256 1249c4d3a4b499dc8a9a2b3591614966145daac808d440e5202335d9a4226ff8 ) 使用通用 Android 证书进行数字代码签名。它使用相同的图标伪装成 Google Play Store Android 应用程序。然而,作者对其进行了编程,使其使用五个空格 ( x20 ) 字符的连续序列来清空自己的应用程序名称(参见图 6)。

此 APK 示例还通过在 RC4 加密之上对其所有配置字符串应用 Base64 编码来实现混淆。APK 示例将它们存储为单个整体String Pool类中的变量值。APK 示例将名为a的负责方法存储在名为com.fky.lblabjglab的包(类a )内,如表 1 所示。

该示例根据图 7 中所示的方案对字符串进行混淆。

图 7. 配置字符串混淆方案

例如,给定输入字符串idbot和随机选择的长度为 12 的小写字母密码密钥 ( wssmnpdmydte ),Android 应用程序进程使用此密钥对输入字符串应用 RC4 加密。然后将生成的字节进行 Base64 编码以形成可打印的 ASCII 字符 ( Y2Y3NGY4MzNmNg== ),以进行无损存储和传输。最后,Android应用程序进程将选定的密钥添加到该结果之前,以产生最终的混淆字符串,以便可以进行相反的操作(即解密过程)。

通常会遇到基本的 Base64 编码(可能使用自定义字符集)或使用固定单字节密钥应用于模糊 APK 示例中的字符串的 XOR 加密。或者,它通常会是更强大、更安全的加密——例如,像 Rivest Cipher 4 (RC4) 这样的流密码。这里的情况也是如此,但略有不同。它们使用密钥作为前缀的对称密钥算法,例如数据加密标准 (DES) 和高级加密标准 (AES)。

反混淆配置键

识别字符串混淆例程的有用启发法是注意最高度交叉引用的方法。此类方法通常应至少接受一个字符串参数输入,产生一个字符串输出返回值。它们通常是包含循环(例如,逐字符迭代)的独立方法,并且几乎不依赖于 Android 框架 API 函数。

通过控制执行以在运行时恢复程序状态和副作用,沙箱可以提取名为settings.xml 的反混淆配置文件。Android 应用程序进程将此文件存储在 Android 应用程序的运行时文件夹中的“共享首选项”下。在初始化阶段,Android 应用程序进程会重复重写该文件,同时使用固定值对其硬编码配置参数进行反混淆。我们在下面摘录了一段供参考,如图 8 所示。

图 8. 反混淆的配置 XML

我们可以快速扩展从属于该家族的样本中解析和提取此类信息的能力。这将有助于执行以下操作:

  • 构建可操作的威胁情报集合来执行归因
  • 更好地了解对手的战术、技术和程序 (TTP)
  • 跟踪这些威胁行为者群体随时间的演变

隐藏广告广告软件

HiddenAd是一种向 Android 用户积极展示广告并为广告软件作者带来收入的广告软件。它的功能主要是通过伪装成良性的 Android 应用程序来隐藏的。攻击者还可以使用该系列的某些变体来提供其他打包的漏洞利用工具包、凭据窃取程序或其他恶意工具。

在本案例研究中,我们重点关注该家族的一组样本,它们执行以下活动:

  • 从 Android 启动器菜单屏幕隐藏其应用程序图标
  • 通过 SQLCipher 数据库加密保护其关键的辅助有效负载

伪造“Bloons TD 6”

为了演示这些功能,我们分析了具有 SHA-256 哈希值73dee5433d560c072ea42b2288f826b16250da6f07543b3e3387ace31a13bd7c的 Android APK 示例。

攻击者认为隐藏威胁的应用程序图标是一种战术上有利的举措。这是因为 Android 用户通常会通过 Android Launcher 菜单屏幕(如图 9 所示)来确定他们在设备上安装了哪些应用程序。

图 9.Android 启动器菜单屏幕和应用程序列表。

如果要深入挖掘,示例条目在应用程序列表中仍然很明显。请注意以红色突出显示的“Bloons TD 6”行,这是此示例的应用程序名称。

应用程序名称源自清单文件AndroidManifest.xml中节点的android:label属性。该样本试图伪装成合法的 Android 游戏。根据维基百科对这款游戏的描述,“Bloons TD 6是一款由Ninja Kiwi开发并发行的2018年塔防游戏”。

该示例将其下一阶段的 APK 和 DEX 有效负载封装在加密的 SQLite 数据库文件中,嵌入原始示例的asset/目录中。作者在此 SQLite 数据库文件中启用了流行的 SQLCipher 加密扩展。这会自动提供政府标准 AES 加密(256 位),并在密码块链接 (CBC) 模式下运行。

该示例使用 SQLCipher 3(.5.9) 默认设置进行加密。一个很好的指标是原始示例的lib/目录下存在 Android 本机库libsqlcipher.so。

在本例中,示例包含数据库文件muzikmp3mustafasandal.db。加密密钥是附加到样本的代码签名数字签名的hashCode 。在本例中,键是字符串-923130181。

该数据库文件包含核心有效负载,即 APK 示例muzikmp3mustafasandal.dat.jar和 DEX 字节码ZnWjqpRHi.dex。数据库中名为iFqBWMAzy 的表将这些存储为其行,其中:

  • 表列EQSnKGDYR存储文件名
  • 表列bANpZqhWm存储原始文件内容

该示例的另一个特征是它隐藏其 URL 字符串的方式,而该特征在集群的其余部分中没有体现。URL 的各个部分被分开,使得静态分析(精确的 URL 字符串模式匹配)更有可能失败。连接 URL 的各个部分可恢复完整的 URL。

对于此示例,原始 URL 为hxxp[://]madhavaapps[.]science/dwarkadhish/alternate148275android[.]php,如下图 10 所示。

图 10. 包含 URL 字符串的代码片段。

躲在U+FFF8下

与之前的“Bloons TD 6”示例不同,另一个类似的 APK 示例(SHA-256 哈希833d9669dd64a2aa009a3741c8f16612cfafc3104b1f2113ac69255b6fcabf8e)不会模仿合法的良性 Android 应用程序。相反,它使用带有“空”、不可打印的 Unicode (UTF-8) 字符U+FFF8 ( xefxbfxb8 ) 标签的空白白色图标将自身附加到应用程序列表的末尾,如图 11 所示。

图 11. Android 应用程序列表

此示例使用 SQLCipher 4(.3.0) 默认设置,而不是我们讨论的上一个示例所使用的 SQLCipher 3(.5.9)。使用相同的方法派生加密密钥,但由于样本附加了不同的证书,因此密钥更改为字符串 -1463079363。

数据库文件名为com.db,它包含核心负载,即 APK 示例com.dat.jar和 DEX 字节码viVfyboRT.dex。它们作为行存储在数据库中名为abaQwumOc的表中。该表由两列组成:

  • 表列DvaIEsASI存储文件名
  • 表列RsKesUrHq存储原始文件内容

我们可以通过在包net.sqlcipher.database、类SQLiteOpenHelper中的方法getWritableDatabase上放置一个钩子来捕获String参数(即解密密钥)来获取 SQLCipher 数据库解密密钥。

无论我们使用 SQLCipher 版本 3 还是 4,它都会共同确定其关联的加密参数。这些加密参数是:

  • 页面大小
  • 密钥导出函数(KDF)
  • KDF 的迭代次数
  • 基于哈希的消息认证码 (HMAC) 算法

为了收集这些参数,我们可以在包net.sqlcipher.database、SQLiteDatabase类的构造函数上放置一个钩子。在构造函数上放置一个钩子将获取名为SQLCIPHER_ANDROID_VERSION的静态字符串字段的值。

对辅助 APK/DEX 有效负载进行反混淆可以让研究人员更深入地了解这些样本的内部工作原理。威胁行为者分层编写样本的情况很常见,因此防御者无法轻易发现他们的真实恶意意图。这使他们有更好的机会逃避安全防御,尤其是在外围。

采用分层策略为攻击者提供了多功能性,因为当安全防御措施检测到它们时,他们可以换入或换出模块化组件。攻击者还能够混合搭配组件,产生各种各样的组合。这使得指定和维护检测规则对于防御者来说是一件苦差事。

结论

随着 Android 平台的快速发展,威胁行为者将目标瞄准了更广泛的 Android 系统版本,尤其是较新的版本。为了给我们的客户提供一致的保护,Advanced WildFire (AWF) 一直在使用挂钩框架和相关技术来扩展动态分析沙箱中 Android API 版本的支持范围。

我们已经证明,通过依赖挂钩框架,沙箱能够暴露使用静态分析方法难以发现的恶意行为。识别这些恶意行为对于实现卓越的检测质量至关重要。

妥协指标

APK样本

Cerberus

1249c4d3a4b499dc8a9a2b3591614966145daac808d440e5202335d9a4226ff8

HiddenAd

73dee5433d560c072ea42b2288f826b16250da6f07543b3e3387ace31a13bd7c
833d9669dd64a2aa009a3741c8f16612cfafc3104b1f2113ac69255b6fcabf8e

URLs

hxxp[://]20[.]49[.]203[.]83/gate[.]php
hxxp[://]madhavaapps[.]science/dwarkadhish/alternate148275android[.]php

证书指纹 (SHA-1)

83659BA7B2DEC9E5C21A7E6DEEB8B0F8674D0620
C85070B16749D25747E040A9FB6910D6351D1F88

转载来源:https://unit42.paloaltonetworks.com/hooking-framework-in-sandbox-to-analyze-android-apk/

图片来源网络侵权可联系删除

相关文章

Mallox勒索软件新Linux变种现世
伪装成破解程序和商业工具的新型恶意软件正在传播
Orcinius后门新样本分析
Poseidon窃取程序通过Google广告感染Mac用户
大选开始之际,欧盟各政党遭受 DDoS 攻击
微软2024

发布评论