CVE-2026-23013CVE-2026-23013是Linux内核中octeon_ep_vf网络驱动程序的一个高危安全漏洞。该漏洞存在于IRQ(中断请求)处理机制中,具体表现为在MSI-X队列中断请求失败时的回滚处理逻辑存在缺陷。当octep_vf_request_irqs()函数在请求MSI-X队列IRQs时,如果request_irq()调用部分失败,回滚循环会调用free_irq()释放中断,但此时使用的dev_id参数从原始的ioq_vector被错误地替换为'oct',导致dev_id不匹配。这种不匹配会使irqaction保持注册状态,IRQ处理程序仍然处于活跃状态。当系统后续进行解包或拆除操作时,ioq_vector会被释放,此时如果发生中断触发,就会访问已释放的内存区域,形成use-after-free漏洞。攻击者可通过触发中断条件来利用此漏洞,可能导致系统崩溃(拒绝服务)或在内核上下文中执行任意代码。该漏洞需要本地低权限用户即可触发,无需用户交互,CVSS评分7.0,属于高危级别。
该漏洞的技术根源在于Linux内核octeon_ep_vf驱动的中断处理机制设计缺陷。在正常的中断请求流程中,octep_vf_request_irqs()函数会为每个MSI-X队列分配中断,并使用ioq_vector作为dev_id参数传递给request_irq()。dev_id是区分不同中断处理程序的关键标识符,用于在free_irq()调用时精确匹配要释放的中断。当request_irq()在请求多个中断的过程中部分失败时(例如第N个中断请求失败),代码会进入错误回滚流程。此时回滚循环会遍历已成功请求的中断并调用free_irq()释放它们,但存在一个关键错误:free_irq()调用时使用的dev_id被硬编码为'oct'(驱动对象指针),而不是原始请求时使用的ioq_vector。由于dev_id不匹配,free_irq()无法正确找到并释放对应的irqaction,导致中断处理程序仍然注册在内核中断描述符表中。随后,当驱动进行解包或设备拆除时,ioq_vector结构被kfree()释放,但注册的中断处理程序仍然尝试访问它。当硬件中断触发时,中断处理程序会解引用已释放的ioq_vector指针,触发use-after-free漏洞,可能导致内核崩溃或代码执行。修复方案是在回滚循环中正确传递ioq_vector作为dev_id参数,确保free_irq()能够正确匹配并释放中断资源。