CVE-2025-40164CVE-2025-40164是Linux内核中的一个中等严重性漏洞,位于drivers/net/usb/usbnet.c文件中的usbnet驱动组件。该漏洞源于在可抢占代码上下文中不当使用smp_processor_id()函数,导致内核发出警告并可能引发系统不稳定。smp_processor_id()函数设计用于在非抢占环境中获取当前CPU ID,但在usbnet_skb_return()函数中调用时可能处于可抢占的上下文中,这违反了内核编程规范。该漏洞由Syzbot模糊测试工具发现,表现为在执行dhcpcd进程时触发BUG警告。虽然该漏洞主要导致可用性问题(高可用性影响),但其本质是一个代码正确性问题,需要在内核代码中添加适当的同步保护机制来修复。
漏洞的核心问题在于usbnet_skb_return()函数(位于drivers/net/usb/usbnet.c:331)中调用了smp_processor_id(),但该函数可能在可抢占的上下文中被调用。从Syzbot报告的堆栈跟踪可以看出,调用链为:dhcpcd进程 → dev_ioctl() → dev_ifsioc() → dev_set_mtu() → netif_set_mtu() → __dev_set_mtu() → usbnet_change_mtu() → usbnet_resume_rx() → usbnet_skb_return()。在usbnet_change_mtu()调用usbnet_resume_rx()时,代码路径可能处于进程上下文中而非中断或软中断上下文。修复方案是在usbnet_resume_rx()函数中添加local_bh_disable()/local_bh_enable()保护,以禁用软中断抢占,确保smp_processor_id()在正确的上下文中执行。这是一种典型的内核并发控制问题,需要开发者显式管理抢占状态以保证内核API的正确使用。