解读 2024 年高通 GPU 漏洞细节及利用技术
字数 3002 2025-08-20 18:17:42

2024年高通GPU漏洞分析与利用技术详解

1. 高通GPU内存管理基础

高通GPU驱动使用kgsl_mem_entrykgsl_memdesc结构体来管理物理页:

  • kgsl_mem_entry对象分配逻辑位于kgsl_ioctl_gpuobj_alloc接口
  • 通过kgsl_allocate_userkgsl_memdesc分配物理页
  • 使用kgsl_mem_entry_attach_and_map将其映射到GPU侧
  • 用户态进程映射通过驱动的mmap回调实现

内存释放流程:

  • 通过kgsl_ioctl_gpuobj_free接口释放
  • 使用引用计数(refcount)管理生命周期
  • 引用计数为0时进入kgsl_mem_entry_destroy
  • 先解除entry中的物理页映射,再释放物理页和entry对象

kgsl_sharedmem_free函数负责释放kgsl_memdesc资源:

void kgsl_sharedmem_free(struct kgsl_memdesc *memdesc) {
    if (!memdesc || !memdesc->size) return;
    if (!memdesc->ops) return;
    
    if (memdesc->ops->put_gpuaddr)
        memdesc->ops->put_gpuaddr(memdesc); // 解除GPU页表映射
        
    if (memdesc->ops->free)
        memdesc->ops->free(memdesc); // 释放memdesc中的物理页内存
}

2. CVE-2024-23380 - VBO内存映射竞争条件漏洞

漏洞细节

  • 出现在处理VBO(Vertex Buffer Object)内存映射时
  • VBO缓冲区在释放目标memdesc的互斥锁后被映射
  • 导致竞争条件,可能引发VBO缓冲区的UAF

技术分析

VBO内存区域分配特点:

  • 不分配物理页,只分配GPU VA
  • 将这些VA映射为零页(类似Linux内核的零页)

VBO内存映射流程:

  1. 使用kgsl_ioctl_gpumem_bind_ranges将其他kgsl_mem_entry内存映射到VBO的VA范围
  2. 找到要映射内存的VBO entry(op->target)
  3. 找到所有被绑定的entry(op->ops[i].entry)
  4. 启动内核work线程进入kgsl_sharedmem_bind_worker处理

关键函数:

  • kgsl_memdesc_add_range: 在VBO entry中增加映射
    • 分配range存放映射信息
    • 解除[start, last] VA处原有映射
    • 调用kgsl_mmu_map_child操作GPU页表映射物理页
  • kgsl_memdesc_remove_range: 清理range映射
    • 清理GPU侧映射
    • 释放range->entry的引用
    • 释放range

漏洞触发流程

  1. kgsl_memdesc_add_range线程在释放锁后调用kgsl_mmu_map_child
  2. 此时其他线程可并发调用kgsl_memdesc_remove_range提前走释放流程
  3. 导致真实释放时页表未清理,造成物理页UAF

利用思路

  • kgsl_mem_entry对象通过kmalloc分配
  • 其他内核漏洞可篡改kgsl_mem_entry对象的refcountmemdesc
  • 将漏洞转换为GPU漏洞进行利用

3. CVE-2023-33107 - SVM区域校验整数溢出漏洞

漏洞细节

  • kgsl_iommu_set_svm_region中地址校验存在整数溢出
  • 导致重叠映射区存在,页表映射出错
  • 最终导致物理页UAF

技术分析

漏洞位于iommu_addr_in_svm_ranges函数:

if (gpuaddr >= pt->svm_start && 
    gpuaddr + size > gpuaddr &&  // 整数溢出检查
    gpuaddr + size <= pt->svm_end)

gpuaddr + size发生整数溢出时:

  • gpuaddr + size < gpuaddr
  • 只要gpuaddrpt->svm_startpt->svm_end之间就能通过检查

利用策略

使用4个GPU映射区域构造利用:

映射区 gpuaddr end size 用途
OVERLAP 0x7001fe000 0x700205000 0x7000 与UAF区域形成重叠
UAF 0x7001ff000 0x710203000 0x10004000 漏洞触发后指向释放的物理页
BOGUS 0x700204000 0x700101000 0xffffffffffefd000 触发整数溢出(end < gpuaddr)
PLACEHOLDER 0x710204000 0x720604000 0x10400000 占位

