恶意代码分析-Android Pegasus的技术分析

摘要

Pegasus是由NSO集团开发的间谍软件,大赦国际和CitizenLab反复分析。在本文中,我们剖析了Lookout在本文中最初分析的Android版本,我们建议与这篇文章一起阅读。正如一位研究人员在这里强调的那样,在我们对Android版Pegasus的研究中,我们发现供应商错误地将一些无记录的APK文件归因于Pegasus。由于代码的复杂性和长度,我们将分析分为3部分。我们还试图尽可能保留Lookout提议的部分名称,以便任何人都可以更容易地遵循这两种方法。在最后一部分,我们将介绍WAP推送消息,这些消息可用于在没有用户交互的情况下自动加载手机上的内容,通过MQTT协议的C2通信,利用MediaPlayer中以前未披露的漏洞,以及间谍软件跟踪手机位置的能力。您可以在此处查阅Pegasus分析的第二部分。

技术分析

SHA256:ade8bef0ac29fa363fc9afd958af0074478aef650adeb0318517b48bd996d5d5

Pegasus初始化

代理提取Android版本,这是一个唯一标识构建的字符串,并尝试检索名为“isItFirstRunEver”的配置值,该值指示这是否是恶意软件的第一次运行:

该过程验证设备上是否存在“/data/data/com.network.android”目录;否则,将创建它。目录的存在意味着这不是恶意软件的首次执行,使用putBoolean函数将“isItFirstRunEver”值设置为false:

它检查手机上是否存在恶意APK文件,并将使用名为“/system/csk”的超级用户二进制文件来运行具有root权限的命令:

检查名为“/sdcard/MemosForNotes”的解毒剂文件,如果找到此文件,间谍软件将自行删除(见图)。

代理调用多个函数,从目标应用程序中窃取信息,如下图所示。

一个名为“screen_off_timeout”的值,表示设备进入睡眠状态或不活动后开始做梦前的毫秒数,由该过程提取,并与15秒进行比较。其他配置值,如“wasPhoneWasUnmutedAfterTapNicly”[原文如此]、“originalVibrateValue”和“originalRingerValue”也从配置中提取:

WAP推送消息

该进程记录一条消息,指示WAP设置的更改:

它检索“/data/data/com.android.mms/shared_prefs/com.android.mms_preferences.xml”的文件权限,并使用chmod命令进行更改它们:

LD_LIBRARY_PATH环境变量被修改,上述文件的权限设置为读写(0666):

代理更改WAP设置以启用推送消息,如下图所示。

恶意软件验证Build.FINGERPRINT值是否包含“JPKJ2”,并停止消息应用程序:

名为“/system/csk”的超级用户二进制文件预计将在手机上找到,见下图

恶意进程在“/data/data/com.android.providers.telephony/databases/mmssms.db”上检查是否存在SMS/MMS数据库:

“mmssms.db”、“mmssms.db-shm”和“mmssms.db-wal”数据库的权限更改为0777(为所有者、组和其他人员读取、写入和执行):

代理打开上述数据库之一,并通过对rawQuery的函数调用运行以下SQL查询:

提取“href”、“_id”、“read”、“seen”和“thread_id”列的索引:

间谍软件试图删除一些WAP推送消息,这些消息可用于在手机上的浏览器中自动打开链接,而无需用户交互:

通过调用SQLiteDatabase.delete方法删除WAP消息

消息队列传输(MQTT)

与命令和控制基础设施通信的另一种方式是使用MQTT协议。

“should_use_mqtt”配置值确定是否允许代理通过MQTT与C2服务器通信,如下所示:

另一个名为“mqttAllowedConnectionType”的配置值指示手机在连接到Wi-Fi时是否允许通过MQTT进行通信(值=1),移动数据(值=4),或者当设备漫游时(值=8):

该恶意软件通过函数调用getAllNetworkInfo检索所有网络类型的连接状态信息,并将网络类型与“WIFI”和“MOBILE”进行比较:

isNetworkRoaming功能用于验证手机是否正在漫游:

