CVE-2026-31769Linux内核GPIB子系统中存在一个高危漏洞。在IO ioctl处理程序(如IBRD、IBWRT)处理期间,存在一个竞态条件,描述符指针在释放互斥锁后被使用。并发的IBCLOSEDEV调用可以在此窗口期间释放描述符,导致释放后重用。这允许本地低权限用户导致内核崩溃或潜在的权限提升,从而严重影响系统的机密性、完整性和可用性。
该漏洞源于Linux内核GPIB驱动程序中IO ioctl处理程序(IBRD、IBWRT、IBCMD、IBWAIT)的竞态条件。这些处理程序通过 `handle_to_descriptor()` 获取 `gpib_descriptor` 指针,随后释放 `board->big_gpib_mutex`。在互斥锁被释放后,它们继续使用该描述符指针。竞态窗口允许另一个线程并发调用 `IBCLOSEDEV`。`close_dev_ioctl()` 函数能够检查并释放该描述符。由于IO处理程序在无锁状态下操作,`IBCLOSEDEV` 可能在IO处理程序仍使用该内存时将其释放,导致释放后重用。官方补丁通过在 `gpib_descriptor` 结构中引入一个内核专用的 `descriptor_busy` 引用计数器来修复此问题。IO处理程序在释放互斥锁前原子性地增加此计数,并在操作完成后减少。`close_dev_ioctl()` 现在会检查此计数,若非零则拒绝关闭操作。这是必须的,因为原有的 `io_in_progress` 标志可被用户空间通过IBWAIT操纵,无法单独用于安全检查。