先分享一则颇具冲击力的消息:安全研究团队 Paradigm Shift 在苹果 A12 与 A13 芯片的 BootROM 中发现了全新漏洞,并将其命名为“usbl8er”。这绝非普通的软件级别 Bug,而是直接命中芯片启动链的最底层,属于硬件级安全缺陷。

受影响最直接的是搭载 A12 和 A13 芯片的全线设备。具体而言,包括 iPhone XS、XS Max、XR,以及 iPhone 11 全系列。此外,还有使用 S4 与 S5 芯片的 Apple Watch,以及多款较旧 iPad——例如第一、二代 11 英寸 iPad Pro,第三、四代 12.9 英寸 iPad Pro,第九、八代 iPad,第三代 iPad Air,第五代 iPad mini,全部位列其中。需要指出的是,A12 与 A13 芯片覆盖了相当广泛的用户群体,不少用户手中现有的老机型可能恰好处于受影响范围。
那么,这个漏洞具体如何运作?从披露的技术细节来看,其根源位于 DWC2 USB 控制器——即苹果 A12/A13 芯片内负责 USB 通信的德国 IP 核。该控制器在接收 USB 标准“Setup 包”时,采用了一种典型的环形 DMA 缓冲机制。原本的逻辑非常清晰:每收到一个 8 字节的 Setup 包,DMA 地址指针就正常向前移动 8 字节;但当收到第四个包时,控制器会强行将指针回调 24 字节,实现环形缓冲区的循环复用。这种设计的初衷是“动态循环使用内存”,相当巧妙。
然而,问题恰恰出在这里:这款 DMA 控制器竟然能够接收小于 8 字节的包——不过是以 4 字节为对齐单位来存储。这就引发了一个棘手的矛盾:每次收包时,指针的增量(实际写入的字节数)不足 8,而固定不变的减量——“需回调 24 字节”——却依然按完整包进行计算。最终导致循环工作出现偏差,形成了步进 12 字节的“欠载原语”。简而言之,攻击者能够精确控制 DMA 写入的位置与写入量,相当于获得了一个底层的“内存改写”工具。
在 A12 芯片上,情况相对简单。DMA 的缓冲区恰好位于堆中,并且紧邻 USB 任务栈。攻击者直接利用欠载原语深入写入,覆盖堆栈上保存的中断返回地址(LR 寄存器)空间。等到系统调度器切回 USB 任务时,劫持 PC 便顺理成章,几乎一气呵成。
而 A13 芯片的处理则复杂得多。苹果引入了 PAC(指针认证)与堆元数据校验,使攻击难度显著上升。攻击者必须绕过数道防线才能得手:
首先,他们需要覆盖 DART(设备地址重映射表)的数据结构,将全局 DART 指针写为空值,借助清理例程中的零写入原语,让堆校验在 DMA 执行期间不会直接崩溃。第二步,通过操控 MMIO 寄存器写入 0xF,覆盖系统的全局 panic 计数器——这样一来即使触发 panic,系统也不会重启,而是陷入无限循环的停滞状态。接着,精确控制 DMA 的写入时机,专门在 USB 任务运行时改写其任务结构中保存的临界区深度字段,随后触发带 IRQ 的 panic——让系统跳入该无限循环。最后,在被控制的循环中继续执行堆 DMA 写入,覆盖 BSS 段内的 USB IRQ 处理函数指针,最终获得完整的 PC 控制权。
一旦攻击者拿到代码执行权,后续操作便相对直接。他们利用 SecureROM 中极为罕见的 EL1 模式切换点(即一条 SVC 0 指令)。在 A12 上,通过 ROP 链将 DMA 目标地址设定在所谓的 boot trampoline 区域——这片内存被标记为只读可执行,但 DMA 写入权限并未受限制。先将恶意 shellcode 写入,再触发跳转,最终在 EL1 最高权限下执行。
需要特别强调:由于该漏洞属于硬件层面的设计缺陷,无法通过软件更新进行修复。不过有一点稍令人安心——利用该漏洞需要攻击者物理接触设备,且不会对安全隔区处理器构成直接威胁。苹果方面已收到相关通报。对用户而言,最稳妥的方案是升级至搭载 A14 及以上芯片的设备。