应用程序提取当前日期,并确保在配置中找到的令牌ID不是空的:

从配置中获得以下值:

mqttIdPref – 结合用户名识别客户端
mqttQos – MQTT连接的服务质量
mqttHost – 攻击者的MQTT主机
mqttPort – MQTT端口号

“mqttUsername”配置值表示使用MQTT服务器进行身份验证时使用的用户名,而“mqttPassword”值是身份验证过程中使用的密码:

恶意软件记录包含MQTT URL、用户名和密码的消息,然后调用将启动通信的函数:

MQTT代理URL由恶意进程构建:

“mqttKaTimer”配置值表示MQTT保持活力计时器

最后,该过程通过MQTT与攻击者的基础设施建立网络连接,并将代理URL与“tcp://”、“ssl://”和“local://”进行比较:

重新连接尝试的最大次数存储在名为“mqttRecCount”的配置值中:

代理尝试订阅配置中指定的MQTT主题,如图39所示

应用程序记录多条消息,表明成功连接和订阅该主题:

NetworkInfo.isConnected方法用于验证设备上是否有活跃的互联网连接:

二进制文件从代理上的主题中接收包含要执行的命令的消息:

正如我们在第2部分已经描述的那样,所有命令都添加到队列中:

参数“s=”包含一个校验和,该校验和将与另一个计算值进行核对,以确认命令是由威胁行为者传输的:

通过MQTT传输的命令包含一个令牌值,用于识别受感染的设备,如下图所示。

如果校验和不匹配,该命令将不会执行:

我们在这里已经描述的通过短信收到的命令也可以使用MQTT协议传输:

电子邮件附件

emailAttCmd命令可用于从EmailProviderBody.db数据库中检索电子邮件和附件:

下载文件

该恶意软件能够从远程URL下载其他文件/软件包)

该过程使用openConnection函数打开与特定URL的连接,并将读取超时设置为120秒,连接超时设置为1800秒:

通过调用URLConnection.getInputStream和BufferedInputStream.read函数来读取响应主体:

通过调用FileOutputStream.write,文件填充了从远程URL下载的缓冲区:

MediaPlayer中的漏洞利用

据我们所知,这是第一次提到Pegasus for Android利用了MediaPlayer中的漏洞。不幸的是,名为“/data/data/com.network.android/output.mp3”的负责开发的文件是空的,我们无法检索其内容:

MP3文件在运行时使用FileOutputStream.write函数填充。文件的权限由恶意软件设置为511

setDataSource方法用于设置MediaPlayer的数据源。该应用程序准备并开始播放,我们认为这将导致利用漏洞:

跟踪手机的位置

Pegasus间谍软件能够监控设备的位置。它通过调用isProviderEnabled函数来验证GPS提供程序是否处于活动状态,然后使用requestLocationUpdates函数获取位置信息:

位置存储在XMLSerializer对象中,其中包含纬度、经度、位置高度、估计水平精度半径和位置时的速度:

该过程通过使用getNetworkOperator调用getCellLocation和当前注册运营商的数字名称(MCC+MNC)来检索设备的当前位置。GSM单元ID和GSM位置区号也存储在XMLSerializer对象中:

其他相关活动

代理将Android版本与2.3进行比较,然后将手机型号与列表进行比较,如下所示:

正如我们在第1部分中已经描述的那样,恶意软件有能力自我升级:

应用程序获取SIM的序列号并提取“本地”配置值

提取“NetworkWindowSim”配置值,并与上述值进行比较。如果这两个值不匹配,则表示SIM卡已更改,配置值也相应更改。

间谍软件验证设备上是否存在“/data/reinslock”文件,这表明应用程序已重新安装:

正如我们在整个分析中看到的,威胁者没有做出任何努力来隐藏APK的真正目的.下图显示了表明Pegasus已成功初始化的消息:

我们对Android版Pegasus的3部分分析到此结束。我们相信,这里介绍的一些功能也被最近的恶意软件家族使用,我们的分析可能代表检测它们的第一步。