本文件旨在对“Glass Cage”攻击行动进行详细的技术解构。分析表明,在精确的逻辑漏洞利用面前,当前主流的移动安全架构依然存在可被利用的系统性缺陷。此攻击的执行不依赖任何密码学破解,也无需目标进行任何交互。攻击者通过引导 iOS 遵循其既定的设计逻辑,使其状态机进入一个可被利用的非预期状态。本报告将从攻击面、技术细节和利用链等维度,深度剖析攻击者如何将系统内建的信任机制转变为可执行的攻击路径。
一、攻击方法论:基于逻辑缺陷的利用
攻击者摒弃了依赖内存暴力破坏(Brute-force Memory Corruption)的传统攻击模式,因为该模式可预测性差且易于被行为检测机制捕获。其核心方法论是:操纵并利用系统内在的信任链。
iOS 的安全模型依赖于一系列进程与沙箱间的信任关系,其中一个服务的输出被后续服务作为可信输入进行处理。攻击者的任务是在此信任链的初始环节,注入一个在语法上有效、但在内存结构上具有恶意负载的数据对象。利用系统的自动化处理流程,该对象将被逐级传递至权限更高的执行环境,最终触发攻击代码。
此攻击利用的不是单一的二进制漏洞,而是多个系统组件在交互协议和状态管理上存在的逻辑缺陷。其渗透路径精确且隐蔽。
二、攻击面分析:被选定的利用入口
对目标系统进行深入的逆向工程和架构分析后,可以确定攻击者利用了以下几个关键攻击面:
- iMessage 与 BlastDoor 服务
此为攻击的初始投递向量。BlastDoor 作为一个前置的净化服务,其设计目标是隔离和验证输入数据的格式。评估显示,其验证机制主要集中在协议和格式的语法层面,而缺乏对数据在内存中实际布局的语义安全分析。因此,它可被视为一个可被结构化恶意数据绕过的句法过滤器。 - QuickLook 预览服务
此为权限提升的中间向量。它连接着外围的 BlastDoor 和内部的渲染引擎。分析发现该服务存在一个关键的降级兼容机制:在处理特定复杂媒体时,会从安全的跨进程渲染模式(OOP)回退至高风险的进程内渲染模式。此 fallback 机制为攻击者将载荷从初级沙箱迁移至更高权限的系统进程提供了必要的路径。 - WebKit 渲染引擎
此为初始代码执行环境。WebKit 拥有强大的代码解析能力,是实现从数据控制到指令执行转换的理想目标。攻击者利用其内部资源加载机制的一个漏洞,在其进程上下文中实现了任意代码执行。 - CoreMedia 框架与内核
此为最终权限提升的目标,旨在获得系统的最高控制权(Ring 0)。CoreMedia 框架的内存管理极其复杂,使其成为竞态条件和释放后重用(Use-After-Free, UAF)漏洞的高发区域,是实现内核级利用的预定战场。
三、渗透剖析:四阶段攻击链详解
整个攻击过程被设计为一个自动化的四阶段利用链,每个阶段都为下一个阶段创造必要的条件。
第一阶段:载荷投递与初始腐化
攻击始于一个通过 iMessage 发送的、封装在 WebP 容器中的特制 HEIF 图像。
技术细节分析:
- 受控的整数溢出
核心技术在于对 HEIF 文件内 ASTC 纹理压缩元数据的精确操纵。通过逆向 ATXEncoder
服务,攻击者确定其解压缓冲区的内存大小计算公式大致为(width / block_size) * (height / block_size) * bytes_per_block
。通过在 EXIF 元数据中提供一个极大的source
尺寸和一个极小的dest
尺寸,诱导了一个中间计算步骤的整数溢出。这导致分配的缓冲区比实际解压所需的数据小了几个字节,其长度经精确计算,恰好能覆盖相邻堆块的元数据。 - 精准的堆布局 (Heap Feng Shui)
攻击的目标是实现受控的内存腐化而非进程崩溃。在发送恶意载荷前,通过发送若干具有特定大小和生命周期的标准 iMessage 消息进行堆布局,目的是在目标进程的堆内存中创建出一种可预测的、相对稳定的内存分配模式。这极大地提高了恶意对象在内存中与目标对象(例如另一个可控对象的元数据块)相邻的概率。溢出的字节会精确修改下一个堆块的头部元数据(如大小或“空闲”标志),从而制造出一个伪造的空闲内存块(fake free chunk),为后续利用 malloc
的漏洞(如malloc_consolidate
)或进行堆冲突(heap collision)攻击创造条件。
绕过防御:
BlastDoor 的句法分析器确认了所有字段均符合 HEIF 规范。它按照因溢出而错误的计算结果分配了内存。解压时,堆溢出静默发生。BlastDoor 的监控机制未检测到异常系统调用或明显的崩溃信号,因此判定处理成功 (BlastDoor.PreviewImage : Success
),并将这个已包含恶意内存结构的对象,通过 XPC 消息传递给了下游的 QuickLook 服务。
第二阶段:权限的横向移动
此时,攻击载荷需要从初级沙箱逃逸至权限更广的进程。
技术细节分析:
- 触发降级机制 (Fallback Triggering)
攻击者构造的图像不仅利用了上述漏洞,还包含了一个非标准的、已废弃的ICC色彩配置文件。iOS 现代、安全的、基于 OOP (Out-of-Process) 的 QuickLookUIService
渲染器出于安全和性能考虑,严格限制了其支持的配置文件类型,因此无法处理此图像。当它尝试处理并失败后,会返回一个错误。系统的容错机制(旨在确保最大程度的向后兼容性)随即启动,将渲染任务交由一个旧版的、为兼容性而保留的、直接在com.apple.quicklook.ThumbnailsAg
代理进程内执行的渲染组件处理。 - 逻辑沙箱逃逸 (Logical Sandbox Escape)
此步骤利用了系统设计上的兼容性回退路径,而非传统的二进制漏洞。攻击载荷及被污染的内存区域被完整映射到 QuickLook 代理的地址空间内。该进程拥有比 BlastDoor 更广泛的系统服务访问权限(例如访问文件系统特定区域和调用 WebKit 的能力),并且其沙箱配置文件(sandbox profile)的限制也相对宽松,为后续利用创造了条件。
绕过防御:
系统架构中对用户体验的优先级高于安全一致性的设计(在回退场景下),构成了可被利用的条件。安全检查点主要存在于现代渲染路径中,一旦降级,许多安全假设便不再有效。攻击者由此完成了从高度受限环境到更高权限进程的横向移动。
第三阶段:在 WebKit 中实现代码执行
此阶段的目标是将数据控制权转换为指令控制权。
技术细节分析 (CVE-2025-24201):
- 构造恶意路径
攻击者在图像元数据的一个自定义描述字段中,嵌入了一个利用路径规范化(path canonicalization)漏洞的 file:///
路径,例如file:///var/mobile/Library/../Library/Caches/com.apple.quicklook.ThumbnailsAg/Payload.bin
。通过../
目录遍历,将路径指向了在第一阶段中被部分控制的内存区域。此路径成功绕过了 WebKit 沙箱对文件系统访问的限制,因为它利用了解析器在处理路径字符串时的逻辑缺陷,使其看起来像是在访问一个允许的目录。 - ROP 链的构建与执行
为绕过数据执行保护 (DEP/NX),载荷并非直接的 shellcode,而是一个返回导向编程 (Return-Oriented Programming, ROP) 链。攻击者预先从 WebKit 的二进制文件中扫描并收集了大量有用的“小工具”(gadgets)——即以 ret
指令结尾的短代码序列。当 WebKit 的资源加载器错误地处理数据时,被劫持的控制流会转向 ROP 链的起点。此 ROP 链被精心设计,其执行序列是:1) 利用gadgets将mprotect
系统调用的参数(内存地址、长度、保护标志PROT_READ | PROT_WRITE | PROT_EXEC
)加载到正确的寄存器中;2) 跳转到mprotect
的地址执行调用;3) 最后跳转至已被赋予可执行权限的、包含下一阶段完整功能的 shellcode 的入口点。
绕过防御:
路径注入漏洞使攻击者绕过了沙箱的文件系统限制,而 ROP 链则绕过了数据执行保护。通过这个多阶段过程,在 WebKit 进程上下文中获得了稳定的任意代码执行能力。
第四阶段:获取内核控制权
此为攻击链的最后阶段,目标是获取 Ring 0 执行权限。
技术细节分析 (CVE-2025-24085):
- 制造悬空指针
通过已获得的 RCE 能力,向 `mediaplaybackd` 服务发送异常参数,触发一个深层错误处理路径。在此路径中,一个用户态的 CoreMedia 对象被释放,但其在内核中对应的驱动对象句柄(例如一个 IOUserClient
实例)并未被同步无效化。这导致内核中存在一个指向已释放用户态内存的悬空指针,形成了一个典型的UAF (Use-After-Free) 条件。 - 内核堆风水 (Kernel Heap Feng Shui)
在悬空指针产生的纳秒级时间窗口内,攻击者立即通过 `IOHIDInterface` 服务进行大规模、精确的内核堆分配。该接口之所以被选中,是因为它允许用户进程申请特定大小且内容完全可控的内核内存块。通过反复尝试和精确计算,成功地让一个包含恶意函数指针的伪造内核对象(一个伪造的C++对象或结构体)占据了刚刚被释放的那片内存地址。 - 绕过 PAC (指针验证码)
研究表明, codecctl
访问的这个悬空指针指向一个旧版 C++ 对象的虚函数表 (vtable) 指针。在目标 iOS 版本中,尽管指针验证码(PAC)已广泛部署,但并非所有内核函数指针都受其保护,特别是部分为兼容性而保留的遗留 C++ 驱动代码中的 vtable。攻击者利用了 PAC 防御覆盖范围中的此一盲区,直接替换了未受保护的虚函数表指针,从而绕过了该项关键的控制流完整性保护机制。 - 劫持控制流
最后,触发 `codecctl` 去访问该悬空指针。内核驱动代码信任此指针,并尝试通过其虚函数表调用一个函数。由于该地址已被伪造对象占据,CPU 的执行流被重定向,跳转至内核 shellcode,从而在 Ring 0 权限下执行。
绕过防御:
攻击者没有尝试破解 KASLR(内核地址空间布局随机化),而是通过劫持合法的执行流,使系统自主地将控制权交出。攻击者也没有直接攻击 PAC,而是利用了其防御覆盖的不完整性。这再次证明,最有效的攻击是利用防御体系自身的复杂性和内在的不一致性。
结论:进攻性能力能够解构静态防御体系
“Glass Cage”行动的成功,证明了任何复杂系统都存在可被利用的逻辑缺陷。最高效的攻击,是利用对系统架构的深度理解去穿透这些缺陷,而非依赖于可被特征化的蛮力攻击。
此次攻击展示了一种高级的进攻能力,能够将当前最安全的移动设备之一,转变为一个完全受控的信息获取终端。对于防御方而言,这是一个明确的信号:基于签名的、静态的防御体系在面对逻辑层面的高级攻击时是无效的,必须转向更深层次的、基于行为和架构完整性监控的动态防御策略。对此类攻击链的研究应持续进行。
原文始发于微信公众号(赛博攻防悟道):透明牢笼(Glass Cage)行动攻击链技术解构
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论