← 返回信息流
AI 资讯Hacker News·5 天前

Usbliter8:针对A12与A13芯片SecureROM的漏洞利用

原标题:Usbliter8: an A12/A13 SecureROM Exploit

速览

Usbliter8是一种针对苹果A12和A13系列芯片的安全漏洞利用工具。该工具通过利用SecureROM中的缺陷,成功突破了设备的底层安全限制。这一进展为研究这些芯片的底层安全机制提供了新的切入点。

AI 深度解读

Usbliter8: 针对 Apple A12/A13 SecureROM 的漏洞利用深度解读

背景

本文档详细阐述了由研究团队发现并成功利用的一个新型 iPhone BootROM 漏洞。该漏洞不仅揭示了底层硬件层面的缺陷,还展示了如何结合固件配置错误来实现对应用处理器(Application Processor, AP)启动链的完全控制。

目前,该漏洞利用(PoC)支持 Apple A12、S4/S5 以及 A13 系列 SoC。虽然技术上支持 A12X/Z 系列,但尚未在实现中集成。研究团队将范围限制在上述设备,是因为在这一范围内成功演示漏洞利用已足以充分验证该漏洞及其利用策略的有效性。

通过发布这项研究和配套的 Proof of Concept (PoC),团队旨在记录此类硬件漏洞的现实世界影响,增进对现代 BootROM 安全性的理解,并证明即使是较新的 SecureROM 版本,仍然容易受到细微硬件缺陷的影响。由于这些漏洞存在于不可变的代码中,受影响的用户应意识到,迁移到更新硬件仍是目前最有效的缓解措施。

核心内容

USB 控制传输与 Setup 数据包解剖

在 USB 规范中,所有的控制传输都必须以 Setup 事务(Setup Transaction)开始。这是主机向连接设备发出任何类型请求的机制。一个标准的 Setup 事务由主机发送的两个数据包组成:

  1. TOKEN PACKET (主机 -> 设备):包含同步位(SYNC)、包标识符(PID,此处为 SETUP)、设备地址(ADDR,7位)、端点号(ENDP,4位)、CRC5 校验码以及结束符(EOP)。
  2. DATA PACKET (主机 -> 设备):包含同步位、PID(此处为 DATA0)、8 字节的数据载荷(即 USB 设备请求结构体)、CRC16 校验码以及 EOP。

根据规范,Setup 事务的数据载荷必须严格为 8 字节,并遵循特定格式。该载荷中的设备请求结构体会被原封不动地传递给软件驱动程序进行处理。在后续分析中,我们将此特定载荷称为“Setup 数据包”。

DWC2 直接内存访问 (DMA) 机制

Apple SoC 中使用的 USB 控制器是 Synopsys 设计的 DWC2。通过分析 Linux 内核等现有驱动程序实现,可以推断出该控制器的工作原理。

关键在于控制器如何将数据写入主内存:

  • 应用处理器(AP)通过分配一个内存区域,并将其物理地址写入控制器 MMIO 区域中的特定寄存器(DOEPDMA)来配置 DMA。
  • 控制器使用此缓冲区存储接收到的 SETUP 和 OUT 数据包中的数据,随后由设备处理。

研究发现,当 USB 控制器写入数据块时,它会直接递增 DOEPDMA 寄存器中存储的地址。这是一个关键细节,意味着该寄存器的值充当了“真理来源”,定义了下一次 DMA 传输将使用的物理地址,而不仅仅是一个配置设施。

漏洞原理:环形缓冲区下的下溢

DesignWare USB 控制器在内存中存储最多三个连续的 Setup 数据包。当接收到第四个 Setup 事务时,DMA 基地址会在写入前重置为其起始位置,类似于环形缓冲区(Ring Buffer)机制。

  • 正常行为:每次写入接收到的数据包后,控制器会根据写入数据的大小递增 DOEPDMA。重置操作通过从 DOEPDMA 中减去 24 来实现。
  • 漏洞触发点:控制器也接受较小的数据包(尽管始终以 4 字节块存储)。由于指针递增的大小与固定的递减量(24字节)不匹配,导致出现了以 12 字节为步长的缓冲区下溢(Buffer Underflow)原语。