利用步骤:

  1. 正常分配UAF和PLACEHOLDER区域
  2. 分配BOGUS区域触发整数溢出,插入非法entry
  3. 分配OVERLAP区域形成重叠映射
  4. 利用GPU页表映射异常导致部分VA解映射失败
  5. 释放UAF对象时因部分PTE为0而未完全解映射
  6. GPU残留指向已释放物理页的映射

4. 其他相关漏洞

CVE-2024-23372

  • 类似CVE-2023-33107
  • gpumem_alloc_vbo_entry分配vbo entry时size校验不足
  • 过大size导致_get_unmapped_area整数溢出
  • 形成gpuaddr + size < gpuaddr的红黑树节点

CVE-2024-23373

  • dma_buf类型的kgsl_mem_entry释放问题
  • 未考虑GPU解映射失败情况
  • 物理页被释放但GPU页表残留映射
  • 导致UAF

CVE-2024-21471

  • 类似CVE-2024-23373
  • GPU解映射失败时仍释放物理页
  • 可能导致UAF

CVE-2024-23354

  • kgsl_ioctl_gpumem_bind_ranges中的栈内存问题
  • op->data设置为栈内存
  • 用户态进程kill信号可能导致提前退出
  • 后续访问已释放栈内存

CVE-2024-21478

  • 类型混淆漏洞
  • kgsl_count_hw_fences函数参数应为kgsl_drawobj_sync_event
  • 但有路径传入kgsl_mem_entry对象

CVE-2024-23351

  • LPAC工作模式的寄存器保护问题
  • 涉及GEN7_CP_LPAC_PROTECT_CNTL寄存器
  • 可能类似"梯云纵"漏洞,通过写保护寄存器执行GPU特权指令

5. 总结与研究方向

研究总结

  1. 高通GPU驱动漏洞多与内存管理和MMU操作相关
  2. kgsl_mem_entry对象是常见攻击目标
  3. 整数溢出和竞争条件是主要漏洞类型
  4. GPU页表管理异常常导致物理页UAF

研究方向建议

  1. 动态调试分析GPU驱动行为
  2. 研究历史漏洞模式,发掘新攻击面
  3. 探索高通GPU特权指令利用
  4. 分析其他厂商GPU是否存在类似问题

参考资源

  1. BHUSA: The Way to Android Root: Exploiting Your GPU on Smartphone
  2. Pan Zhenpeng & Jheng Bing Jhong, "GPUAF : Two ways of rooting All Qualcomm based Android phones"
  3. Google Project Zero: https://googleprojectzero.github.io/0days-in-the-wild//0day-RCAs/2023/CVE-2023-33107.html
