在启用 MTE 的 Pixel 8 上获取内核代码执行权限

主要观点:

  • 介绍了 2023 年 11 月 15 日向 Arm 报告的 Arm Mali GPU 中的漏洞 CVE-2023-6241,该漏洞在 2023 年 12 月 14 日发布的 Arm Mali 驱动版本 r47p0 中得到修复,并在 Android 的 3 月安全更新中被修复。
  • 详细阐述了 Arm64 的 MTE 功能,包括其工作原理、局限性以及在 Android 设备中的支持情况。
  • 解释了 Arm Mali GPU 的 JIT 内存管理机制,包括 JIT 内存的分配、释放以及相关的命令和操作。
  • 描述了 CVE-2023-6241 漏洞的原理,即通过触发 GPU 内存访问故障和利用内存管理的竞争条件来扩大 JIT 内存区域,从而导致内存映射不一致和可利用的漏洞。
  • 展示了如何利用 CVE-2023-6241 漏洞在 Pixel 8 上获取任意内核代码执行权限,包括绕过 MTE 保护的方式。
  • 强调 MTE 虽然是对抗内存损坏的重要进展,但仍存在可利用的漏洞,且协处理器及其内核驱动可能成为攻击面。

关键信息:

  • CVE-2023-6241 影响使用 Command Stream Frontend (CSF) 功能的较新 Arm Mali GPU 的设备,如 Google 的 Pixel 7 和 Pixel 8 手机。
  • MTE 利用硬件实现检查内存损坏,是早期的缓解措施,但存在标签冲突和侧信道攻击等局限性。
  • Arm Mali GPU 的 JIT 内存由内核驱动管理,通过软件和硬件命令进行操作,存在内存管理的竞争条件漏洞。
  • CVE-2023-6241 漏洞通过触发 GPU 内存访问故障和利用内存管理的竞争条件来扩大 JIT 内存区域,导致内存映射不一致。
  • 利用该漏洞可在 Pixel 8 上获取任意内核代码执行权限,绕过 MTE 保护,通过重新利用已释放的内存页作为内核页表目录 (PGD) 来实现。

重要细节:

  • MTE 内存标记的主要思想是使用地址的高位存储“标签”,用于检查内存访问的一致性,防止线性溢出和使用后释放等类型的内存损坏。
  • Arm Mali GPU 的 JIT 内存分配通过kbase_jit_allocate命令,释放时进入内存池,分配新内存时可重用或从头分配。kbase_jit_grow函数在需要扩展内存时调用,可能会临时释放和重新获取锁。
  • CVE-2023-6241 漏洞利用在kbase_mem_pool_grow运行时触发 GPU 内存访问故障,导致 JIT 内存区域增长,使reg->gpu_alloc->nents等值无效,从而引发内存映射不一致。
  • 利用该漏洞的步骤包括创建 JIT 区域、触发故障、再次触发故障、释放 JIT 区域并控制收缩大小,使kbase_mmu_teardown_pgd_pages跳过正确的内存映射,从而使已释放的内存页可被重用。
  • 绕过 MTE 的方式是利用 GPU 直接访问物理内存,避免了 MTE 对指针解引用的检查,从而完全绕过 MTE 提供的保护。
阅读 16
0 条评论