GPU 驱动漏洞:窥探驱动漏洞利用的技术奥秘
字数 2759 2025-08-20 18:17:47

GPU 驱动漏洞分析与利用技术详解

背景介绍

现代移动SOC平台由多个硬件模块组成,包括:

  • CPU
  • GPU
  • Modem基带处理器
  • ISP(图像处理器)

这些模块通过硬件总线互联,协同工作。在GPU驱动安全研究中,最关键的特性是GPU和CPU共享同一块RAM

CPU侧操作系统通过管理CPU MMU的页表实现虚拟地址到物理地址的映射。GPU也有自己的MMU,但GPU的页表由CPU内核中的GPU驱动管理,从而限制GPU能够访问的物理地址范围。

典型业务场景:

  1. CPU侧分配一段物理内存
  2. 映射给GPU
  3. GPU从共享内存中取出数据完成计算/渲染
  4. 将结果写回共享内存

GPU驱动攻击面

GPU驱动安全研究的特殊攻击面在于其需要维护GPU页表,这个过程复杂且容易出现问题。历史上出现了多个由于GPU页表管理失误导致的安全漏洞。

ARM Mali驱动代表性漏洞

漏洞 类型 漏洞原语
CVE-2021-39793 页权限错误 篡改只读映射到用户进程的物理页
CVE-2021-28664 页权限错误 篡改只读映射到用户进程的物理页
CVE-2021-28663 GPU MMU操作异常 物理页UAF
CVE-2023-4211 条件竞争 SLUB对象UAF
CVE-2023-48409 整数溢出 堆溢出
CVE-2023-26083 内核地址泄露 内核地址泄露
CVE-2022-46395 条件竞争 物理页UAF

典型漏洞分析

CVE-2021-28664分析

漏洞补丁关键点
get_user_pages参数中的reg->flags & KBASE_REG_CPU_WR替换为reg->flags & (KBASE_REG_CPU_WR | KBASE_REG_GPU_WR)

标记说明

  • KBASE_REG_CPU_WR:reg能以写权限映射到用户态进程
  • KBASE_REG_GPU_WR:reg能以写权限映射到GPU

内存管理结构

  • kbase_va_region:管理物理内存,包括申请/释放、GPU/CPU页表映射管理
  • cpu_allocgpu_alloc:指向kbase_mem_phy_alloc,表示reg拥有的物理页
  • flags字段:控制驱动映射reg时的权限

漏洞利用

  1. 创建reg->flagsKBASE_REG_CPU_WRkbase_va_region
  2. 导入页面时获取进程中任意va对应page到kbase_va_region
  3. 以可写权限映射到用户态进程
  4. 篡改进程中任意只读映射对应的物理页

利用方式

  1. 修改Page Cache

    • 只读映射libc.so
    • 篡改其在Page Cache中的物理页,注入shellcode
    • 等高权限进程调用时提权
  2. 修改binder驱动

    • 篡改flat_binder_object->handle
    • 触发binder_transaction_buffer_release
    • 导致node引用计数不平衡
    • 转换为binder_node的UAF

CVE-2021-28663分析

漏洞类型:GPU物理页映射管理导致的物理页UAF

关键结构

  • kbase_va_region:表示物理内存资源
  • kbase_mem_phy_alloc:管理物理页

漏洞相关接口

  1. kbase_api_mem_alias:创建别名映射
  2. kbase_api_mem_flags_change:释放kbase_mem_phy_alloc中的物理页

漏洞原理

  1. kbase_api_mem_alias增加aliased[i]->kref确保使用中不被释放
  2. kbase_mmap映射内存时增加aliased[i]->gpu_mappings
  3. kbase_api_mem_flags_change能在不释放alloc时释放其中的物理页
  4. 导致物理页UAF

利用技术

  1. 篡改进程页表:fork + mmap大量分配进程页表占位释放的物理页
  2. 篡改GPU页表:通过GPU驱动接口分配GPU页表占位
  3. 篡改内核对象:喷射内核对象(如task_struct、cred)占位

CVE-2022-46395分析

漏洞类型:条件竞争导致的物理页UAF

漏洞代码

