CVE-2026-31754Linux内核CDNS3驱动存在状态不一致漏洞。当gadget初始化失败时,硬件状态与软件状态出现分歧。若用户随后通过sysfs切换至主机模式,因错误处理路径跳过了硬件清理步骤,导致违反控制器设计规范,从而在xHCI主机控制器设置过程中触发同步外部中止错误,致使系统崩溃。
该漏洞源于Linux内核`drivers/usb/cdns3/drd.c`模块中的错误处理逻辑缺陷。当`cdns3_gadget_start()`函数执行失败时,DRD(双角色设备)硬件实际仍停留在Gadget模式,但驱动程序的软件状态已被标记为`INACTIVE`。此时,本地低权限用户可通过向`/sys/class/usb_role/.../role`文件写入"host"来触发角色切换。由于软件状态显示为`INACTIVE`,`cdns_role_stop()`函数会误以为无需执行清理操作而直接返回,导致硬件未被正确复位至空闲状态。随后,当系统尝试初始化xHCI主机控制器调用`xhci_gen_setup()`时,由于硬件状态未就绪且违反了控制器设计规范,触发了同步外部中止(Synchronous External Abort),最终导致内核崩溃。