CVE-2026-90038 PUBLISHED

NFSD: Prevent client use-after-free during export state revocation

Assigner: Linux
Reserved: 11.09.2026 Published: 16.09.2026 Updated: 16.09.2026

In the Linux kernel, the following vulnerability has been resolved:

NFSD: Prevent client use-after-free during export state revocation

nfsd4_revoke_export_states() has the same use-after-free as nfsd4_revoke_states(): it drops nn->client_lock across revoke_one_stid() and the following read of clp->cl_minorversion, but the stateid reference it holds does not pin the client. A teardown racing the dropped lock can free the client while revoke_one_stid() still dereferences it.

exportfs -u drives this path through NFSD_CMD_UNLOCK_EXPORT, so an administrator removing an export can race a client expiry.

Skip a client that is already expiring and otherwise pin it with cl_rpc_users under client_lock before dropping the lock, matching nfsd4_revoke_states().

Metrics

CVSS Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
CVSS Score: 9.8

AV:N - The UAF is in nfsd nfsd4_revoke_export_states(). A remote NFSv4 peer reaches the racing expire_client() over TCP/2049 via svc_recv to nfsd_dispatch to nfsd4_proc_compound: EXCHANGE_ID/CREATE_SESSION, SETCLIENTID_CONFIRM, or DESTROY_CLIENTID (ALLOWED_WITHOUT_FH), which free nfs4_client while the export-revoke walk still dereferences it. AC:L - The attacker controls the teardown side: they hold many stateids on the export so the revoke walk drops client_lock once per stid, and concurrently retry EXCHANGE_ID/CREATE_SESSION or SETCLIENTID_CONFIRM so mark_client_expired_locked() succeeds while cl_rpc_users is unpinned. The window is retryable and attacker-created. PR:N - EXCHANGE_ID, CREATE_SESSION, SETCLIENTID, SETCLIENTID_CONFIRM, and DESTROY_CLIENTID are ALLOWED_WITHOUT_FH with no export check. Typical AUTH_SYS/AUTH_NULL nfsd deployments do not verify RPC credentials, so any host that can reach TCP/2049 can establish state on an export and trigger expire. UI:N - The attacker drives the NFS compounds that create state and expire the client. Administrative exportfs -u / NFSD_CMD_UNLOCK_EXPORT is a server operational condition (unexport of the last client for a path so the filesystem can be unmounted), not a required victim user action. S:U - The freed object is struct nfs4_client in the NFS server kernel. Impact remains in that kernel security authority; there is no VM, IOMMU, or sandbox boundary crossing. C:H - revoke_one_stid() and the subsequent clp->cl_minorversion read dereference nfs4_client after free_client() kmem_cache_free's the mergeable client_slab object (KMEM_CACHE flags 0). Reclaim via EXCHANGE_ID discloses kernel memory; a UAF is C:H. I:H - revoke_one_stid() takes cl_lock and nfs4_put_stid() does refcount_dec_and_lock/idr_remove on the freed client's cl_lock/cl_stateids, concurrent with __destroy_client(), a slab UAF write primitive for heap corruption and control-flow hijacking. A:H - Use-after-free of nfs4_client in the nfsd export-revoke path oopses or panics the NFS server even without full exploitation, fully denying service of the host.

Product Status

Vendor Linux
Product Linux
Versions Default: unaffected
  • affected from 2eac189bb059d31a29937b29ee0f477394198610 to c05ae58fe06ce2ac34312f649e71c3596bdde358 (excl.)
  • affected from 2eac189bb059d31a29937b29ee0f477394198610 to 2108de53568a64936a0da3e04d85c35df98d3fb6 (excl.)
Vendor Linux
Product Linux
Versions Default: affected
  • Version 7.2 is affected
  • unaffected from 0 to 7.2 (excl.)
  • unaffected from 7.2.5 to 7.2.* (incl.)
  • unaffected from 7.3-rc1 to * (incl.)

References