本文来自微信公众号“嘶吼专业版”,作者/山卡拉。
安全研究人员最近发现了一种名为Snowblind的新型Android银行木马,它利用了Linux内核特性seccomp,这一特性是传统上用于安全防护的。Snowblind安装了一个seccomp过滤器,用于拦截系统调用并绕过应用程序中的反篡改机制,即使这些应用程序具有强大的混淆和完整性检查。
这种新的攻击向量使得该恶意软件能够窃取登录凭据、绕过双因素认证,并窃取数据,功能非常强大。有人认为这种技术有潜力以多种方式被利用来攻击应用程序。
传统上,安卓恶意软件可利用辅助功能服务窃取用户输入或控制应用程序,但现在应用程序可以检测到恶意的辅助功能服务,迫使攻击者采用重新打包攻击来绕过检测。
Snowblind的工作原理
Snowblind是一种新恶意软件,它利用Linux内核安全功能seccomp来发起更为复杂的重新打包攻击。
与使用虚拟化的FjordPhantom不同,Snowblind在应用程序的防篡改代码运行之前注入了一个带有seccomp过滤器的本机库,从而重定向系统调用,使应用程序无法检测到篡改,并允许恶意辅助功能服务在不被发现的情况下运行。
Seccomp是一种Linux内核功能,它允许用户进程定义系统调用策略,并充当沙盒机制以减少攻击面。
引入了两种模式,严格模式只允许有限的系统调用,而seccomp-bpf通过Berkeley Packet Filters提供了精细的控制。
尽管传统上seccomp在设备制造商的自定义内核中是分散的,但它在Android 8(Oreo)中获得了关注,其中Google在Zygote中实现了seccomp来限制应用程序的系统调用,并在CTS(兼容性测试套件)中添加了测试以确保更广泛的采用,这表明seccomp-bpf可能在大多数运行Android 8及更高版本的设备上可用,甚至可能在更早的版本上可用。
Seccomp-bpf是Linux内核的一项功能,它允许进程限制其可以进行的系统调用,通过阻止进程进行未经授权的系统调用来提高安全性。
结构已定义
要使用seccomp-bpf,开发人员首先定义一个BPF(伯克利数据包过滤器)程序,该程序指定允许哪些系统调用,可以基于系统调用号、系统调用的参数或调用进程。
一旦定义了BPF程序,就会使用prctl()系统调用将其应用于进程。
整合所有内容
带有PR_SET_SECCOMP选项的prctl()系统调用允许进程安装seccomp过滤器,该过滤器是一个指向BPF程序的指针,用于定义允许哪些系统调用。
当进程尝试进行系统调用时,内核首先检查seccomp过滤器,如果过滤器允许该系统调用,内核就会进行系统调用。
如果过滤器不允许系统调用,内核就会向进程返回一个错误。
在arm64上执行的示例
应用程序已经采取了诸如实现自己的系统调用和混淆等对策。
Snowblind注入了一个安装seccomp过滤器的本机库,允许除open()之外的所有系统调用。
当目标防篡改库尝试打开文件时,过滤器会触发SIGSYS信号。自定义信号处理程序在重新执行open()调用之前将原始应用程序的文件路径注入其中,从而有效地绕过防篡改检查。