CVE-2026-89548
massUse-After-Free in Linux Kernel SUNRPC Cache Teardown
A use-after-free exists in the Linux kernel's SUNRPC subsystem, in sunrpc_destroy_cache_detail(), because the routine only cancels the global cache_cleaner delayed work when cache_list is empty — a condition never met during per-network-namespace teardown since init_net's caches remain registered. After the cache_detail is unlinked and subsequently freed by cache_destroy_net(), an in-flight cache_clean() can still hold a dangling pointer, causing cache_dequeue() to take cd->queue_lock on freed memory and cache_put() to dereference a function pointer from freed slab. The bug is triggered when a network namespace using SUNRPC caches (for example on NFS/RPC-enabled systems, notably container hosts) is torn down while the cleaner work is pending or running, and a local low-privileged attacker who can influence that timing could gain kernel-level code execution or crash the host, with CVSS 3.1 rating 7.8 (high; AV:L/AC:L/PR:L, high impact on confidentiality, integrity, and availability). Any Linux system running a kernel with the unfixed code and using per-netns SUNRPC caches is affected. No public proof of concept is known and the issue is not listed in CISA's KEV, so exploitation status is none known.
What to do: Apply your distribution's kernel update once it ships the fix (the patch making cancel_delayed_work_sync() unconditional in sunrpc_destroy_cache_detail()) and reboot into the patched kernel. Prioritize multi-tenant container and NFS-serving hosts, since network namespace teardown is the trigger path and a successful exploit yields kernel-level privileges. In the interim, restrict local untrusted user access and monitor for crashes or anomalies in RPC/cache kernel threads during container or netns teardown.
| Linux kernel (SUNRPC cache subsystem) | — |
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: SUNRPC: always drain cache_cleaner before destroying a cache_detail sunrpc_destroy_cache_detail() only cancels the global cache_cleaner delayed_work when cache_list is empty. During per-netns teardown cache_list is never empty because init_net's caches remain registered, so the cancel never fires. After unlink, the caller proceeds to cache_destroy_net() which kfrees the cache_detail while cache_clean() may still hold a dangling pointer to it. The result is a use-after-free: cache_dequeue() takes cd->queue_lock on freed memory, and cache_put() dereferences cd->cache_put as a function pointer from freed slab. Drop the list_empty guard so that cancel_delayed_work_sync() always runs, ensuring any in-flight cache_clean() completes before the cache_detail is freed. Re-arm the cleaner afterwards if other caches are still registered.
- Vector
- CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
In the news0 stories
No ingested article mentions this CVE yet.