CVE-2026-31701Linux内核ALSA caiaq驱动程序中存在一个安全漏洞。该驱动在create_card()函数中存储了父USB设备的指针,但未对其进行引用计数操作。当USB设备断开连接并释放后,snd_usb_caiaq_card_free()回调函数仍可能异步运行并访问该指针,导致释放后利用(UAF)问题。此外,在释放回调中调用usb_reset_device()也是不恰当的,可能导致竞争条件。该漏洞可能导致本地攻击者引发拒绝服务。
该漏洞源于Linux内核中snd_usb_caiaq驱动的引用计数管理错误。在create_card()中,驱动将USB设备指针存储在cdev->chip.dev,但未调用usb_get_dev()增加引用计数。当USB设备断开时,核心USB代码释放设备结构体。然而,音频卡可能仍处于打开状态,其私有释放回调snd_usb_caiaq_card_free()会通过snd_card_free_when_closed()异步执行。当此回调尝试访问cdev->chip.dev时,由于设备已被释放,导致UAF,进而可能引发内核崩溃(拒绝服务)。此外,原代码在清理路径中调用usb_reset_device(),这在设备移除上下文中持有设备锁是不安全的,会与断开连接路径产生竞争。攻击者需具备本地低权限,通过触发特定的设备断开和清理顺序即可利用此漏洞。