CVE-2025-71090CVE-2025-71090是Linux内核nfsd模块中的一个引用计数泄漏漏洞,CVSS评分5.5,属于中危级别。该漏洞存在于nfsd4_add_rdaccess_to_wrdeleg()函数中,当处理NFSv4读写委托时,如果客户端已经拥有一个READ共享访问的OPEN操作,函数会无条件地覆盖fp->fi_fds[O_RDONLY]而不释放原有引用,导致内存泄漏。此外,该函数在fi_fds[O_RDONLY]和fi_rdeleg_file中存储同一个nfsd_file指针但仅增加一次引用计数,在释放 delegation时由于引用计数管理不当,导致nfsd_file引用永远无法被正确释放。服务器关闭时,这些泄漏会导致__nfsd_file_cache_purge()遇到引用计数异常的文件对象,最终触发kmem_cache_destroy()中的BUG(),造成系统崩溃。该漏洞需要本地低权限认证即可触发,无需用户交互。
该漏洞的根本原因在于nfsd4_add_rdaccess_to_wrdeleg()函数的引用计数管理逻辑存在缺陷。当函数被调用添加读访问权限到写委托时,它会无条件地执行fp->fi_fds[O_RDONLY] = nfsd_file_acquire(...)操作。如果客户端之前已经通过OPEN操作获取了该文件的READ共享访问权限,这个赋值操作会直接覆盖已有的nfsd_file指针,而不会先调用nfs4_file_put_access()释放旧引用,造成引用泄漏。
另一个关键问题是nfsd_file指针的引用计数分配不当。函数将同一个nfsd_file指针同时赋值给fp->fi_fds[O_RDONLY]和fp->fi_rdeleg_file,但只执行了一次引用增加操作。当put_deleg_file()执行时,它清除fi_rdeleg_file并调用nfs4_file_put_access()来释放文件。然而,nfs4_file_put_access()只在fi_access[O_RDONLY]计数器归零时才释放fi_fds[O_RDONLY]。如果文件上存在其他READ open操作(如来自正常OPEN操作的共享访问),该计数器会保持非零状态,导致delegation对应的nfsd_file引用永远无法释放。
这种双重引用计数问题在服务器正常运行时可能不会立即显现,但在服务器关闭时的清理阶段会暴露问题。__nfsd_file_cache_purge()会尝试清理所有缓存的nfsd_file对象,但由于引用计数异常,这些对象无法被正确释放,最终导致kmem_cache_destroy()因缓存中仍存在分配对象而触发BUG(),造成系统崩溃。