警惕 Snowblind:一种新型 Android 恶意软件


警惕 Snowblind:一种新型 Android 恶意软件

介绍

Promon 的应用威胁报告传统上针对常见的恶意软件攻击媒介审查应用。本报告探讨了一种针对东南亚银行的新恶意软件使用的独特攻击媒介。 

2024 年初,我们的合作伙伴i-Sprint提供了一个新型 Android 银行木马样本,我们将其命名为Snowblind。我们对 Snowblind 的分析发现,它使用一种基于 Linux 内核功能seccomp的新技术来攻击 Android 应用程序。Android 使用 seccomp 对应用程序进行沙盒处理并限制它们可以进行的系统调用。这是一项安全功能,旨在使恶意应用程序更难以破坏设备。然而,Snowblind 滥用 seccomp 作为攻击媒介来攻击应用程序。我们以前从未见过 seccomp 被用作攻击媒介,我们惊讶于如果被恶意使用,它的强大功能和多功能性。 

本报告将介绍 Snowblind,并详细描述该恶意软件使用的攻击媒介的工作原理。即使实施了强大的混淆和完整性检查,Snowblind 也能利用攻击媒介轻松绕过强大的反篡改机制(如重新打包检测)。虽然这只是一个用例,但我们也注意到,Snowblind 使用的攻击媒介可以以多种不同的方式用于入侵应用程序,并使成功、可扩展的应用程序攻击变得更加容易。 

Promon 还在Promon SHIELD® for Mobile版本 6.5.2中实施了针对 Snowblind 的保护。Promon SHIELD for Mobile版本 6.6.0 可保护更广泛的基于seccomp的攻击。我们鼓励所有客户更新到最新版本。

Snowblind——引入一种新的 Android 攻击媒介 

恶意软件攻击 Android 应用程序的一个非常常见的攻击方式是(滥用)使用 Android 无障碍服务功能来获取用户名和密码等用户输入,或远程控制应用程序以执行恶意操作。然而,由于这是一种常见的攻击,应用程序已经开始实施针对它的保护机制。 

通常,这是通过向系统询问所有已启用的无障碍服务,然后检查它们是否值得信赖来完成的。如果发现不值得信赖的无障碍服务,应用程序可以对此做出反应。在最简单的情况下,应用程序可以向用户显示警告消息。理想情况下,这样做的方式不能被无障碍服务轻易操纵。但应用程序也可以使用更强大的措施,比如向服务器发送遥测数据,甚至终止自身。

这是一种非常有效的保护措施,很可能可以防止许多基于恶意辅助功能服务的攻击。正因为如此,攻击者似乎已经意识到他们必须加强他们的攻击手段。为了绕过这种保护措施,攻击者通常会对他们所针对的应用程序进行重新打包攻击,其中应用程序代码中检测恶意辅助功能服务的部分被操纵,使其永远检测不到任何东西。如果应用程序没有检测到这种篡改,并且应用程序不会让找出应用程序的哪些部分需要修改变得困难(即这些部分没有被混淆),那么这很容易做到。然而,由于重新打包是攻击 Android 应用程序的常用方法,许多应用程序也通过篡改检测和/或混淆代码的敏感部分来防止它。所以,再次强调,攻击者在攻击此类应用程序时需要更进一步。 

去年,我们分析了FjordPhantom 恶意软件,该恶意软件会攻击应用程序,阻止它们检测恶意的辅助功能服务。为了实现这一目标,它会将代码注入应用程序,当应用程序请求启用的辅助功能服务列表时,该代码会挂接到应用程序与系统之间的通信中。在这种情况下,恶意软件作者不是通过直接修改应用程序来绕过篡改检测机制,而是将其加载到虚拟化环境中并加载执行挂接的其他代码。此外,攻击者不需要对应用程序进行反混淆,因为他们不需要找到检测发生的确切位置。他们只是挂接到代码用来确定启用了哪些辅助功能的系统接口。 

