CVE-2025-39959CVE-2025-39959是Linux内核ASoC(ALSA System on Chip)子系统AMD ACP(Audio Co-Processor)I2S音频驱动中的一个空指针解引用漏洞。该漏洞位于acp_i2s驱动中,由于错误地使用dev_get_platdata(dev)函数获取acp_chip_info结构体数据,导致部分成员变量无法正确更新。当驱动尝试访问这些未初始化的成员时,可能触发空指针解引用,引发内核崩溃或系统不可用。
该漏洞的CVSS评分为5.5,属于中危级别。攻击者需要本地低权限访问权限即可触发此漏洞,无需用户交互。虽然该漏洞不会直接导致信息泄露或数据篡改,但其高可用性影响(Availability: High)意味着攻击者可利用此漏洞使系统崩溃或拒绝服务。该问题源于此前修复commit(Fix NULL pointer deref in acp_i2s_set_tdm_slot)仅修复了set_tdm_slot()函数中的同类问题,而未全面排查所有相关函数,导致类似缺陷仍然存在于其他代码路径中。
此漏洞影响使用AMD ACP音频处理器的Linux系统,常见于搭载AMD处理器的笔记本电脑、台式机及服务器设备中。修复方案已通过内核补丁合入,使用dev_get_drvdata(dev->parent)正确获取父设备的驱动数据。
该漏洞的技术根源在于Linux内核ASoC框架中设备数据获取API的误用。在Linux设备模型中,platform_device通过两种机制存储私有数据:platform_data(静态分配,在设备注册时指定)和driver_data(动态分配,通过dev_set_drvdata设置)。
在acp_i2s驱动中,acp_chip_info结构体是通过dev_set_drvdata()绑定到父设备上的,但原代码错误地使用了dev_get_platdata(dev)来获取该数据。由于dev->platform_data字段未被设置(为NULL),导致获取到的acp_chip_info指针为NULL。当后续代码尝试通过该空指针访问成员变量(如chip_info->i2s_count、chip_info->tdm_fmt等)时,内核将触发空指针解引用异常。
利用方式方面,攻击者需要本地访问权限,触发条件为加载或使用AMD ACP音频驱动的I2S功能。具体触发路径包括:1)播放或录制音频时驱动初始化路径;2)通过ALSA控制接口配置音频参数;3)系统启动时自动加载音频驱动模块。攻击者可编写简单的C程序打开音频设备并执行特定ioctl调用即可触发崩溃。
修复方案为将所有相关函数中的dev_get_platdata(dev)替换为dev_get_drvdata(dev->parent),确保从正确的父设备获取驱动数据。该修复涉及acp_i2s驱动中的多个函数,确保全面解决空指针解引用问题。