CVE-2023-53666CVE-2023-53666是Linux内核ASoC(ALSA System on Chip)子系统中的wcd938x编解码器驱动存在的一个中等严重性安全漏洞。该漏洞源于MBHC(Multi-Button Headset Control,多按键耳机控制)模块初始化失败时缺少必要的错误处理逻辑。MBHC是Qualcomm(高通)音频编解码器中用于检测耳机插入、按键操作等事件的关键组件,其初始化过程可能因为硬件异常或资源分配失败而返回错误指针。然而,在wcd938x_codec_set_jack函数中调用wcd_mbhc_start时,未对MBHC初始化返回的错误指针进行检查,直接使用该指针进行后续配置操作,导致内核在尝试解引用错误指针(虚拟地址0xfffffffffffffff8)时触发页面错误(page fault),造成内核崩溃(Kernel Panic)。该漏洞的CVSS评分为5.5,属于本地可利用的中危漏洞,攻击者需要具备低权限即可触发系统拒绝服务(DoS),对系统可用性造成高影响。该漏洞影响了多个Linux内核稳定版本分支,相关修复补丁已合并到Linux内核主线及多个stable分支中。
从技术层面分析,该漏洞的核心问题在于wcd938x编解码器驱动的MBHC初始化路径缺少错误处理。具体而言,wcd_mbhc_init()函数在执行过程中可能因内存分配失败、硬件通信异常等原因返回一个ERR_PTR编码的错误指针。在正常的驱动设计中,调用者应当使用IS_ERR()宏检查返回值并适当处理错误情况。然而,在wcd938x_codec_set_jack()函数中,代码直接调用wcd_mbhc_start()并传入未经检查的MBHC指针。当wcd_mbhc_start()内部访问该指针的成员(如priv->wcd_mbhc)时,内核尝试访问虚拟地址0xfffffffffffffff8(即-8偏移的错误指针),触发"Unable to handle kernel paging request"异常。
漏洞利用方面,由于该漏洞需要本地低权限访问(AV:L/PR:L),攻击者可以通过加载snd_soc_wcd938x音频驱动模块或插入兼容的音频编解码器硬件来触发。在Qualcomm SC8280XP等使用wcd938x编解码器的平台上,系统启动时snd_soc_sc8280xp_platform_probe会调用snd_soc_register_card,进而触发snd_soc_bind_card和snd_soc_link_init,最终调用qcom_snd_wcd_jack_setup和wcd938x_codec_set_jack。如果MBHC初始化失败,整个调用链将因空指针解引用而崩溃,导致系统不可用。修复方案是在wcd938x_codec_set_jack中添加对wcd_mbhc_init返回值的检查,使用IS_ERR()宏检测错误并提前返回,避免后续的错误指针解引用操作。