static int kbasep_write_soft_event_status(struct kbase_context *kctx, u64 evt, unsigned char new_status) {
    mapped_evt = kbase_vmap_prot(kctx, evt, sizeof(*mapped_evt), KBASE_REG_CPU_WR, &map);
    // Race window start
    if (!mapped_evt) return -EFAULT;
    *mapped_evt = new_status; 
    // Race window end
    kbase_vunmap(kctx, &map);
    return 0;
}

利用方法

  1. kbase_vmap_prot*mapped_evt之间触发时钟中断
  2. 扩大时间窗,在两步之间释放mapped_evt对应的物理页
  3. 实现物理页UAF写(只能写0或1)

占位技术

  • 使用vzalloc分配内存,根据大小计算分配的物理页数目
  • 逐次调用alloc_page分配物理页占位

整数溢出漏洞(CVE-2023-48409)

漏洞转换

  1. 利用摄像头驱动的堆溢出漏洞
  2. 篡改kbase_mem_phy_allocgpu_mappings为0
  3. 构造物理页UAF

MTE绕过

  • 即使启用MTE,仍有50%概率完成溢出不被检测
  • MTE检测到溢出也不会导致内核Panic,只是杀掉用户进程
  • 允许攻击者无限尝试

总结

  1. 研究演进

    • 从挖掘GPU特有漏洞开始
    • 逐步将各种通用漏洞转换为GPU漏洞
    • 核心原因:GPU驱动能力强大,可控制GPU硬件页表实现任意物理页读写
  2. 物理页UAF优势

    • 绕过CPU侧安全特性(KNOX、PAC、MTE)
    • 可直接Patch内核代码
    • 利用手段强大且多样化
  3. 漏洞利用趋势

    • 物理内存UAF成为主流利用方向
    • 涌现多种将不同漏洞转换为物理页UAF的技术
    • 如Dirty Pagetable、USMA、pipe_buffer->page指针劫持等
  4. 漏洞生命周期

    • 漏洞修复不代表生命结束
    • 强大原语可被其他漏洞复用
    • 历史漏洞利用经验可被继承和扩展

参考链接

  1. Two bugs with one PoC: Roo2ng Pixel 6 from Android 12 to Android 13
  2. The inside story of our CVE-2019-2025 exploit
  3. https://www.blackhat.com/docs/eu-16/materials/eu-16-Taft-GPU-Security-Exposed.pdf
  4. Off-By-One 2024 Day 1 - GPUAF
  5. Using a general GPU exploit tech to attack Pixel8
