啥也没干,iPhone竟然又被黑了??

前言

一直标榜注重隐私和数据保护的苹果,在最近又出大问题了,据报道称,2023年12月28日,一个叫混沌通大会的黑客交流会议在德国汉堡召开,大会上,来自俄罗斯知名杀毒软件卡巴斯基的研究团队提出了一个三角测量行动:攻击研究人员的iPhone你会得到什么

事件回顾

所谓的 三角测量行动(Operation Triangulation) ,其实就是在2023年6月的时候,卡巴斯基自己的团队表示,其网络上的一些iPhone被黑客利用iOS漏洞入侵,该漏洞通过iMessage零点击漏洞安装恶意软件。此次攻击所涉及的零日漏洞(CVE-2023-32434CVE-2023-32435),允许攻击者完全控制设备和用户数据,导致无需任何用户交互即可执行代码,并从攻击者的服务器下载其他恶意软件。随后,消息和附件将从设备中擦除。同时,有效负载留在后面,以root权限运行以收集系统和用户信息并执行攻击者发送的命令。同时也认为此次攻击是iPhone历史上最复杂的黑客攻击。

为什么叫三角测量操作?

任意设备接收恶意iMessage附件,启动一系列漏洞利用,执行各种不同的算术运算(如Math.log(-1)或Math.sqrt(-1)),以及检查Media Source API、WebAssembly等组件的可用性外,还通过使用WebGL在粉色背景上绘制黄色三角形并计算其校验和,来执行称为画布指纹识别(Canvas Fingerprinting)的浏览器指纹识别技术。
绘制出的三角形的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
context.bufferData(context.ELEMENT_ARRAY_BUFFER, 1, context. STATIC_DRAW);
context. useProgram(C);
context. clearColor (0.5, 0.7, 0.2, 0.25);context. clear(context.COLOR_BUFFER_BIT);
context. clear(context.COLOR_BUFFER_BIT);
context. drawElements(context. TRIANGLES, 1. length, context. UNSIGNED_SHORT, 0);
C.L = context. getAttribLocation(C, Z('VE'));
C.W = context.getUniformLocation(C, Z('Zv'));
context. enableVertexAttribArray(C.L);
context. vertexAttribPointer(C.L, 3, context. FLOAT, !1, 0, 0);
context.uniform2f(C.W, 1, 1);
context. drawArrays(context. TRIANGLE_STRIP, 0, 3);
var h = new Uint8Array(262144);
context. readPixels(0, 0, 256, 256, context.RGBA, context. UNSIGNED_BYTE, h);
data[' xT'] = h[88849];
data[' jHW00'] = h[95054];
data[' aRR'] = h[99183];
data[' ffJEi'] = h[130012];
for (var p = 0, - = 0; - < h. length; -++)
p += h[-];
data['WjOn'] = p;

绘制出的三角形:

因此,卡巴斯基研究员将此命名为三角测量行动(Operation Triangulation)

漏洞分析

CVE-2023-41990:ADJUST TrueType 字体指令中存在一个漏洞,允许通过恶意 iMessage 附件远程执行代码。
CVE-2023-32434:XNU 内存映射系统调用中存在整数溢出问题,允许攻击者对设备物理内存进行广泛的读/写访问。
CVE-2023-32435:在Safari漏洞中用于执行 shellcode,作为多阶段攻击的一部分。
CVE-2023-38606:使用硬件MMIO寄存器绕过页面保护层 (PPL) 的漏洞,覆盖基于硬件的安全保护。
此次攻击利用了四个**零日漏洞(Zero-day)**,四个漏洞组合在一起构成了完全无法防御的零点击漏洞,允许攻击者完全控制设备和用户数据,为所欲为,下面是整个攻击流程:

JavaScript验证器

攻击链的起点是受害者收到不可见的 iMessage附件,该附件会触发零点击漏洞利用链,旨在秘密打开包含模糊JavaScript和加密负载的唯一URL,有效负载是JavaScript验证器。

二进制验证器

正如我们从感染链图中看到的,这个验证器是在部署TriangleDB植入物之前启动的。JavaScript验证器是一个脚本,与之相反,这个验证器是一个Mach-O二进制文件(因此得名二进制验证器)。启动时,它会使用AES解密其配置。这个配置是一个plist

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
‹key>sco</key>
<array>
<string>DeleteLogs</string>
<string>DeleteArtifacts</string>
<string>ProcessList</string>
<string>InterfaceList</string>
<string>JailbreakDetect</string>
<string>EnableAdTracking</string>
<string›DeviceInfo</string>
<string>InstalledApps</string>
</array>
<key>sda</key>
<dict>
<key>sdf</key>
<array/>
<key>sdi</key>
<true/>
<key>sdk</key>
<array>
<string>c99218578c03cfe347fababc838dd9f2</string>
<string>3d527800ad9418b025340775eaf6454c</string>
<string>07d2143cea9fe70f7a0fcc653a002403</string>
<string>c66cc1d90cce4e9cb6b631e063c83d61</string>

