解读 2024 年高通 GPU 漏洞细节及利用技术
字数 3002 2025-08-20 18:17:42
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资源:
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内存映射流程:
- 使用
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函数:
if (gpuaddr >= pt->svm_start &&
gpuaddr + size > gpuaddr && // 整数溢出检查
gpuaddr + size <= pt->svm_end)
当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