CVE-2025-39938CVE-2025-39938是Linux内核ASoC(ALSA System on Chip)子系统中高通(Qualcomm)q6apm-lpass-dais驱动存在的一个空指针解引用漏洞。该漏洞位于q6apm_lpass_dai_prepare()函数中,当源图(source graph)打开失败时(例如ADSP因audioreach拓扑配置错误而拒绝请求),图会被关闭并将dai_data->graph[dai->id]赋值为NULL。然而,代码并未检查该NULL状态就继续为sink图准备DAI,当再次调用q6apm_lpass_dai_prepare()时,传入的dai_data->graph[dai->id]为NULL,导致内核空指针解引用异常,从而引发系统崩溃(Kernel Panic)。该漏洞的CVSS评分为5.5,属于中危级别,攻击者需要本地低权限访问即可触发,但无需用户交互,成功利用后将导致系统可用性完全丧失(内核崩溃),但不影响机密性和完整性。受影响的代码路径涉及q6apm_graph_media_format_pcm、q6apm_lpass_dai_prepare、snd_soc_pcm_dai_prepare等多个内核函数调用链,主要影响使用高通音频处理模块(APM)的嵌入式设备和移动设备。
该漏洞的根本原因是q6apm-lpass-dais驱动在处理DAI(Digital Audio Interface)准备操作时缺少对graph指针的有效性检查。具体技术细节如下:
1. 当应用程序通过ALSA框架触发音频播放时,内核会调用snd_soc_pcm_dai_prepare()准备PCM DAI;
2. 该函数进一步调用q6apm_lpass_dai_prepare(),该函数访问dai_data->graph[dai->id]来获取音频图对象;
3. 如果在此之前打开源图的操作失败(例如ADSP返回错误码0x0100102/1001002),graph会被关闭并设置为NULL;
4. 代码没有检查graph是否为NULL就直接调用q6apm_graph_media_format_pcm(),该函数在偏移0xa8处访问graph成员;
5. 由于graph为NULL,访问0xa8偏移处的内容导致内核空指针解引用(virtual address 00000000000000a8);
6. 内核触发oops或panic,系统崩溃。
利用条件:攻击者需要本地低权限访问系统,能够触发音频播放并构造导致ADSP返回错误的audioreach拓扑配置,即可使系统崩溃。该漏洞属于本地拒绝服务(DoS)类型漏洞。