CVE-2026-89546 PUBLISHED

SUNRPC: close backchannel before destroying callback service

Assigner: Linux
Reserved: 11.09.2026 Published: 11.09.2026 Updated: 13.09.2026

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

SUNRPC: close backchannel before destroying callback service

A backchannel receive can complete a request while the NFS callback service is being torn down. xprt_complete_bc_request() removes the request from bc_pa_list, drops bc_alloc_count, marks the request in use, and then asks xprt_enqueue_bc_request() to hand it to the callback service.

If teardown has already cleared xprt->bc_serv, xprt_enqueue_bc_request() currently returns without enqueueing or freeing the committed request. The xprt_get() taken on entry is leaked as well. If the producer wins the race before bc_serv is cleared, it can also enqueue onto sv_cb_list after nfs_callback_down() has stopped the callback threads, leaving the request linked to a svc_serv that is about to be freed.

Close the producer side before callback threads are stopped. Add xprt_svc_shutdown_bc() to clear xprt->bc_serv under bc_pa_lock, and call it on callback shutdown and callback-start failure before stopping the service threads. Requests that lose the NULL transition in xprt_enqueue_bc_request() are released through the normal backchannel free path after balancing bc_slot_count. Finally, drain any remaining sv_cb_list requests after the callback threads have stopped and before svc_destroy() frees the service.

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 producer is xs_read_stream_call()/rpcrdma_bc_receive_call() handling RPC_CALL messages on the established NFSv4.1+ client TCP or RPC/RDMA transport; a malicious NFS server sends backchannel frames on that connection and reaches the bug without local access. AC:L - The attacker controls both sides of the race: they emit backchannel RPC_CALLs on the still-live xprt and force callback teardown via failed session setup, autofs expiry, or unmount, leaving rpc_rqst objects on sv_cb_list when svc_destroy() frees svc_serv. PR:N - A remote NFS peer needs no account or capability on the victim; backchannel RPC_CALLs are accepted on the connected NFSv4.1+ transport once a mount or mount attempt exists, with no local privileges at exploit time. UI:N - Boot-time, autofs, and Kubernetes NFSv4.1+ mounts are common; after that session exists the attacker drives backchannel traffic and callback teardown without further interactive victim action such as a manual mount. S:U - The use-after-free corrupts the in-kernel nfs_callback svc_serv and rpc_rqst objects on the client host and does not cross a VM, IOMMU, or other security-authority boundary. C:H - A raced enqueue leaves an in-use rpc_rqst linked into a freed svc_serv (sv_cb_list/sv_pools), and unlocked bc_serv readers can follow that dangling pointer, yielding a kernel-heap use-after-free read primitive. I:H - Use-after-free of svc_serv with queued rpc_rqst and svc_pool_wake_idle_thread on dying callback pools enables heap reuse of RPC service control structures, a standard kernel write and control-flow hijack primitive. A:H - svc_destroy() of a callback service that still has live backchannel requests, plus dereference of xprt->bc_serv after free, causes kernel oops or panic; the leak path also orphans rpc_rqst objects and xprt references.

Product Status

Vendor Linux
Product Linux
Versions Default: unaffected
  • affected from 441244d4273a8037b265fd254dfdaca5fa736ee2 to 6debde9e3e6ae21dcca75837b4247b13ca4ea2b8 (excl.)
  • affected from 441244d4273a8037b265fd254dfdaca5fa736ee2 to 3674f780f47d2906b5a0f7199b66973067bdfeca (excl.)
Vendor Linux
Product Linux
Versions Default: affected
  • Version 6.19 is affected
  • unaffected from 0 to 6.19 (excl.)
  • unaffected from 7.2.4 to 7.2.* (incl.)
  • unaffected from 7.3-rc1 to * (incl.)

References