写在前面的话
对于Android应用程序包样本分析来说,最大的问题在于恶意软件开发人员所使用的Android平台版本有所不同。在尝试使用静态或动态分析技术来检测恶意软件时,不同的Android平台版本会给我们的检测带来很大的困难。
在这篇文章中,我们将讨论恶意软件开发人员如何使用混淆技术来提升Android恶意软件额分析难度,并提供对应的解决方案。
基于钩子的沙箱
恶意软件开发人员最常用的就是静态分析和动态分析技术,前者需要对磁盘中的恶意软件样本进行特征分析,后者则需要观察样本的行为(一般在沙箱中)。通过结合这两种技术,我们就能够了解威胁行为者的全貌了。
在Android平台上,动态分析需要追踪APK样本额执行,并提取运行时信息以供恶意软件检测和分析。在动态分析中,我们可以使用的一个沙箱技术就是构建一个钩子框架。
钩子技术可以在分析过程中拦截恶意软件样本对Android框架API的调用,钩子可以在运行时插入一个重定向并指向用户指定的“钩子”函数,具体如下图所示:
现代沙箱技术基于钩子技术来提供针对代码、数据(字符串)和嵌入式Payload的多样化反混淆功能。
有了钩子技术,我们就不需要在考虑Android平台版本的区别,因为钩子框架可以通过动态添加跟踪逻辑分析样本的运行时状况,以灵活地支持大量Android API级别。
扩展API级别覆盖率
随着时间的推移,Google一直都在开发和更新Android平台,并由此产生了不同的版本:
每一个API级别都有可能会弃用过时的功能或可能存在安全风险的功能,同时还会引入新的功能。这对于动态检测APK样本来说可能是有问题的,因为在Android框架API函数规范发生变化后,开发人员需要定期维护现有的钩子。
由于钩子在默认情况下是可扩展的,也就是我们可以按需支持多个Android框架API级别,这就是它的优势所在。
我们搜索了VirusTotal(VT),并在2023年8月27日至9月7日的12天内发现了12394个恶意APK样本。这些APK恶意软件样本的最低API级运行时要求从API 19级到API 30级不等:
根据Android API Levels网站的信息,minSdkVersion是指“你的应用程序将支持的最低SDK版本,在build.gradle中定义。”例如,如果你的minSdk为26,则此SDK版本对应于API Levels 26,即Android 8。这意味着你的应用程序只能在安卓8或更高版本的设备上运行。
基于我们在相同时间范围内的内部遥测,我们观察到了下列类似结果:
对于此类样本,其API级别从最低的19到最高的34不等:
Google于2023年8月31日宣布强制执行Google Play应用程序的目标API级别要求,并且此后的每年都会强制执行一次升级。这样一来,未来的APK样本的API级别范围将会更加大。
这也就意味着,我们的沙箱为了要跟上API级别的更新趋势,基于钩子的沙箱将简化这一任务,因为钩子可以按需添加或删除。
运行时反混淆
Android平台上的APK样本之所以会进行混淆处理,就是为了阻碍传统的静态分析工作,但这种方式无法阻挡动态分析方法。
APK/Dalvik字节码(DEX) Payload和URL字符串就是很好的例子。APK指的是Android应用程序、DEX指的是驱动Android应用程序的核心编程代码,而URL字符串一般指的是服务器地址,例如https://paloaltonetworks.com。
研究人员需要对这些内容进行识别和检测,并进行深入分析。尽管更深层次的分析确实需要更长的运行时间,但这仍然是必要的,因为我们需要时间来充分观察APK样本在分析环境中运行时的交互行为。
需要注意的是,恶意软件开发者在传播恶意软件之前,会将各种规避技术应用到APK样本上,因此采用动态分析方法将比传统的静态分析能够更有效地应对混淆的挑战。
分析案例-Cerberus银行木马
Cerberus是一个功能强大的银行木马,它可以从Android移动设备上窃取有价值的信息。攻击者还可以使用它来访问和控制设备,并冒充用户执行各种操作。
下图显示的是Android设备感染该木马之后的启动菜单和应用程序列表界面:
我们所分析的Cerberus样本(SHA-256 1249c4d3a4b499dc8a9a2b3591614966145daac808d440e5202335d9a4226ff8)是使用通用安卓证书进行数字代码签名的。它通过使用相同的图标伪装成Google Play商店的安卓应用程序。同时,开发者还使用了五个空格(\x20)字符的连续序列来清空了应用程序的名称。
该APK样本还通过在RC4加密的基础上对其所有配置字符串应用Base64编码来实现混淆。APK样本将这些值作为变量值存储在一个单一的String Pool类中,然后再对方法名、包名和类名进行替换和存储:
字符串混淆流程如下图所示:
假设,给定输入字符串“idbot”和一个长度为12的随机小写字母密码(wssmnpdmydte),Android应用程序会使用该密钥并对输入字符串执行RC4加密,然后再对得到的数据进行Base64编码,以形成最后的ASCII字符(Y2Y3NGY4MzNmNg==),最后将其用于无损存储或传输发送。解密过程正好相反,在此不再进行赘述。
Base64编码和XOR加密是经常会遇到的数据处理场景,其中固定的单字节密钥应用于混淆APK样本中的字符串。也有可能会使用更强更安全的加密方法,例如RC4。
反混淆配置密钥
用于识别字符串混淆程序最有效的启发式方法,就是检测出高度交叉引用的函数方法。这些方法通常应该至少输入一个字符串参数,然后生成一个字符串输出返回值。它们通常是包含循环的独立方法(例如,逐字符迭代),并且几乎不依赖于Android框架API函数。
通过控制执行以在运行时恢复程序状态,沙箱可以提取名为settings.xml的反混淆配置文件。Android应用程序进程将该文件存储在Android应用程序的运行时文件夹中的“Shared Preferences”下。在初始化阶段,Android应用程序进程会不断重写此文件,同时使用固定值取消硬编码的配置参数:
这样一来,我们就可以快速地从该恶意软件家族的样本中提取出此类信息了,而这些信息将有助于我们开展下列操作:
1、建立可操作的威胁情报集合,并进行分析和归因;
2、更好地了解攻击者所使用的攻击技术、策略和程序代码;
3、追踪威胁行为者的行为;
总结
随着Android平台的快速发展,威胁行为者的目标将是范围更广的Android操作系统版本。通过钩子框架,沙箱可以揭露使用静态分析方法难以发现的恶意行为,而识别这些恶意行为对于提高恶意软件检测率来说,是至关重要的。
参考来源
https://unit42.paloaltonetworks.com/hooking-framework-in-sandbox-to-analyze-android-apk/