CVE-2026-99050 in Linux
摘要
由 VulDB • 2026-10-23
在 Linux 内核中,已修复以下漏洞:
gpio: mpsse: 修复启用 IRQ poll worker 时的竞态条件
`gpio_mpsse_irq_enable()` 在发布(publishing)worker 之前即启动了轮询 worker: `scheduled_work()` 的执行早于将 worker 添加到 `priv->workers`。如果在该时间窗口内执行了 `gpio_mpsse_disconnect()`,则会遗漏该 worker;一旦 disconnect 返回,USB core 会释放 `mpsse_priv`,而孤立的 `gpio_mpsse_poll()` work 仍会继续访问它,从而导致 use-after-free(释放后使用)。
通过在单个 `irq_spin` 临界区内同时发布并启用 worker 来修复此问题。Teardown 过程也在 `irq_spin` 下遍历同一列表,因此列表中找到的 worker 保证已被启用,并且无论其处于排队状态还是运行中,`cancel_work_sync()` 都能正确处理它。
如果在 disconnect 遍历之后才启用的 worker 仍会被遗漏,因此在 teardown 遍历之前,还在 `irq_spin` 临界区内设置一个新的 `priv->dying` 标志,并在同一临界区中进行检查;当设备即将移除时,通过 `kfree_rcu()` 释放资源,因为此时若调用 `kfree()` 将会持有 IRQ core 的 raw spinlock,而在 PREEMPT_RT 上可能会发生睡眠。在持有 `irq_spin` 的情况下调用 `schedule_work()` 是安全的,且下一次 probe 会获取一个新的 `mpsse_priv`,因此该标志无需清除。
此问题由内部静态分析工具发现。
If you want to get best quality of vulnerability data, you may have to visit VulDB.