CVE-2025-39965CVE-2025-39965是Linux内核xfrm(IPsec转换框架)子模块中的一个释放后使用(Use-After-Free, UAF)漏洞。该漏洞源于提交94f39804d891("xfrm: Duplicate SPI Handling")引入的SPI(Security Parameters Index,安全参数索引)处理逻辑缺陷。在xfrm_alloc_spi函数中,当SPI值为0时,代码错误地将状态对象添加到byspi链表中,而SPI值为0本应表示"未分配SPI"的特殊含义。由于__xfrm_state_delete函数在删除状态时不会从byspi链表中移除这些SPI为0的状态(因为它们理论上不应存在于该链表中),这会导致链表结构损坏。当系统后续遍历byspi链表时,会触发对已释放内存的访问,从而引发UAF漏洞。该漏洞的CVSS评分为5.5,属于中等严重级别,攻击者需要本地低权限访问即可触发,可导致系统可用性受到严重影响(系统崩溃或内核panic)。该漏洞影响多个Linux内核稳定版本,Linux内核维护团队已发布多个补丁修复该问题。
该漏洞的核心问题在于xfrm子系统中SPI值为0的语义冲突。在正常的xfrm设计中,x->id.spi == 0表示"尚未分配SPI",这些状态对象不应出现在byspi哈希链表中。然而,在提交94f39804d891引入重复SPI处理逻辑后,xfrm_alloc_spi函数会在SPI为0的情况下仍然创建状态对象并将其插入byspi链表,这违反了原有的设计约定。具体技术细节如下:1) 当用户空间通过netlink接口请求分配SPI时,如果分配的SPI值为0,xfrm_alloc_spi会创建一个新的xfrm_state对象;2) 新创建的状态对象被错误地添加到了byspi链表中;3) 当后续通过__xfrm_state_delete删除该状态时,由于代码假设byspi链表不应包含SPI为0的条目,因此不会从byspi链表中移除该节点;4) 此时状态对象被释放,但byspi链表仍持有指向已释放内存的指针;5) 下次遍历byspi链表时(如查找或添加新的SPI时),内核会访问已释放的内存,触发UAF漏洞。攻击者可以通过本地低权限账户,利用精心构造的netlink消息触发SPI分配请求,使分配的SPI值为0,然后触发状态删除操作,最终在系统遍历byspi链表时导致内核崩溃或任意代码执行。