该plist文件包含一个必须由验证器执行的操作列表(如DeleteLogs、DeleteArtifacts等)。具体来说,它会执行以下操作:

  1. 从/private/var/mobile/Library/Logs/CrashReporter目录中删除崩溃日志,以清除可能被利用的痕迹;
  2. 在各种数据库(如ids-pub-id.db或knowledgeec .db)中搜索恶意iMessage附件的痕迹,然后删除它们。为了能够做到这一点,验证器的配置包含40个用于发送恶意imessage的Apple ID的MD5哈希值。研究人员成功破解了大部分哈希值,从而获得了攻击者控制的苹果ID电子邮件地址列表(如下所示):

攻击目标:

获取在设备上运行的进程列表以及网络接口列表;
检查目标设备是否越狱。该验证器实现了对各种越狱工具的检查,包括Pangu、xCon、Evasion7、Electra、discover、checkra1n等等;
开启个性化广告跟踪;
收集有关受害者的广泛信息,如用户名、电话号码、IMEI和Apple ID;

该验证器在iOS和macOS系统上都实现了这些操作:

1
2
3
4
5
6
formatstr = stringWithUtf8String(
&OBJC_CLASS__NSString,
v33,
"/Users/%s/Library/Preferences/com.apple.AdLib.plist");
v39 = getlogin();
adLib_plist_path = stringWithFormat(&OBJC_CLASS__NSString, v40, formatStr, v39);

研究人员还发现攻击者实现了一个未使用的操作,攻击者将其称为 PSPDetect。

