CVE-2025-39944CVE-2025-39944是Linux内核octeontx2-pf驱动中的一个高危释放后使用(Use-After-Free)漏洞,CVSS评分为7.8。该漏洞位于otx2_ptp_destroy()函数中,源于cancel_delayed_work()无法保证延迟工作项synctstamp_work已完全执行完毕。当otx2_ptp结构体被释放后,正在运行的延迟工作回调函数otx2_sync_tstamp()仍然会尝试访问已释放的内存,导致释放后使用漏洞。由于synctstamp_work是周期性执行的工作项,触发该竞争条件的可能性不容忽视。该漏洞可被本地低权限用户触发,可能导致系统崩溃、内核数据损坏或权限提升。漏洞已在多个Linux内核稳定版本中通过将cancel_delayed_work()替换为cancel_delayed_work_sync()进行修复,确保延迟工作项在otx2_ptp内存释放前被完全取消。该漏洞最初通过静态分析发现,研究人员通过在QEMU中模拟OcteonTX2 PCI设备并在otx2_sync_tstamp()函数中引入人为延迟来复现和测试该问题。
该漏洞的技术原理如下:在octeontx2-pf驱动的PTP(精确时间协议)模块中,otx2_ptp_init()分配otx2_ptp结构体并初始化一个周期性的延迟工作项synctstamp_work,该工作项的回调函数为otx2_sync_tstamp()。在设备卸载路径中,otx2_ptp_destroy()负责清理资源,但它仅调用了cancel_delayed_work()来取消延迟工作。cancel_delayed_work()仅将工作项标记为取消状态,并不会等待正在执行的工作回调函数完成。当synctstamp_work正在CPU上运行时,如果otx2_ptp_destroy()执行kfree(ptp)释放了otx2_ptp结构体,那么otx2_sync_tstamp()回调函数将继续访问已释放的内存,造成释放后使用漏洞。具体的竞争条件为:CPU 0执行otx2_remove()->otx2_ptp_destroy()->cancel_delayed_work()->kfree(ptp),而CPU 1同时执行otx2_sync_tstamp()回调,访问ptp->xxx造成UAF。KASAN报告确认了该漏洞,错误信息为slab-use-after-free,写入操作发生在__run_timer_base中。修复方案是将cancel_delayed_work()替换为cancel_delayed_work_sync(),后者会同步等待延迟工作项完全执行完毕后再返回,从而保证内存释放的安全性。