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能够访问的物理地址范围。
典型业务场景:
- 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_mappingskbase_api_mem_flags_change能在不释放alloc时释放其中的物理页- 导致物理页UAF
利用技术:
- 篡改进程页表:fork + mmap大量分配进程页表占位释放的物理页
- 篡改GPU页表:通过GPU驱动接口分配GPU页表占位
- 篡改内核对象:喷射内核对象(如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;
}
利用方法:
- 在
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