Snowblind 的目标与FjordPhantom完全相同,即阻止检测到恶意辅助服务,这样目标应用就不会警告用户它们的存在。FjordPhantom 和 Snowblind 之间的区别在于,在绕过防篡改机制的同时,使用的技术也不同。Snowblind 不使用虚拟化来实现这一点。相反,它执行正常的重新打包攻击,但使用一种基于 seccomp 的鲜为人知的技术,该技术能够绕过许多防篡改机制。  

有趣的是,FjordPhantom和 Snowblind 瞄准的是来自东南亚的应用程序,并利用了强大的新攻击技术。这似乎表明该地区的恶意软件作者已经变得非常老练,而 Promon 将更加专注于分析来自该地区的恶意软件。 

从我们的角度来看,Snowblind 基于 seccomp 的技术比恶意软件本身更有趣。它似乎有潜力实现比恶意软件更多用途。  

警惕 Snowblind:一种新型 Android 恶意软件

观看 Snowblind 的实际操作

什么是 seccomp? 

seccomp(安全计算)是 Linux 内核中的一项功能,用户空间进程可以使用它来指定在进程执行系统调用时检查的策略。一旦将策略应用于给定进程,就无法再将其删除。同样,如果进程分叉任何子进程,它们将从其父进程继承策略。seccomp旨在作为一种沙盒机制,用于进程想要减少其攻击面或内核的攻击面的情况。 

seccomp可以以两种模式使用:当它在 2005 年 3 月首次推出时,它仅包含一种严格模式,其中只允许对已打开的文件描述符进行exit ()和sigreturn ()系统调用以及read ()和write ()系统调用。这是一种非常锁定且不太灵活的策略,因此它主要用于运行不执行任何系统调用的不受信任的代码,但仅此而已。为了获得更大的灵活性,seccomp-bpf 于 2012 年 7 月推出。在这种模式下,可以使用伯克利数据包过滤器 (BPF) 指定策略,这使应用程序能够定义细粒度的策略,这使得seccomp在许多用例中相当有趣。如今,seccomp在许多流行的项目中用于沙盒,包括 Docker、OpenSSH、vsftpd、Firefox 和 systemd。  

在我们思考seccomp在 Android 上的用途之前,需要回答一个问题:seccomp (尤其是 seccomp-bpf)在 Android 上可用吗?如果可用,从什么时候开始?如前所述,seccomp并非一直是 Linux 内核的一部分,此外,在构建 Linux 内核时需要通过启用CONFIG_SECCOMP和CONFIG_SECCOMP_FILTER配置选项来启用它。由于设备制造商通常会构建自己的内核,因此也可能存在严重的碎片化。 

我们发现,从 Android 8 开始,Google 就谈到了在 Android 中使用seccomp 。具体来说,Google 开始在 zygote 中使用seccomp ,以防止应用执行某些不寻常的系统调用,从而减少内核在受到恶意应用攻击时的攻击面。此外,我们还发现,在 Android 8 中,Google 已向 Android CTS(兼容性测试套件)添加了测试,以检查 seccomp-bpf 是否可用。CTS 是一个测试套件,设备制造商应使用它来测试他们为其设备构建的 Android 版本是否兼容。这让我们确信,大多数设备至少从 Android 8 及更高版本开始都应该支持 seccomp-bpf。我们还在 Android 5 及更高版本的所有 Android 模拟器上运行了测试,并验证了 seccomp-bpf 在所有模拟器上都可用。这让我们相信,seccomp-bpf 也很有可能在运行早期 Android 版本的设备上可用。

如何使用seccomp- bpf ? 

在考虑 seccomp-bpf 的潜在功能和用途时,首先要很好地了解如何使用它以及开发人员在使用它时有哪些选项。 

使用 seccomp-bpf 时要做的第一件事是定义应应用于进程的 BPF 过滤器。BPF 过滤器是在内核中执行的小程序。这些程序可以做很多事情,但我们不会在这里详细介绍。在 seccomp-bpf 的上下文中,重要的是这些程序有一些称为struct seccomp_data的输入 ,它为它们提供有关即将执行的系统调用的信息。此结构定义如下:   