研究团队认为这是 USB 控制器本身的固有 Bug。虽然可能影响许多设备,但该漏洞仅在特定条件下有效:

  • A11:不受影响。因为 A11 的 USB 驱动程序会在接收每个数据包后手动将 DMA 地址重置为初始值。
  • A12/A13:受影响。在这些芯片中,USB DART(Direct Access Remapping Table)配置为旁路模式(Bypass Mode),允许自由覆盖 SRAM 数据。
  • A14 及更新世代:不受影响。SecureROM 中似乎正确配置了 DART,使得漏洞无法被利用。

在 A12 上实现 PC 控制

在 A12 上实现程序计数器(PC)控制相对直接。USB 控制器的 DMA 缓冲区是在 USB 任务栈之后不久在堆(Heap)上分配的。

最简单的策略是覆盖栈上保存的链接寄存器(LR, Link Register)。当调度器执行上下文切换回到 USB 任务时,即可直接获得 PC 控制权。

在 A13 上实现 PC 控制的挑战与突破

在 A13 SecureROM 上,情况变得复杂,因为引入了 PAC(Pointer Authentication Code,指针认证码)。

  • PAC 的影响:观察发现,PAC 仅应用于存储在栈上的 LR。这足以防止我们像处理 A12 那样直接针对 USB 任务保存的 LR。
  • 绕过缓解措施:需要绕过堆元数据校验和(在堆操作期间验证)以及上下文切换期间的 LR 签名验证(每当 USB 任务被唤醒处理 USB 数据包时发生)。

研究团队开发了一种多步骤技术来实现 PC 控制:

  1. 利用 DART 相关数据:首先覆盖位于 USB 控制器 DMA 缓冲区之前堆中的 DART 相关数据。这提供了一个在退出 DFU 循环时可触发一次的有限写入原语。
  2. 清零 DART 全局指针:利用某些清理例程(使用可控数据),将指向 DART 分配的全局指针清零。这一步至关重要,以防止损坏的分配被释放,否则会在检查堆校验和时触发 Panic。
    • 代码逻辑显示,通过 dart_stop 函数,利用 16 字节的零写入原语清除 DART 对象的内存。
    • dart_free 中,利用零写入原语使第二次解引用返回 0,从而使 free 操作变为空操作(No-op)。
  3. 修改 Panic 计数器:作为同一清理路径的一部分,利用 0xF 写入原语覆盖全局 Panic 计数器。这样,下一次 Panic 将导致 CPU 进入无限循环,而不是触发重启。
    • 代码逻辑显示,通过 dart_flush_maybe 函数,将 Panic 深度计数器写入 0xF
    • panic 函数中,如果 panic_cnt >= 3,则进入 spin() 无限循环。
  4. 维持上下文完整性:为了避免破坏 USB 任务的上下文(特别是 LR 和 SP 寄存器,它们在上下文切换期间被保存和恢复),研究团队通过精确计时 DMA 写入,使其在任务处于唤醒状态时发生。这样,当任务让出(Yield)时,正确的寄存器值会覆盖被破坏的值,从而保持上下文的一致性。

关键要点

  • 漏洞本质:这是一个基于硬件的 USB 控制器(DWC2)缺陷,导致 DMA 地址指针在特定条件下发生非预期的递减,从而产生缓冲区下溢。
  • 受影响范围
    • 受影响:Apple A12, A13, S4, S5 SoC。
    • 不受影响:Apple A11(驱动层修复)、A14 及更新世代(SecureROM 层修复 DART 配置)。
  • 利用前提
    • 设备必须处于 DFU 模式或类似允许 USB 控制传输的状态。
    • A12/A13 的 USB DART 必须处于旁路模式。
  • A13 利用难点:由于 PAC(指针认证码)的存在,直接覆盖栈上的 LR 变得不可行,必须通过复杂的堆操纵和上下文切换时序控制来绕过安全机制。
  • 缓解措施:由于漏洞存在于不可变的 BootROM 代码中,软件补丁无法修复。用户唯一的缓解方式是升级硬件。

意义与影响

  1. 硬件安全性的局限性:该研究有力地证明了,即使是在高度安全的 SecureROM 环境中,
查看原文 →ps.tc