SoumniBot恶意软件非常规分析和检测规避方法

admin 2024年6月9日00:37:44评论4 views字数 3375阅读11分15秒阅读模式

更多全球网络安全资讯尽在邑安全

本文由DMITRY KALININ与2024年4月份发表于Securelist网站,介绍并分析了一款名为“SoumniBot”的Android恶意软件,主要重点围绕着该恶意软件所采用的分析检测规避技术。

SoumniBot恶意软件非常规分析和检测规避方法

很多恶意软件的开发人员经常会使用各种工具来阻止他们的恶意代码被检测或分析,当然也包括Android恶意软件在内。近期,我们的团队发现了一种名为“SoumniBot”的新型银行木马,该恶意软件主要以韩国地区的用户为主要目标,采用了一种非传统的分析与检测规避技术,即混淆Android Manifest文件。

SoumniBot混淆技术:利用Android Manifest提取和解析程序中的安全漏洞

任何APK文件,其本质上就是一个ZIP压缩文档,根目录中都会有一个AndroidManifest.xml文件。这个文件中包含了应用程序声明的组件、权限和其他应用程序数据的相关信息,并且能够帮助操作系统检索有关各种应用程序入口点的信息。就像操作系统一样,安全分析人员首先会检查Manifest文件来确定应用程序的入口点,这也是代码分析最开始的起始位置。而这一事实,很可能就是SoumniBot的开发人员研究Manifest文件解析和提取程序实现方式的原因,而且他们也确实成功地从中找到了一些混淆APK的机会。

技术一:无效的压缩方法值

这是一种相对知名的技术,包括SoumniBot在内的各种类型的恶意软件都在积极使用这种技术,这种技术跟Manifest文件的解包方式有关。在libziparchive库中,标准的解压函数只允许在记录Header中存在两个压缩方法值,即0x0000(未压缩)和0x0008(已压缩),否则就会返回一个错误。下图所示代码为libziparchive库的解压算法:

SoumniBot恶意软件非常规分析和检测规避方法

但是,除了使用这个函数之外,很多Android开发人员会选择实现另一种场景,而这种自实现的场景下会出现压缩方法字段验证错误的情况。

下图显示的是Manifest提取程序代码:

SoumniBot恶意软件非常规分析和检测规避方法

如果APK解析程序在目标APK程序AndroidManifest.xml入口点处遇到了任何非0x0008的压缩方法值,则会认为数据未压缩。此时,将允许应用程序开发人员在压缩方法中存储任何非0x0008的值,并写入未压缩的数据。虽然任何正确实现了压缩方法验证的解包工具都应该将这个Manifest文件视作是无效的,但Android APK解析程序却会将其视作是正常的,并允许应用程序执行安装操作。下图显示的是这种技术在文件b456430b4ed0879271e6164a7c0e4f6e中执行的情况,其中包含了无效的压缩方法值,后面跟的是未压缩的数据:

SoumniBot恶意软件非常规分析和检测规避方法

技术二:无效的Manifest大小

这里,我们以文件0318b7b906e9a34427bf6bbcf64b6fc8为例来介绍这种技术。ZIP文档中AndroidManifest.xml入口点Header标记了Manifest文件的大小,如果条目以未压缩状态存储,即使它的大小标记不正确,它也会原样从文档中被拷贝出来。Manifest解析程序会忽略掉任何的数据覆盖,因为这些信息是跟在Payload之后的,跟Manifest无关。恶意软件就利用了这一点,声明文档Manifest的大小超过其实际大小,此时便会导致数据覆盖,从而导致文档中的内容添加到未打包的Manifest中。更严格的Manifest解析程序将无法读取这样的文件,但Android解析程序却能够正常处理无效的Manifest文件。

下图显示的是Manifest声明大小超过其实际大小的文件数据:

SoumniBot恶意软件非常规分析和检测规避方法

需要注意的是,虽然实时设备能够将这些文件解析为有效文件,但Google自己的官方应用程序apkanalyzer却无法处理这些文件,我们也已经将相关信息上报给了Google。