警惕 Snowblind:一种新型 Android 恶意软件

seccomp-bpf 过滤器可以加载这些数据,然后根据这些值做出决策。最常见的用途是根据系统调用的数量来过滤系统调用。此外,还可以定义过滤器以根据调用的来源地址以及系统调用的参数进行过滤。最终,过滤器需要决定下一步要做什么。为此,有不同的选择: 

警惕 Snowblind:一种新型 Android 恶意软件

常用的选项是允许系统调用、停止它并返回错误,或者让内核立即终止进程或线程。 

最后,一旦定义了过滤器,就需要将其应用于进程。如果应用程序未使用CAP_SYS_ADMIN运行 (通常不是这种情况),则首先需要执行 prctl () 系统调用,并将PR_SET_NO_NEW_PRIVS选项设置为 1。这是一种安全措施,可确保子进程无法获得比安装过滤器的进程更高的权限,因为这可能是一个安全问题,尤其是对于可能被阻止放弃权限的 setuid/setgid 程序。之后,可以使用 prctl () 系统调用和PR_SET_SECCOMP选项以及SECCOMP_MODE_FILTER参数和指向过滤器的指针将过滤器应用于进程。 

综上所述,这是一个简单的例子: 

警惕 Snowblind:一种新型 Android 恶意软件

这定义了一个程序,它查看正在调用的系统调用的系统调用号,并将其与ptrace()系统调用的系统调用号进行比较。如果它们匹配,则过滤器返回SECCOMP_RET_KILL_PROCESS ,指示内核终止该进程。否则,它返回SECCOMP_RET_ALLOW ,指示内核允许该系统调用。 

攻击的可用性  

现在的问题是:该功能如何用于攻击?首先,它可以用来阻止应用程序执行某些操作。如果阻止了必要的系统调用,这可能会带来安全隐患。但与 Snowblind 使用的技术相比,它并不是很强大。 

那么,Snowblind 会做什么呢?其目标是防止检测到应用程序已被重新打包。这需要绕过被攻击应用程序中的防篡改机制。检测重新打包的常用方法是检查磁盘上应用程序的 APK 文件以查看它们是否已被篡改。这需要应用程序打开磁盘上的文件并读取其内容。如果攻击者可以以某种方式挂接到此过程并将文件的打开重定向到另一个未修改的应用程序版本,则防篡改机制将被绕过。这是对防篡改机制的常见攻击。问题是,你如何进行这种挂接?在没有任何保护的应用程序中,打开文件(无论是从 Java 还是本机代码)最终都会调用libc 中的open()之类的东西 。在这种情况下,攻击者可以直接覆盖 libc 中的代码,以在应用程序的文件被打开时导致不同的行为。或者,攻击者可以执行全局偏移表挂钩来挂钩调用 open()的库和 libc 之间的接口 。  

这些显然是众所周知的攻击,因此应用程序已开始对其进行保护。常见的方法是验证内存中的 libc 中没有钩子,或者首先不依赖 libc。在本机库中重新实现open()等系统调用以使此类攻击更加困难已成为一种常见做法。这意味着攻击者必须在目标库中找到实现并改为钩住这些实现。但是,实现这些保护机制的开发人员知道这一点,并使用混淆和强大的完整性检查来对内存中的代码进行检查,使这些攻击更难以执行。一个常见的假设是,如果您在本机库中实现代码,自己实现关键系统调用,并应用良好的混淆和完整性检查,您的代码将很难受到攻击。攻击者仍然有一些选择,例如破坏混淆和/或完整性检查、修补内核或使用代码跟踪或代码模拟框架。但所有这些选项都可能需要相当长的时间,或者对于大规模攻击来说扩展性不佳。 