GPU 驱动漏洞分析与利用技术详解 背景介绍 现代移动SOC平台由多个硬件模块组成,包括: CPU GPU Modem基带处理器 ISP(图像处理器) 这些模块通过硬件总线互联,协同工作。在GPU驱动安全研究中,最关键的特性是 GPU和CPU共享同一块RAM 。 CPU侧操作系统通过管理CPU MMU的页表实现虚拟地址到物理地址的映射。GPU也有自己的MMU,但GPU的页表由CPU内核中的GPU驱动管理,从而限制GPU能够访问的物理地址范围。 典型业务场景: CPU侧分配一段物理内存 映射给GPU GPU从共享内存中取出数据完成计算/渲染 将结果写回共享内存 GPU驱动攻击面 GPU驱动安全研究的特殊攻击面在于其需要维护GPU页表,这个过程复杂且容易出现问题。历史上出现了多个由于GPU页表管理失误导致的安全漏洞。 ARM Mali驱动代表性漏洞 | 漏洞 | 类型 | 漏洞原语 | |------|------|----------| | CVE-2021-39793 | 页权限错误 | 篡改只读映射到用户进程的物理页 | | CVE-2021-28664 | 页权限错误 | 篡改只读映射到用户进程的物理页 | | CVE-2021-28663 | GPU MMU操作异常 | 物理页UAF | | CVE-2023-4211 | 条件竞争 | SLUB对象UAF | | CVE-2023-48409 | 整数溢出 | 堆溢出 | | CVE-2023-26083 | 内核地址泄露 | 内核地址泄露 | | CVE-2022-46395 | 条件竞争 | 物理页UAF | 典型漏洞分析 CVE-2021-28664分析 漏洞补丁关键点 : 将 get_user_pages 参数中的 reg->flags & KBASE_REG_CPU_WR 替换为 reg->flags & (KBASE_REG_CPU_WR | KBASE_REG_GPU_WR) 标记说明 : KBASE_REG_CPU_WR :reg能以写权限映射到用户态进程 KBASE_REG_GPU_WR :reg能以写权限映射到GPU 内存管理结构 : kbase_va_region :管理物理内存,包括申请/释放、GPU/CPU页表映射管理 cpu_alloc 和 gpu_alloc :指向 kbase_mem_phy_alloc ,表示reg拥有的物理页 flags 字段:控制驱动映射reg时的权限 漏洞利用 : 创建 reg->flags 为 KBASE_REG_CPU_WR 的 kbase_va_region 导入页面时获取进程中任意va对应page到 kbase_va_region 以可写权限映射到用户态进程 篡改进程中任意只读映射对应的物理页 利用方式 : 修改Page Cache : 只读映射libc.so 篡改其在Page Cache中的物理页,注入shellcode 等高权限进程调用时提权 修改binder驱动 : 篡改 flat_binder_object->handle 触发 binder_transaction_buffer_release 导致node引用计数不平衡 转换为binder_ node的UAF CVE-2021-28663分析 漏洞类型 :GPU物理页映射管理导致的物理页UAF 关键结构 : kbase_va_region :表示物理内存资源 kbase_mem_phy_alloc :管理物理页 漏洞相关接口 : kbase_api_mem_alias :创建别名映射 kbase_api_mem_flags_change :释放 kbase_mem_phy_alloc 中的物理页 漏洞原理 : kbase_api_mem_alias 增加 aliased[i]->kref 确保使用中不被释放 kbase_mmap 映射内存时增加 aliased[i]->gpu_mappings kbase_api_mem_flags_change 能在不释放alloc时释放其中的物理页 导致物理页UAF 利用技术 : 篡改进程页表:fork + mmap大量分配进程页表占位释放的物理页 篡改GPU页表:通过GPU驱动接口分配GPU页表占位 篡改内核对象:喷射内核对象(如task_ struct、cred)占位 CVE-2022-46395分析 漏洞类型 :条件竞争导致的物理页UAF 漏洞代码 : 利用方法 : 在 kbase_vmap_prot 和 *mapped_evt 之间触发时钟中断 扩大时间窗,在两步之间释放 mapped_evt 对应的物理页 实现物理页UAF写(只能写0或1) 占位技术 : 使用 vzalloc 分配内存,根据大小计算分配的物理页数目 逐次调用 alloc_page 分配物理页占位 整数溢出漏洞(CVE-2023-48409) 漏洞转换 : 利用摄像头驱动的堆溢出漏洞 篡改 kbase_mem_phy_alloc 的 gpu_mappings 为0 构造物理页UAF MTE绕过 : 即使启用MTE,仍有50%概率完成溢出不被检测 MTE检测到溢出也不会导致内核Panic,只是杀掉用户进程 允许攻击者无限尝试 总结 研究演进 : 从挖掘GPU特有漏洞开始 逐步将各种通用漏洞转换为GPU漏洞 核心原因:GPU驱动能力强大,可控制GPU硬件页表实现任意物理页读写 物理页UAF优势 : 绕过CPU侧安全特性(KNOX、PAC、MTE) 可直接Patch内核代码 利用手段强大且多样化 漏洞利用趋势 : 物理内存UAF成为主流利用方向 涌现多种将不同漏洞转换为物理页UAF的技术 如Dirty Pagetable、USMA、pipe_ buffer->page指针劫持等 漏洞生命周期 : 漏洞修复不代表生命结束 强大原语可被其他漏洞复用 历史漏洞利用经验可被继承和扩展 参考链接 Two bugs with one PoC: Roo2ng Pixel 6 from Android 12 to Android 13 The inside story of our CVE-2019-2025 exploit https://www.blackhat.com/docs/eu-16/materials/eu-16-Taft-GPU-Security-Exposed.pdf Off-By-One 2024 Day 1 - GPUAF Using a general GPU exploit tech to attack Pixel8