CVE-2022-50535CVE-2022-50535是Linux内核中AMD显示驱动(drm/amd/display)的一个空指针解引用漏洞,位于dm_resume函数中。该漏洞由smatch静态分析工具发现,原始代码在dm_resume函数的循环处理中未对aconnector->dc_link指针进行空指针检查,直接假设该指针不为空便进行后续操作。当dc_link指针实际为NULL时,内核将触发空指针解引用,导致系统崩溃或拒绝服务(DoS)。该漏洞的CVSS评分为5.5,属于中危级别,攻击者需要本地低权限访问即可触发,无需用户交互。该漏洞主要影响使用AMD显卡的Linux系统,在系统从挂起/休眠状态恢复(resume)过程中可能被触发。由于该漏洞仅影响可用性(机密性和完整性不受影响),攻击者无法通过该漏洞获取敏感信息或提升权限,但可以导致系统不稳定或崩溃。Linux内核维护者已通过在循环开始处添加dc_link空指针检查来修复此问题,并移除了循环内部冗余的检查逻辑。该漏洞影响多个Linux内核稳定版本,相关补丁已合入主线内核。
该漏洞存在于Linux内核的AMD显示驱动模块(drm/amd/display)中,具体位于dm_resume函数。在系统从休眠(S3)或挂起状态恢复时,dm_resume函数负责重新初始化和恢复显示相关的硬件状态。
漏洞的根本原因是:在dm_resume函数的循环中,代码通过aconnector结构体访问其dc_link成员指针,但未对该指针进行NULL检查。原始代码假设aconnector->dc_link始终指向有效的dc_link对象,便直接进行后续的硬件恢复操作。然而,在某些特定场景下(如显示连接器未正确初始化或硬件异常),dc_link指针可能为NULL,此时对NULL指针的解引用将导致内核崩溃(kernel panic)或oops错误。
利用方式方面,由于该漏洞需要本地访问权限(AV:L),攻击者需要能够在目标系统上执行代码。攻击者可以通过以下方式触发该漏洞:1)编写一个内核模块或利用现有驱动接口,在特定条件下使aconnector->dc_link保持为NULL状态;2)触发系统进入挂起状态(通过echo mem > /sys/power/state);3)唤醒系统,触发dm_resume函数执行,从而导致空指针解引用。
修复方案是在循环开始处添加if (!dc_link) continue;检查,跳过dc_link为NULL的连接器,同时移除循环内部冗余的空指针检查,简化代码逻辑。该修复已合入多个Linux内核稳定版本。