写在前面的话
当前的Android生态环境中充斥着各种类型的恶意软件,每一款恶意软件都有其自己独特的一面。在大多数情况下,它们的目标都是窃取用户数据,然后将其出售以换取金钱。但某些恶意软件则可以被归类为间谍软件,因为它们的唯一目的就是通过窃取尽可能多的用户数据来监控用户,并尽可能地在目标设备上隐藏更久的时间。
最近,研究人员对一款名为SpyNote的恶意软件进行了跟踪和分析。SpyNote是一款间谍软件,它可以通过Smishing短信诈骗(例如恶意SMS消息)的形式来传播,并敦促目标用户使用短信提供的链接来下载和安装该应用程序。毫无疑问,恶意软件的托管和下载都不会在官方的Play Store上完成。
在这篇文章中,我们将对SpyNote间谍软件进行深入分析,并描述SpyNote中的一些突出功能和间谍软件的一些典型特征。
SpyNote样本
我们分析的SpyNote样本SHA256如下:
bad77dca600dc7569db4de97806a66fa969b55b77c24e3a7eb2c49e009c1f216
包名如下:
Glasgow.pl.dimensional
Manifest文件
跟平时分析Android恶意软件一样,我们首先会分析其AndroidManifest.xml文件,如下图所示,虽然SpyNote求的权限列表不是很全面,但我们确实看到它请求了一些可疑的权限。其中包括READ_SMS、PROCESS_OUTGOING_CALLS、CAMERA、RECORD_AUDIO、WRITE_EEXTERNAL_STORAGE和BIND_ACCESSILITY_SERVICE等。尽管对这些权限的请求并不总是表示恶意行为,但这些是间谍软件请求的典型权限。
入口点
下一步就是要确定这个可疑的间谍软件的入口点,并找到SpyNote为此所使用的方法。在第一次检查时,我们发现AndroidManifest.xml中使用的几种方法可以作为“入口点”。为了深入观察其行为,我们在测试Android设备上安装了SpyNote并观察其行为,这有助于将手机上观察到的行为与代码关联起来。
一般来说,我们有下列几种方法来为应用程序创建入口点:
1、通过处理MAIN和LAUNCHER类型Intent的启动器Activity;
2、后台运行的服务;
3、广播接收器,当系统发送应用程序期望的广播时被调用;
4、应用程序中定义的attachBaseContext方法声明;
App隐藏
安装后,我们注发现在应用程序启动器中是看不到该应用程序的。不过,在“手机设置”->“应用程序”菜单中进行简单检查,即可显示该应用程序已成功安装。因此,我们可以推断SpyNote应该使用了隐藏技术以避免其被发现安装在了目标用户的设备上。
间谍软件因为要尽可能久地安装在目标设备中,因此一般会使用下列几种方法来实现隐藏以避免检测:
1、使用setComponentEnabledSetting在运行时隐藏App;
2、在AndroidManifest.xml中不指定启动器Activity Intent(CATEGORY_LAUNCHER);
如下图所示,SpyNote的启动器Activity并没有CATEGORY_LAUNCHE,这样就可以达到隐藏的目的了,而且下图还显示了MAIN Activity的类名称:
从“最近使用的应用”中隐藏
根据Android文档的描述,“最近使用的应用”页面是一个系统级UI,可以列出最近访问的活动和任务。用户可以在列表中导航,选择要继续的任务,或者通过滑动将任务从列表中删除。
除了隐藏安装之外,SpyNote还会将其从Android设备的“最近使用的应用”页面中隐藏自己的活动,这一点可以通过在AndroidManifest.xml中将android:excludeFromRecents属性设置为true来实现。
启动隐藏的App
对于间谍软件来说,保持隐藏是至关重要的。然而,这就提出了一个问题:“目标设备如何启动间谍软件应用程序,从而窃取数据”?
恶意软件一般可以通过下列几种方法来启动隐藏的App:
1、通过SMS短信发送命令,恶意软件接收到了“新短信”的广播之后,则显示隐藏的App图标;
2、收到外部触发条件后启动App(例如拨打电话广播、在Manifest文件中为指定URL添加intent过滤器等);
3、使用一个单独的启动器App,这个App只会向恶意软件发送intent,恶意软件接收到intent后便会启动;
分析后发现,SpyNote恶意软件应用程序可以通过外部触发器启动。为此,我们创建了一个“Hello World” Android应用程序,具体如下图所示。它只发送必要的intent,收到intent之后,恶意软件App便会启动:
权限
启动之后,SpyNote便会请求BIND_ACCESSILITY_SERVICE权限,一旦目标用户授予该权限,SpyNote就会利用该权限来自行授予自己多个其他所需权限,包括android.permission.PROCESS_OUTGOING_CALLS、android.pPermission.RECORD_AUDIO和android.permission.WRITE_EXTRENAL等:
SpyNote首先会依次请求Manifest文件中定义的所有权限,它不会等待目标用户授权这些权限,而是生成一个“点击”事件来复制用户的“点击”行为,从而自行授予所有请求的权限。
顽固的服务
SpyNote启动后,我们发现它会运行两个名称经过模糊处理的服务,根据AndroidManifest.xml,我们可以确认这些是在两个名为C71和C38的类中实现的。对代码的进一步调查表明,这些服务就是我们所说的“顽固服务”,而这种服务的主要目标是让关闭恶意软件应用程序变得非常困难。
SpyNote通过注册一个名为“RestartSensor”的广播接收器(一个允许我们注册系统或应用程序事件的Android组件)来实现此功能。此广播接收器是唯一的,因为系统上没有其他接收器能够处理SpyNote在即将关闭时生成的特定广播。
每当SpyNote服务即将关闭时,就会调用该服务的onDestroy方法。onDestroy方法本身生成一个“RestartSensor”广播。这是特定于此应用程序的广播,系统上的任何其他应用程序都无法生成。在接收到该广播后,广播处理程序(它是先前注册的唯一接收器)将重新启动服务:
下图是上述流程的代码实现部分,SpyNote首先在AndroidManifest.xml文件中声明了一个广播接收器。每当试图关闭以销毁恶意服务时,onDestroy方法都会生成“RestartSensor”广播,广播接收器然后便会重新启动服务:
C2网络通信
SpyNote在窃取到目标用户数据之后,需要将其发送给威胁行为者。在我们正在分析的SpyNote示例中,C2通信是作为间谍软件服务初始化的一部分立即建立的。SpyNote的C2所使用的IP地址和端口使用了Base64编码:
电话录音
SpyNote甚至还会将目标用户的来电记录为.wav文件,并将文件发送到C2服务器。它首先授予自己“READ_CALL_LOG”权限,而这个权限则要“归功”与之前拿到的ACCESSILITY_SERVICE权限,它还会为系统广播intent “PHONE_STATE”额外定义一个广播接收器。
当目标用户接到来电时,电话状态会发生变化,广播接收器也会被触发。广播接收器中的代码会检查目标用户是否接听了电话,一旦确认,就会开始录制音频:
图像捕捉/截图
SpyNote使用了MediaProjectionAPI来捕捉目标用户Android设备上的图像信息。
MediaProjection API允许应用程序捕获设备内容,这些内容可以录制或投射到电视等其他设备。然后,这些捕获的内容被呈现到中间的“虚拟显示器”,这是媒体投影的核心。最后,Surface会从“虚拟显示器”中获取这些图像并渲染这些图像。
为了实现图片捕捉或屏幕截图,SpyNote注册了一个onImageAvailableListener,只要有新的图像可用,就会调用该侦听器,并将捕捉到的图像存储为JPG文件并发送至C2服务器:
记录和窃取数据
间谍软件的一些核心功能是监视、记录和提取用户数据,SpyNote也不例外。SpyNote成功启动后,它会创建一个新的日志文件,并开始记录目标用户执行的各种操作。
击键记录是SpyNote的另一个核心功能,它会在自己的日志文件中以Base64字符串的形式记录目标用户按下的所有击键信息,其中包括用户数据和密码凭证等内容:
难以卸载
由于SpyNote是是隐藏的,用户无法“长按”应用程序图标并将其卸载。然而,每当用户通过“设置”导航到应用程序时,SpyNote都会关闭菜单屏幕,从而防止其被卸载,这可能是因为SpyNote获取了BIND_ACCESSILITY_SERVICE权限。
而且目标用户也无法通过开发者选项停止SpyNote的服务,用户唯一的选择就是执行出厂设置。
总结
SpyNote是一种典型的Android端间谍软件,它能够记录和窃取各种信息,包括按键、通话日志、已安装应用程序的信息等。它隐藏在目标用户的设备上,很难被注意到,这也使得卸载变得极其棘手。目前,目标用户唯一的选择是执行设备出厂重置以删除恶意软件。
入侵威胁指标IoC
bad77dca600dc7569db4de97806a66fa969b55b77c24e3a7eb2c49e009c1f216
37[.]120[.]141[.]140:7775