HIGH Introduced in 4.0
nfs Delegation Race
CVE-2026-90234
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
KernelScan AI4.5MEDIUM
01Description
In the Linux kernel, the following vulnerability has been resolved: NFS: Return a delegation the client fails to record When an NFS server grants a delegation in an OPEN reply, nfs_inode_set_delegation() records it on the client. However, three of its error flows return without sending DELEGRETURN. A delegation can be relinquished only by DELEGRETURN (RFC 8881 Section 20.2.4), so dropping one silently leaves the server believing the client still holds it. If the server happens to recall that delegation, the client answers CB_RECALL with NFS4ERR_BADHANDLE because it has no record of the stateid. The server revokes the delegation and moves it onto its cl_revoked list, because the client never sends the FREE_STATEID that would drain it. Every subsequent SEQUENCE reply then carries SEQ4_STATUS_RECALLABLE_STATE_REVOKED, and the client's state manager loops issuing TEST_STATEID across its delegations without ever clearing the condition. The window is easy to reach now that a server offers a write delegation on any write OPEN: a delegation recalled for one opener races a re-open that the server answers with a fresh write delegation. Instead of dropping it, hand the delegation back during these error flows.
02KernelScan AI Analysis
Risk summary
A local user with access to an NFS-mounted filesystem can trigger a race condition that causes the NFS client's state manager to loop indefinitely, hanging all NFS operations on that mount. The bug requires an active NFSv4 mount with delegation support and is triggered by racing a delegation recall against a re-open. Systems relying on NFS for storage availability are most at risk.
Vulnerability analysis
When an NFS server grants a delegation in an OPEN reply, the client's delegation-recording function has several error paths that drop the delegation without notifying the server. Because a delegation can only be relinquished via DELEGRETURN, this silent drop leaves the server believing the client still holds it. If the server later recalls that delegation, the client has no record of it and responds with an error, causing the server to revoke the delegation and permanently flag the client's state as revoked. The client's state manager then loops indefinitely trying to clear the condition, effectively hanging NFS operations. The fix ensures every error path sends DELEGRETURN back to the server before discarding the delegation locally. The trigger is a race between a delegation recall and a re-open that the server answers with a fresh write delegation, reachable by any local user with access to an NFS-mounted filesystem.
Lifecycle
03Fix Versions
| Branch | Introduced | Fixed in | Patch commit |
|---|---|---|---|
| 6.12 | 4.0 | 6.12.114 | fe3b1c8966a2 |
| 6.18 | 4.0 | 6.18.57 | 6822ba1ae9b6 |
| 6.6 | 4.0 | 6.6.160 | 9e71e332fa2c |
| 7.2 | 4.0 | 7.2.6 | 92533e49fe3c |
| mainline | 4.0 | 7.3 | 220af23d8639 |
04CIP Kernels
State of the newest release of each Civil Infrastructure Platform SLTS tree, from CIP's own fix records.
| CIP tree | State |
|---|---|
| cip/6.12 | Affected — no CIP fix yet (latest 6.12.112-cip33) |
| cip/6.1 | Affected — no CIP fix yet (latest 6.1.189-cip61) |
| cip/6.1-rt | Affected — no CIP fix yet (latest 6.1.189-cip61-rt32) |
| cip/5.10 | Affected — no CIP fix yet (latest 5.10.271-cip78) |
| cip/5.10-rt | Affected — no CIP fix yet (latest 5.10.268-cip77-rt34) |
| cip/4.19 | Affected — no CIP fix yet (latest 4.19.325-cip136) |
| cip/4.19-rt | Affected — no CIP fix yet (latest 4.19.325-cip136-rt50) |
| cip/4.4 | Affected — no CIP fix yet (latest 4.4.302-cip115) |
| cip/4.4-rt | Affected — no CIP fix yet (latest 4.4.302-cip115-rt63) |