本文主要介绍骁龙芯片组和 ARM Mali GPU 中的五个内核漏洞。ARM Mali GPU,这些漏洞已上报至 CISA KEV(已知被利用漏洞目录)。据了解,所有漏洞均已被在野利用。
目前漏洞利用细节尚未公开披露,各厂商已发布安全补丁和公告,其中包括一些关于基础漏洞的通用信息(如受影响的产品和漏洞类别)。由于无法访问原始 0day 漏洞利用代码,本文主要通过查看补丁来获取有关漏洞的更多信息,以阐明漏洞利用的实际影响。
表 1. 技术分析中相关漏洞摘要
高通芯片组智能手机使用一个定制版本的 Linux 内核,称为 MSM,本文中讨论漏洞多数基于此漏洞内核。
MSM 针对 Linux 内核的特定补充实现了高通特有功能的硬件支持:包括处理芯片上微型设备的内核驱动程序、高级操作系统内核组以及通信接口。查看 Snapdragon 801 技术简报(PDF),发现它是高通制造的众多 Snapdragon SoC 型号之一。这款特定的芯片组为 NASA 的 Ingenuity 直升机提供动力,该直升机于 2021 年 2 月 18 日登陆火星。
Snapdragon 801 处理器产品简介
该 SoC(片上系统)板上只有9个组件:除了CPU 之外,还有 Adreno GPU、数字信号处理器(DSP)、集成的无线连接芯片、传感器、摄像头、卫星支持、显示器和多媒体芯片。每个组件都是一个独立的硬件设备,在操作系统中需要一个专门的内核驱动程序来支持。
此外,Snapdragon SoC 上的某些组件会运行单独的实时操作系统,这需要与 HLOS(如AOSP)建立专用通信接口,以便将工作流程卸载到DSP并读取结果。MSM 还负责支持 HLOS 端的此类通信通道(如QMI)。
现代智能机级别的 Snapdragon SoC 程序更复杂,更多的 CPU 核心、专用硬件接口数量、更高的时钟速率、64 位与 32 位区别,更发达的无线连接基础设施等。许多 Android 智能手机都基于Snapdragon SoC,而现在的 iPhone 仅使用 Snapdragon 系列的一个独立蜂窝调制解调器芯片,下图是一个典型Snapdragon SoC(820e)示意图。
Hexagon Diag演讲PPT
现在我们知道什么是 Qualcomm MSM,接下来看看 ARM Mali目标(CVE-2023-4211)。
ARM Mali 是 Arm Holdings 的 GPU 核心设计,它将其被授权给行业合作伙伴在硬件产品中进行使用。嵌入 Mali GPU 的 SoC 列表很长,其中包括MediaTek,这是高通在移动硬件世界的主要竞争对手。总而言之,Mali GPU 和 Adreno GPU 是移动 GPU 核心,每种核心在大约30%到40%的基于安卓的智能手机中都有出现(iPhone使用苹果自己的专有GPU设计)。
Snapdragon 并不等于ARM。具体来说,ARM 定义了 CPU 指令集架构(ISA)及基于它的处理器硬件设计,而高通获得的许可权仅包含 GPU 部分。如示例 SoC 所示,32 位 Krait CPU 和 64 位 Snapdragon 采用 Kryo CPU,主板上其余 8 个组件与 ARM 无关(包括高通自己设计和生产的 Adreno GPU)。因此,Adreno GPU 和 Mali GPU 具有两种不同且不兼容的硬件设计,需要不同的操作系统内核驱动程序,在这些驱动程序中可能会发现漏洞。
在对易受攻击目标有了一些清晰认识后,来看看实际的漏洞。
来自高通的公告:“MSM Linux 内核 DSP 服务中的释放后重用,在 HLOS 向 DSP 发起远程调用期间,DSP 服务中的内存损坏。”
有趣的是,这个漏洞直到 12 月才被添加到 CISA KEV 列表中,而高通在 10月 就通知了 0-day 利用。
该漏洞存在于实现 FastRPC的aDSP 设备驱动程序代码中。 补丁太长,无法在此处完整显示。
现代 Snapdragon SoC 拥有多个 DSP 处理器,专门用于不同类别的计算任务。aDSP(应用 DSP)负责音频和传感器输入处理(传感器处理已卸载到专用 sDSP 内核),而 mDSP 运行蜂窝调制解调器代码,cDSP 运行 AI 计算。所有 DSP 内核的架构均基于 Hexagon,其是高通的专有处理器架构,有独特的汇编码模式,也是少数成功的 VLIW ISA 设计之一。
从硬件架构的来看,DSP 核心是独立的,由一个单独的操作系统管理,CPU 运行 HLOS(如 Android 开源项目或其 OEM 定制版本)。DSP运行实时操作系统,在现代高通芯片组中为 QuRT。CPU 和 DSP 核心相互隔离,因此,它们必须通过某种接口进行通信,在 CPU/HLOS 端由 MSM 内核实现,RPC 协议通常编码通信接口的高级方面。漏洞所在的 adsprpc.c 源模块实现了这段代码。
具体来说,aDSP 处理器通过硬件总线公开了一个 fastrpc设备,该设备基于 DMA 硬件技术实现了 CPU-DSP 通信接口。操作系统内核中的 DMA 支持需要对内存缓冲区进行映射和解除映射,以便数据可以从硬件设备镜像到 CPU 可访问的 RAM,然后再返回。在动态执行映射和解除映射时,分配区域的指针管理可能会出现问题,导致释放后重用的条件,而这就是漏洞的成因。
补丁引入了一个新变量unsigned int ctx_refs,它保存了对 fastrpc 缓冲区的上下文引用次数。这表明在受影响的代码中,fastrpc 缓冲区在不恰当的时候被释放,但某些代码仍在使用,导致了使用后释放重用(UAF)漏洞。根据补丁的内容显示,可能是在解除映射代码中发生了漏洞,因此补丁增加了一个额外条件,用于检查新变量ctx_refs的值。
CVE-2023-33063漏洞的补丁示例片段
该漏洞很可能是通过 IOCTL 接口打开了从用户态到内核的攻击向量,释放后重用漏洞在大多数情况下很容易被利用。MSM Linux 内核中这个漏洞可能在结合其他漏洞的情况下,基于高通的手机利用,以摆脱 Android 应用沙箱,从而提升漏洞载荷权限。此外,这可能是实现持久性 root 的垫脚石。
来自高通安全公告:“在图形中使用超出范围的指针偏移,当向 IOCTL KGSL GPU AUX COMMAND提交同步点列表的 AUX 命令时发生内存损坏”。
CVE-2023-33106 的完整补丁代码
与移动 SoC 上的 DSP 微设备类似,GPU 微设备需要专用的操作系统内核支持,对于 Snapdragon 的 Adreno GPU,该支持在 KGSL 的内核驱动程序中实现。在 MSM Linux 内核中实现此驱动程序的源模块之一位于 drivers/gpu/msm/kgsl.c。
为进一步缩小受影响的代码范围,排查到它位于 IOCTL 处理逻辑中。IOCTL是操作系统用户层和内核之间通信的通用机制,用于所有主要操作系统。实际的通信是通过内核暴露的接口发送模块特定的命令和数据来实现的。例如,在 Linux 上,会使用 ioctl()系统调用,带有特定的命令 ID 和参数,内核把这些参数转发给相应的可加载内核模块,在其中解析调用参数。IOCTL 处理的实现是特定于模块的,内核模块可能会错误地处理 IOCTL 参数中提供的数据,这可能会导致可利用的内存损坏和逻辑漏洞 。
补丁为 numsyncs 添加了一项合理性检查,这个变量来自用户在 IOCTL 的请求IOCTL KGSL GPU AUX COMMAND中。该变量稍后在下游代码 (kgsl_drawobj.c) 中用作未经检查的循环计数器使用,从而导致内存损坏。
厂商:在 Graphics Linux 中的整数溢出或环绕,在 IOCTL 调用期间分配共享虚拟内存区域时图发生了 Graphics Linux 中的内存损坏。
CVE-2023-33107漏洞的完整补丁代码
这个漏洞与之前的类似,位于 Adreno GPU 的 kgsl 驱动程序中。从补丁中可以明显看出漏洞涉及的底层:gpuaddr 和变量。此外,补丁描述表明漏洞位于IOCTL处理中。
GPU 计算独立于 CPU,可以通过 OpenCL 2.0 中引入的名为 SVM(共享虚拟内存)的功能与 CPU 进行通信。SVM 共享内存区域可以从Android 应用程序(在 CPU 上)和图形着色器(在 GPU 上)中访问。为了使 Android 应用能够启用这种通信,GPU 内核驱动程序必须实现用于建立和管理共享内存区域、读写数据、原子操作等的基础设施,通信基础设施的一部分通过 kgsl 字符设备的 IOCTL 接口实现。
再次查看这个漏洞,它位于kgsl iommu.c 源模块中,函数iommu_addr_in_vm_ranges 实施了对与 GPU 低级 SVM 内存管理相关的三个输入参数的完整性检查。内存管理单元(MMU)内部是操作系统内核实践中最复杂的问题之一,需要专门的处理,就我们而言,重要的是知道用户如何影响这些参数。以下是检查程序的调用:
调用错误检查(kgsl_iommu.c)
当由于整数回绕导致校验错误时,恶意的 gpuaddr 和 size 参数将传递到下游代码,并引发内存损坏(初步猜测是通过损坏的链表管理)。在驱动程序内部通过长串调用后,可以使用IOCTL_KGSL_GPUOBJ_IMPORT到达kgsl_iommu_set_svm_region的代码该调用具有以下参数:
IOCTL_KGSL_GPUOBJ_IMPORT 的定义及参数
这个IOCTL命代表了SVM的GPU通信协议的更高级实现(在处理器边界传递“GPU对象”)。
根据高通的安全公告:“在 Android 汽车操作系统平台中的释放后重启用,当使用 IOCTL munmap 调用释放进程 shell 内存且进行进程初始化时,可能存在释放后重启用问题”。
CVE-2022-22071 的完整补丁代码
这个漏洞引起了几个关注点。首先,在 2022 年 5 月修复了这个漏洞,但在 2023 年 10 月就报告了漏洞在野利用情况。通常情况下,0-day 攻击的功劳归于发现并捕获攻击的事件响应分析员,而发现漏洞的安全研究员会匿名。这表明该漏洞可能被利用在未打补丁的设备上,成为 N-day 漏洞,或者被利用在 OEM 设备上,但目前这些设备提供过时的软件且未进行更新。不管是上述哪种情况,10 月份的攻击可能是通过补丁分析得出的结论,与我在本文中所描述的工作流程相似。
其次,漏洞目标被标记为“Automotive OS Platform Android”,而修补程序本身位于 CVE-2023-33063 中看到的同一 adsprpc.c 源模块中。它是否在汽车上被利用?或者该漏洞只能在汽车平台上触发,因为该漏洞代码明显影响了aDSP驱动程序的整个平台?这其中包含了大量的信息。
第三,这是列表中唯一在 10 月份而不是 12 月份被添加到 CISA KEV 列表的漏洞。CISA 似乎并不直接依赖于 Google TAG 和软件供应商的报告,而是通过其他来源寻求建立 0-day 攻击的证据。
该补丁的含义很简单:adsprpc 设备驱动程序某些内存仍在使用中,因此其后面的指针不会被释放。is filemap 变量是一个“指示进程初始化中使用的映射的标志”,在取消映射代码中进行了检查,如下所示:
CVE-2022-22071 的详细信息
ARM 公告:“Mali GPU 内核驱动程序允许不当的 GPU 内存处理操作,即本地非特权用户可以进行不当的 GPU 内存处理操作,以获得对已释放的内存的访问权限。”
这是影响非高通 Android 设备(例如基于 MediaTek SoC 的设备)的一系列中唯一的漏洞。
在查看 Bifrost GPU 内核驱动程序的代码时,r42p0 和 r43p0 之间的代码发生了大量变化(源代码差异约为10,000 行),这使得识别特定漏洞补丁变得非常重要。经过快速检查 kbase csf queue register 中的变更是一个很好的候选项:
疑似 CVE-2023-4211 补丁
这里,kbase csf queue register函数可以通过KBASE_IOCTL_CS_QUEUE_REGISTER_ioctl调用来访问,同时它涉及对与GPU 内存管理相关的输入参数进行额外的清理。
本文说明涵盖了 Android 内核中 5 个不同的漏洞,这些漏洞 10 月已被实际利用。通过安全补丁和其他公开来源获得了先前未知的技术细节,并对其中几个漏洞进行了有限的根本原因分析,此分析主要是从安全补丁和其他公共来源推断得出的,无法访问原始漏洞代码。
本文所述的漏洞可以攻击大约 80% 以上的 Android 设备,主要包括移动智能手机,也可能影响到智能汽车、物联网和可穿戴设备等。
漏洞的影响:它们能够进行 Android 应用沙箱逃逸,并提升权限执行任意代码。此类漏洞通常会在全链漏洞利用的第三阶段、通过浏览器进行 RCE 后或类似的远程攻击媒介被利用。此外,这些漏洞会打开持续存在的攻击面,这通常需要第三个漏洞来实现。
总体而言,现代移动智能手机(基于Android或iPhone,区别不大)一个完整的攻击链通常至少需要四个不同的漏洞:
应用程序中的远程代码执行漏洞(例如移动浏览器的JavaScript引擎漏洞)。
应用程序中的内存信息泄露漏洞,以击败ASLR。
应用程序沙箱绕过和权限提升漏洞。
引导加载程序或类似级别的漏洞,用于绕过安全启动技术并在设备重新启动之间持久存在。
本文涵盖的问题代表了完整攻击链的第三阶段漏洞的常见示例。在更特殊的情况下(如攻击强化系统或使用更弱漏洞),完整攻击链的第三阶段可能需要进一步拆分为两个单独的漏洞。
https://docs.qualcomm.com/product/publicresources/securitybulletin/december-2023-bulletin.html
https://docs.qualcomm.com/product/publicresources/securitybulletin/october-2023-bulletin.html
https://git.codelinaro.org/clo/la/kernel/msm-5.4
https://developer.arm.com/Arm%20Security%20Center
https://www.cisa.gov/known-exploited-vulnerabilities-catalog