{"id":"CVE-2026-89692","state":"PUBLISHED","title":"nfsd: clear CALLBACK_RUNNING on failed delegation recall queue","description":"In the Linux kernel, the following vulnerability has been resolved:\n\nnfsd: clear CALLBACK_RUNNING on failed delegation recall queue\n\nnfsd_break_one_deleg() sets NFSD4_CALLBACK_RUNNING via test_and_set_bit\nat entry to serialize recall work, then calls nfsd4_run_cb() to queue\nthe recall.  When the queue attempt fails the refcount bump is undone,\nbut the RUNNING bit is left set.  The only site that clears the bit is\nnfsd41_destroy_cb() (fs/nfsd/nfs4callback.c), which runs from the\nworkqueue and is therefore unreachable when nothing was queued.\n\nThe bit becomes a permanent latch on dp->dl_recall.cb_flags: every\nsubsequent break_lease() on the same delegation hits the early-return\nguard in nfsd_break_one_deleg() and silently skips the recall, so the\ndelegation is never broken and the conflicting open or lock stalls.\n\nFix by clearing NFSD4_CALLBACK_RUNNING on the !queued branch alongside\nthe refcount_dec.","publishedAt":"2026-09-11T19:46:12.040Z","updatedAt":"2026-10-19T08:51:05.555Z","severity":{"score":7.5,"label":"High","version":"3.1","vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H","source":"Linux"},"assigner":"Linux","products":["Linux Linux"],"affected":[{"vendor":"Linux","product":"Linux","defaultStatus":"unaffected","versions":[{"version":"1054e8ffc5c492f341bdf1888b882f1d163dd3d8","status":"affected","lessThan":"b137930ee52e3ef38915a3511d4c070463b63a32","versionType":"git"},{"version":"1054e8ffc5c492f341bdf1888b882f1d163dd3d8","status":"affected","lessThan":"cb2d0c4d1b3d301d042ed61365eaa8cb0141a254","versionType":"git"},{"version":"1054e8ffc5c492f341bdf1888b882f1d163dd3d8","status":"affected","lessThan":"b036727d334b1b7cd4c1f1fba3b59ba93a6bbe96","versionType":"git"}],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["fs/nfsd/nfs4state.c"]},{"vendor":"Linux","product":"Linux","defaultStatus":"affected","versions":[{"version":"6.15","status":"affected"},{"version":"0","status":"unaffected","lessThan":"6.15","versionType":"semver"},{"version":"6.18.50","status":"unaffected","lessThanOrEqual":"6.18.*","versionType":"semver"},{"version":"7.2.4","status":"unaffected","lessThanOrEqual":"7.2.*","versionType":"semver"},{"version":"7.3","status":"unaffected","lessThanOrEqual":"*","versionType":"original_commit_for_fix"}],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["fs/nfsd/nfs4state.c"]}],"references":["https://git.kernel.org/stable/c/b137930ee52e3ef38915a3511d4c070463b63a32","https://git.kernel.org/stable/c/cb2d0c4d1b3d301d042ed61365eaa8cb0141a254","https://git.kernel.org/stable/c/b036727d334b1b7cd4c1f1fba3b59ba93a6bbe96"],"weaknesses":[],"ingestedAt":"2026-10-29T20:13:26.108Z","source":{"repository":"CVEProject/cvelistV5","path":"cves/2026/89xxx/CVE-2026-89692.json","commit":"556c9d3a8cd17e218bb8e452ba7cd619a384ff47"},"raw":{"dataType":"CVE_RECORD","dataVersion":"5.2","cveMetadata":{"cveId":"CVE-2026-89692","state":"PUBLISHED","datePublished":"2026-09-11T19:46:12.040Z","dateUpdated":"2026-10-19T08:51:05.555Z","assignerShortName":"Linux","assignerOrgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","dateReserved":"2026-09-11T19:38:34.749Z"},"containers":{"cna":{"title":"nfsd: clear CALLBACK_RUNNING on failed delegation recall queue","descriptions":[{"lang":"en","value":"In the Linux kernel, the following vulnerability has been resolved:\n\nnfsd: clear CALLBACK_RUNNING on failed delegation recall queue\n\nnfsd_break_one_deleg() sets NFSD4_CALLBACK_RUNNING via test_and_set_bit\nat entry to serialize recall work, then calls nfsd4_run_cb() to queue\nthe recall.  When the queue attempt fails the refcount bump is undone,\nbut the RUNNING bit is left set.  The only site that clears the bit is\nnfsd41_destroy_cb() (fs/nfsd/nfs4callback.c), which runs from the\nworkqueue and is therefore unreachable when nothing was queued.\n\nThe bit becomes a permanent latch on dp->dl_recall.cb_flags: every\nsubsequent break_lease() on the same delegation hits the early-return\nguard in nfsd_break_one_deleg() and silently skips the recall, so the\ndelegation is never broken and the conflicting open or lock stalls.\n\nFix by clearing NFSD4_CALLBACK_RUNNING on the !queued branch alongside\nthe refcount_dec."}],"affected":[{"vendor":"Linux","product":"Linux","defaultStatus":"unaffected","versions":[{"version":"1054e8ffc5c492f341bdf1888b882f1d163dd3d8","status":"affected","lessThan":"b137930ee52e3ef38915a3511d4c070463b63a32","versionType":"git"},{"version":"1054e8ffc5c492f341bdf1888b882f1d163dd3d8","status":"affected","lessThan":"cb2d0c4d1b3d301d042ed61365eaa8cb0141a254","versionType":"git"},{"version":"1054e8ffc5c492f341bdf1888b882f1d163dd3d8","status":"affected","lessThan":"b036727d334b1b7cd4c1f1fba3b59ba93a6bbe96","versionType":"git"}],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["fs/nfsd/nfs4state.c"]},{"vendor":"Linux","product":"Linux","defaultStatus":"affected","versions":[{"version":"6.15","status":"affected"},{"version":"0","status":"unaffected","lessThan":"6.15","versionType":"semver"},{"version":"6.18.50","status":"unaffected","lessThanOrEqual":"6.18.*","versionType":"semver"},{"version":"7.2.4","status":"unaffected","lessThanOrEqual":"7.2.*","versionType":"semver"},{"version":"7.3","status":"unaffected","lessThanOrEqual":"*","versionType":"original_commit_for_fix"}],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["fs/nfsd/nfs4state.c"]}],"references":[{"url":"https://git.kernel.org/stable/c/b137930ee52e3ef38915a3511d4c070463b63a32"},{"url":"https://git.kernel.org/stable/c/cb2d0c4d1b3d301d042ed61365eaa8cb0141a254"},{"url":"https://git.kernel.org/stable/c/b036727d334b1b7cd4c1f1fba3b59ba93a6bbe96"}],"metrics":[{"cvssV3_1":{"version":"3.1","vectorString":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H","baseScore":7.5,"baseSeverity":"HIGH"},"scenarios":[{"lang":"en","value":"AV:N - nfsd_break_one_deleg() runs in in-kernel nfsd (fs/nfsd/nfs4state.c) and is reached over TCP/2049 via svc_process to nfsd_dispatch to nfsd4_proc_compound: a remote NFSv4 OPEN grants a delegation, then a conflicting OPEN hits nfsd_file_acquire/nfsd_open_break_lease to __break_lease to nfsd_break_deleg_cb().\nAC:L - The attacker drives both sides with two NFSv4 clients: one holds the delegation while the other sends conflicting OPEN/LOCK/SETATTR to invoke nfsd_break_one_deleg(), and can DESTROY_CLIENTID or flap the backchannel so queue_work() fails; the sequence is retryable and needs no uninfluenced memory layout.\nPR:N - Default AUTH_SYS/AUTH_NULL nfsd exports do not cryptographically verify RPC credentials; any host allowed by the export can EXCHANGE_ID/SETCLIENTID, OPEN to receive a delegation, and issue a conflicting OPEN with no local Linux account or capability.\nUI:N - The attacking NFS clients send the OPEN, conflicting OPEN, and optional DESTROY_CLIENTID RPCs themselves; no victim user on the NFS server must mount a filesystem, open a file, or otherwise interact at attack time.\nS:U - The latched NFSD4_CALLBACK_RUNNING bit and stalled lease-break live in kernel nfsd/VFS state on the NFS server; this is not a VM, IOMMU, or sandbox boundary crossing.\nC:N - The bug only leaves NFSD4_CALLBACK_RUNNING set so later recalls are skipped; it does not read attacker-inaccessible kernel memory, leak pointers, or return extra data to the client.\nI:N - There is no use-after-free, out-of-bounds write, or other memory corruption, and conflicting writers are blocked rather than committing unauthorized file changes, so integrity is unaffected.\nA:H - When nfsd4_run_cb() fails, RUNNING stays set, later break_lease() skips CB_RECALL, nfsd4_cb_recall_prepare never queues the delegation on del_recall_lru, and fl_break_time is zeroed so VFS will not expire the lease; conflicting opens/locks then stall or retry NFS4ERR_JUKEBOX indefinitely, denying the file and NFS service."}]}],"providerMetadata":{"shortName":"Linux","orgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","dateUpdated":"2026-10-19T08:51:05.555Z"},"cpeApplicability":[{"nodes":[{"operator":"OR","negate":false,"cpeMatch":[{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"6.15","versionEndExcluding":"6.18.50"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"6.15","versionEndExcluding":"7.2.4"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"6.15","versionEndExcluding":"7.3"}]}]}],"x_generator":{"engine":"bippy-1.2.0"}}}}}