1
2
3
4
5
6
7
8
9
10
11
12
v70[0] = stringWithUtf8String(&OBJC_CLASS_NSString, v9, "ProcessList");
v71[0] = valuewithPointer(&OBJC_CLASS_NSValue, v10, ProcessListFunc);
v70[1] = stringWithUtf8String(&OBJC_CLASS_NSString,v11, "PSPDetect");
v71[1] = valuewithPointer(&OBJC_CLASS_NSValue, v12, PSPDetectFunc);
v70[2] = stringWithUtf8String(&OBJC_CLASS_NSString, v13, "InterfaceList")
v71[2] = valuewithPointer(&OBJC_CLASS_NSValue, v14, InterfaceListFunc);
v70[3] = stringWithUtf8String(&OBJC_CLASS_NSString, v15, "JailbreakDetect');
v71[3] = valueWithPointer(&OBJC_CLASS_NSValue,v16, JailbreakDetectFunc);
v70[4] = stringWithUtf8String(&OBJC_CLASS_NSString, v17, "DeviceInfo");
v71[4] = valuewithPointer(&OBJC_CLASS_NSValue, v18, DeviceInfoFunc);
v70[5] = stringWithUtf8String(&OBJC_CLASS_NSString, v19, "InstalledApps");
v71[5] = valuewithPointer(&OBJC_CLASS_NSValue, v20, sub_10000A3A0);

此操作从验证器的配置中检索文件列表(对于我们分析的验证器配置,此列表为空),检查文件系统中是否存在这些文件,并生成找到的文件列表作为输出。

此操作名称中的缩写 PSP 可能表示“个人安全产品”,或者更简单地说,安全解决方案。因此,此操作可能会在 macOS 设备上启动,以检测已安装的防病毒产品。

执行所有这些操作后,验证器将对获得的数据(进程列表、用户信息等)进行加密并发送到 C2 服务器。作为响应,服务器返回我们之前描述的 TriangleDB 植入程序。

日志线索

三角测量行动 背后的威胁行为者不仅通过在感染链中引入两个验证器来进行隐形操作。事实上,他们对TriangleDB植入物的所有操作也都非常小心。这可以从研究人员对攻击者通过该植入程序向受感染设备发送的命令的分析中观察到。

在植入与C2服务器建立通信后,它会从C2服务器接收多个CRXShowTablesCRXFetchRecord命令。这些命令与可能显示感染链和/或恶意软件本身的痕迹的日志检索有关。检索到的一些文件包括:

  1. 崩溃日志文件(例如/var/mobile/Library/Logs/CrashReporter);
  2. 数据库文件(例如/private/var/mobile/Library/IdentityServices/ids-gossip.db)。这些数据库文件可能包含攻击者用来发送恶意iMessage的Apple ID。

一旦攻击者收到这些文件,他们就会将其从设备上删除,这样受害者就无法检查它们,也无法发现潜在的入侵迹象。在完成日志收集和删除后,攻击者会向植入程序发送多个CRXPollRecords命令,指示它定期从/private/var/tmp目录中渗漏文件。上载到C2服务器的文件的名称应符合下列正则表达式之一:

正则表达式 数据类型
^(kng dky).+.dat$
^adr3.+.dat$ 与 SQL 相关的数据
^sr6d.+.(dat srm)$
^S5L.+.kcd$ 钥匙串数据

具有这些名称的文件包含模块生成的执行结果。这些模块通过 CRXUpdateRecord 和 CRXRunRecord 命令上传到受感染的设备。

麦克风记录

最侵犯隐私的模块之一是麦克风录制模块,其名称为msu3h(研究人员推断3h代表三小时,默认录制时间)。在执行时,它会解密(使用源自GTA IV散列的自定义算法)其配置,但只有当电池电量超过10%时,它才会执行进一步的操作。

配置文件本身包含典型的配置数据,例如记录多长时间和用于加密记录的AES加密密钥,但也包含更具威胁性的参数,例如:
suspendOnDeviceInUse:设置当设备屏幕打开时是否应该停止录制;
syslogRelayOverride:设置捕获系统日志时是否录制音频。

密钥串(Keychain)渗漏

由于未知的原因,攻击者决定添加一个额外的密钥串渗漏模块,尽管这样的功能已经存在于TriangleDB中。这个密钥串模块与TriangleDB中的逻辑相同,但主要基于iphone-dataprotection.keychainviewer项目的代码。

SQLite 窃取模块

iOS 上的许多应用都使用 SQLite 来存储其内部数据。因此,攻击者实施了能够从各种SQLite数据库窃取数据的模块也就不足为奇了。所有这些模块都具有相同的代码库,并包含要执行的不同 SQL 查询。同样,它们具有加密的配置。解密后,只能找到标准变量,例如文件路径、AES 密钥、查询字符串等。

这些模块的代码非常奇特。例如,攻击者围绕 fopen() 函数实现了一个包装器,添加了 Z 标志(表示创建的文件应该是 AES 加密和 zlib 压缩的)与标准 w(写入)标志结合使用,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
time_now = time(0LL);
srand(time_now);
generated_filename = generate_random_name(filepath, ext, 6LL); generated_filename_1 = generated_filename;
if ( !generated_filename)
{
ky_value = 0LL;
random_name = 0LL;
file_ptr = 0LL;
_err = 0xE0000002LL;
goto LABEL_96;
}
file_ptr = custom_fopen(generated_filename, "wZ",AES_key);

有意思的是,SQLite窃取模块包含针对不同iOS版本的三个代码分支:低于8.0、介于8.0和9.0之间、9.0及更高版本。

我们找到的每个模块都执行不同的SQL数据库查询。例如,有一个模块处理来自knowledgeec .db数据库的应用程序使用数据。另一个模块提取与照片相关的元数据,例如照片中是否有孩子,该人是男是女(如下代码),以及从媒体文件中自动生成的文本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
END AS 'Face(s) Detected',
CASE face.ZAGETYPE
WHEN 1 THEN 'Baby / Toddler'
WHEN 2 THEN 'Baby / Toddler'
WHEN 3 THEN 'Child / Young Adult'
WHEN 4 THEN 'Young Adult / Adult'
WHEN 5 THEN 'Adult'
else 'Unknown'
END AS 'Subject Age Estimate',
CASE face.ZGENDERTYPE
WHEN 1 THEN 'Male'
WHEN 2 THEN 'Female'
else 'Unknown'
END AS 'Subject Gender',
person.ZDISPLAYNAME AS 'Subject Name'

攻击者也对WhatsApp,SMS以及Telegram消息表示了兴趣也就见怪不怪了 - 同时研究人员也发现这些模块泄露了数据。

位置监控模块

这个模块在一个单独的线程中运行,并试图模拟被授权使用配置中指定的位置服务的bundle(例如/System/Library/LocationBundles/Routine.bundle)。除了使用GPS确定位置外,它还使用GSM,通过CoreTelephony框架检索MCC(MobileCountryCode),MNC (MobileNetworkCode),LAC(LocationAreaCode)和CID(CellID)值。

使用GSM相关数据的一个原因是在没有GPS数据的情况下估计受害者的位置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
if ( getValue(dict, kCTCellMonitorMCC, &mcc))
{
snprintf(&a1->MCC, 4uLL, "%u", mcc); al->flag |= 1u;
}
else
{
ret_code = 2LL;
}
if ( getValue(dict, kCTCellMonitorMNC, &mnc))
{
snprintf(&a1->MNC, 4uLL, "%u", mnc); al->flag |= 2u;
}
else
{
ret_code = 2LL;
}
if ( getValue(dict, kCTCellMonitorLAC, &lac))
{
a1->LAC = lac; al->flag |= 4u;
}
else
{
ret_code = 2LL;
}

if( getValue(dict, kCTCellMonitorCellId,&cid))
{
a1->cellID = cid;
}

总结

三角测量背后的对手非常小心地避免被发现。他们在感染链中引入了两个验证器,以确保漏洞利用和植入物不会被传递给安全研究人员。此外,麦克风录音可以调整为在使用屏幕时停止。如果标准 GPS 功能不可用,则位置跟踪器模块可能不会使用标准 GPS 功能,而是使用来自 GSM 网络的元数据。

攻击者还表现出对 iOS 内部结构的深刻理解,因为他们在攻击过程中使用了私有的未记录的 API。此外,它们还在某些模块中实现了对 8.0 之前的 iOS 版本的支持。回想一下,这些模块在 2015 年之前被广泛使用,这表明模块的代码已经使用了多长时间。

最后但并非最不重要的一点是,此攻击中使用的某些组件包含的代码可能表明它们也针对 macOS 系统,尽管截至发布日期,在 macOS 设备上尚未遇到三角测量痕迹。

原文链接:三角测量行动的出色隐身性