CVE-2026-89669
largeUnauthenticated Use-After-Free Race in Linux Kernel nfsd COPY_NOTIFY
The Linux kernel's NFS server (nfsd) published its copy-notify stateid via nfs4_alloc_init_cpntf_state() before it was fully initialized and without a reference held for the caller. An unauthenticated remote attacker could send a racing OFFLOAD_CANCEL operation with a crafted cl_id and a guessable so_id to trigger manage_cpntf_state() and free the entry, turning the caller's subsequent stateid reads and writes into a use-after-free in kernel memory. Because the owning clientid was only recorded after publication, no ownership check could block the attacker in that window. Any Linux host acting as an NFSv4.2 server with nfsd reachable by the attacker is affected; successful exploitation of the kernel UAF could yield high impact on confidentiality, integrity, and availability (CVSS 9.8), up to and including code execution or a kernel crash. No public PoC exists and the flaw is not in CISA's KEV, so exploitation is presumed limited, but any network client that can reach the NFS service is a potential attacker since no privileges are required.
What to do: Apply your distribution's kernel update once the fix is backported and reboot (or restart nfsd) to load the patched code. Until then, firewall TCP/2049 so only trusted storage clients and backup/clone servers can reach nfsd, and consider disabling NFSv4.2 server-side copy if it is not required. Review NFS server logs and kernel logs for unexpected OFFLOAD_CANCEL/COPY_NOTIFY activity or oopses in nfsd code paths.
| Linux kernel (nfsd / NFSv4.2 server-to-server copy, nfsd4_copy_notify) | — |
Order-of-magnitude estimate by the model from install counts, market share and public scan data it knows; verify before quoting.
In the Linux kernel, the following vulnerability has been resolved: nfsd: initialize copy-notify stateid before publishing it nfsd4_copy_notify() finished initializing the cpntf state after nfs4_alloc_init_cpntf_state() had already linked it into the s2s_cp_stateids IDR and the parent's sc_cp_list, with cs_count == 1 (the membership reference) and none held for the caller. A racing OFFLOAD_CANCEL (crafted cl_id == nn->s2s_cp_cl_id plus the guessable so_id) could reach manage_cpntf_state() and free the entry, turning the caller's subsequent cpn_cnr_stateid read and cp_p_stateid/cp_p_clid writes into use-after-free. The owning clientid was also only recorded after publication, so it could not gate an ownership check in that window. Record cp_p_stateid and cp_p_clid inside nfs4_alloc_init_cpntf_state() before nfs4_init_cp_state() publishes the entry, and return it with an extra reference. The caller reads the stateid under that reference and drops it with nfs4_put_cpntf_state(); on a late error the laundromat reaps the entry.
- Vector
- CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
In the news0 stories
No ingested article mentions this CVE yet.