技术三:长命名空间名称

SoumniBot恶意软件家族也使用了这种技术,我们以文件fa8b1592c9cda268d8affb6bceb7a120为例,其中Manifest包含了非常长的字符串,并将其用作了XML命名空间的名称:

SoumniBot恶意软件非常规分析和检测规避方法

然后这个字符串被用作了命名空间名称:

SoumniBot恶意软件非常规分析和检测规避方法

包含类似上图所示字符串的Manifest无论分析人员还是应用程序都是无法看懂的,而且应用程序可能也无法分配足够的内存来处理它们。但是操作系统中的Manifest解析程序会完全忽略命名空间,因此它们在处理这类Manifest文件时并不会出错。

揭开SoumniBot混淆技术的神秘面纱

在启东时,应用程序会利用两个参数(mainsite和mqtt)从服务器请求一个配置文件,服务器地址在代码中是一个硬编码的常量:

SoumniBot恶意软件非常规分析和检测规避方法

这两个参数都是服务器地址,恶意软件需要这些地址才能正常运行。mainsite服务器负责接收收集到的数据,mqtt则负责提供用于接收命令的MQTT消息传递功能。如果源服务器由于某种原因没有提供这些参数,则应用程序将使用默认地址,这些地址时直接硬编码在代码中的。

请求了所需参数之后,应用程序将启动恶意服务。如果由于某种原因无法启动或停止,则每16分钟进行一次新的尝试。第一次运行时,木马会隐藏应用程序图标(增加删除难度并降低被发现的风险),然后然后每隔15秒就开始在后台将数据从目标设备上传到mainsite。这些数据包括IP地址、由IP推断出的国家位置信息、联系人和帐户列表、短信和彩信,以及使用trustdevice-android库生成的目标用户ID。除此之外,恶意程序还会订阅来自MQTT服务器的消息,以接收各种命令。

其中有一个命令非常重要,这个命令能够发送与目标设备相关的信息,例如电话号码、运营商信息、木马版本、所有的SMS短信、通讯录信息、账号信息、相片、视频和在线银行凭证等。除此之外,该命令还会在外部存储介质中搜索包含/NPKI/yesign路径的.key和.der文件:

public static List getAllBankingKeys(Context context) {

List list = new ArrayList();

Cursor cursor = context.getContentResolver().query(MediaStore.Files.getContentUri("external"),

new String[]{"_id", "mime_type", "_size", "date_modified", "_data"},

"(_data LIKE '%.key' OR _data LIKE '%.der')", null, null);

int index = cursor == null ? 0 : cursor.getColumnIndexOrThrow("_data");

if (cursor != null) {

while (cursor.moveToNext()) {

String s = cursor.getString(index);

If (!s.contains("/NPKI/yessign")) {

continue;

}

Logger.log("path is:" + s);

list.add(s);

break;

}

cursor.close();

}

return list;

}

如果恶意程序找到了这样的文件,它会将它们所在的目录复制到ZIP文件中,并将其发送到C&C服务器。这些文件是韩国银行向客户颁发的数字证书,用于登录网上银行服务或确认银行交易。需要注意的是,这种技术在安卓银行恶意软件中并不常见。

卡巴斯基安全监测方案将SoumniBot标记为了Trojan-Banker.AndroidOS.SoumniBot。

总结

目前,很多恶意软件开发人员都会尝试在不被发现或检测到的情况下最大限度地增加成功感染的设备数量,这也促使他们努力寻找更加复杂的新技术和新方法。不幸的是,由于Android Manifest解析程序的代码由于验证机制不够严格,给了SoumniBot可乘之机。

原文来自: freebuf.com

原文链接: https://securelist.com/soumnibot-android-banker-obfuscates-app-manifest/112334/

原文始发于微信公众号(邑安全):SoumniBot恶意软件非常规分析和检测规避方法

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年6月9日00:37:44
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   SoumniBot恶意软件非常规分析和检测规避方法http://cn-sec.com/archives/2813393.html

发表评论

匿名网友 填写信息