现在我们回到 Snowblind。它所针对的应用程序确实在本机库中实现了防篡改机制,使用自己的系统调用实现结合强混淆和完整性检查,这可以被视为最佳实践。然而,Snowblind 使用的技术打破了这种攻击难度大的假设。Snowblind 在应用程序中添加了一个额外的本机库,该库在防篡改代码首次运行之前加载。这个本机库在加载到的进程中安装了自己的seccomp过滤器。如果我们反编译这个过滤器,我们会发现它允许除open()和其他几个系统调用之外的所有系统调用。对于open() ,过滤器返回SECCOMP_RET_TRAP 。这个返回值指示内核停止系统调用,而不是执行它,而是生成进程可以捕获的SIGSYS信号。恶意软件还为SIGSYS安装了一个信号处理程序;每当它收到该信号时,它都可以检查和操作线程的寄存器。它利用该功能操纵open()调用的参数,使其指向未经修改的应用程序原始版本文件。最后,它使用操纵后的参数执行 open 系统调用,这样防篡改机制就被轻松而可靠地绕过了。  

这是一个简单的例子(在 arm64 上): 

警惕 Snowblind:一种新型 Android 恶意软件

警惕 Snowblind:一种新型 Android 恶意软件

挂接应用程序发出的所有 open 调用可能会生成许多信号并显著降低应用程序的速度。此外,执行 open 系统调用的信号处理程序本身是否也应该触发 seccomp过滤器?恶意软件使用额外的技巧来解决这些问题,即让过滤器检查对系统调用的调用来自何处。如果调用来自实现防篡改机制的库,过滤器将仅指示内核生成信号。这大大提高了攻击速度,同时解决了信号处理程序通过执行open() 系统调用触发自身的问题。  

这就是这种攻击非常强大的原因:它允许攻击者过滤、检查和操纵任何系统调用,并且通过能够过滤调用的来源位置以及系统调用的参数,使过滤器的范围变得非常狭窄。这意味着它显然可以做比绕过防篡改机制更多的事情。它可以用来操纵和跟踪任何依赖系统调用的代码,即使它实现了系统调用并使其难以找到和修补。  

我们一直在调查这种方法是否已被公开描述或在任何公共工具中使用。我们在 GitHub 上发现了一些实现此方向的存储库,以及一些描述类似方法的中文博客文章。它们似乎都没有 Snowblind 使用的方法那么精致。它们似乎没有引起太多关注,值得注意的是,所有这些来源似乎都是中文的。 

值得一提的是,有一种流行的工具以类似的方式使用seccomp 。strace 工具可以监视进程进行的任何系统调用。它的工作原理是使用ptrace()系统调用附加到要监视的进程。使用ptrace () ,它可以在进程执行任何系统调用时停止进程。如果进程进行了很多系统调用,这显然会非常慢。strace 5.3 版增加了一个新选项,使其仅跟踪特定的系统调用。这大大加快了跟踪速度。它的工作原理是将seccomp过滤器应用于正在监视的进程,以便在执行应监视的系统调用时触发 SIGSEGV 。与Snowblind使用的方法的不同之处在于, strace使用ptrace()监视来自另一个进程的信号,而不是来自被跟踪进程内部的信号处理程序的信号。 

结论

由于 Snowblind 使用的技术似乎并不为人所知,我们预计许多应用程序都不会对此进行防御。但愿这种情况会有所改变,因为攻击者现在拥有了一种强大的新工具来有效地攻击应用程序。 



感谢您抽出

警惕 Snowblind:一种新型 Android 恶意软件

.

警惕 Snowblind:一种新型 Android 恶意软件

.

警惕 Snowblind:一种新型 Android 恶意软件

来阅读本文

警惕 Snowblind:一种新型 Android 恶意软件

点它,分享点赞在看都在这里

原文始发于微信公众号(Ots安全):警惕 Snowblind:一种新型 Android 恶意软件

版权声明:admin 发表于 2024年7月19日 上午11:15。
转载请注明:警惕 Snowblind:一种新型 Android 恶意软件 | CTF导航

相关文章