2024年高通GPU漏洞分析与利用技术详解 1. 高通GPU内存管理基础 高通GPU驱动使用 kgsl_mem_entry 和 kgsl_memdesc 结构体来管理物理页: kgsl_mem_entry 对象分配逻辑位于 kgsl_ioctl_gpuobj_alloc 接口 通过 kgsl_allocate_user 为 kgsl_memdesc 分配物理页 使用 kgsl_mem_entry_attach_and_map 将其映射到GPU侧 用户态进程映射通过驱动的 mmap 回调实现 内存释放流程: 通过 kgsl_ioctl_gpuobj_free 接口释放 使用引用计数( refcount )管理生命周期 引用计数为0时进入 kgsl_mem_entry_destroy 先解除entry中的物理页映射,再释放物理页和entry对象 kgsl_sharedmem_free 函数负责释放 kgsl_memdesc 资源: 2. CVE-2024-23380 - VBO内存映射竞争条件漏洞 漏洞细节 出现在处理VBO(Vertex Buffer Object)内存映射时 VBO缓冲区在释放目标memdesc的互斥锁后被映射 导致竞争条件,可能引发VBO缓冲区的UAF 技术分析 VBO内存区域分配特点: 不分配物理页,只分配GPU VA 将这些VA映射为零页(类似Linux内核的零页) VBO内存映射流程: 使用 kgsl_ioctl_gpumem_bind_ranges 将其他 kgsl_mem_entry 内存映射到VBO的VA范围 找到要映射内存的VBO entry( op->target ) 找到所有被绑定的entry( op->ops[i].entry ) 启动内核work线程进入 kgsl_sharedmem_bind_worker 处理 关键函数: kgsl_memdesc_add_range : 在VBO entry中增加映射 分配range存放映射信息 解除 [start, last] VA处原有映射 调用 kgsl_mmu_map_child 操作GPU页表映射物理页 kgsl_memdesc_remove_range : 清理range映射 清理GPU侧映射 释放range->entry的引用 释放range 漏洞触发流程 kgsl_memdesc_add_range 线程在释放锁后调用 kgsl_mmu_map_child 此时其他线程可并发调用 kgsl_memdesc_remove_range 提前走释放流程 导致真实释放时页表未清理,造成物理页UAF 利用思路 kgsl_mem_entry 对象通过 kmalloc 分配 其他内核漏洞可篡改 kgsl_mem_entry 对象的 refcount 或 memdesc 将漏洞转换为GPU漏洞进行利用 3. CVE-2023-33107 - SVM区域校验整数溢出漏洞 漏洞细节 kgsl_iommu_set_svm_region 中地址校验存在整数溢出 导致重叠映射区存在,页表映射出错 最终导致物理页UAF 技术分析 漏洞位于 iommu_addr_in_svm_ranges 函数: 当 gpuaddr + size 发生整数溢出时: gpuaddr + size < gpuaddr 只要 gpuaddr 在 pt->svm_start 和 pt->svm_end 之间就能通过检查 利用策略 使用4个GPU映射区域构造利用: | 映射区 | gpuaddr | end | size | 用途 | |--------|---------|-----|------|------| | OVERLAP | 0x7001fe000 | 0x700205000 | 0x7000 | 与UAF区域形成重叠 | | UAF | 0x7001ff000 | 0x710203000 | 0x10004000 | 漏洞触发后指向释放的物理页 | | BOGUS | 0x700204000 | 0x700101000 | 0xffffffffffefd000 | 触发整数溢出(end < gpuaddr) | | PLACEHOLDER | 0x710204000 | 0x720604000 | 0x10400000 | 占位 | 利用步骤: 正常分配UAF和PLACEHOLDER区域 分配BOGUS区域触发整数溢出,插入非法entry 分配OVERLAP区域形成重叠映射 利用GPU页表映射异常导致部分VA解映射失败 释放UAF对象时因部分PTE为0而未完全解映射 GPU残留指向已释放物理页的映射 4. 其他相关漏洞 CVE-2024-23372 类似CVE-2023-33107 gpumem_alloc_vbo_entry 分配vbo entry时size校验不足 过大size导致 _get_unmapped_area 整数溢出 形成 gpuaddr + size < gpuaddr 的红黑树节点 CVE-2024-23373 dma_ buf类型的 kgsl_mem_entry 释放问题 未考虑GPU解映射失败情况 物理页被释放但GPU页表残留映射 导致UAF CVE-2024-21471 类似CVE-2024-23373 GPU解映射失败时仍释放物理页 可能导致UAF CVE-2024-23354 kgsl_ioctl_gpumem_bind_ranges 中的栈内存问题 op->data 设置为栈内存 用户态进程kill信号可能导致提前退出 后续访问已释放栈内存 CVE-2024-21478 类型混淆漏洞 kgsl_count_hw_fences 函数参数应为 kgsl_drawobj_sync_event 但有路径传入 kgsl_mem_entry 对象 CVE-2024-23351 LPAC工作模式的寄存器保护问题 涉及 GEN7_CP_LPAC_PROTECT_CNTL 寄存器 可能类似"梯云纵"漏洞,通过写保护寄存器执行GPU特权指令 5. 总结与研究方向 研究总结 高通GPU驱动漏洞多与内存管理和MMU操作相关 kgsl_mem_entry 对象是常见攻击目标 整数溢出和竞争条件是主要漏洞类型 GPU页表管理异常常导致物理页UAF 研究方向建议 动态调试分析GPU驱动行为 研究历史漏洞模式,发掘新攻击面 探索高通GPU特权指令利用 分析其他厂商GPU是否存在类似问题 参考资源 BHUSA: The Way to Android Root: Exploiting Your GPU on Smartphone Pan Zhenpeng & Jheng Bing Jhong, "GPUAF : Two ways of rooting All Qualcomm based Android phones" Google Project Zero: https://googleprojectzero.github.io/0days-in-the-wild//0day-RCAs/2023/CVE-2023-33107.html