HIGH Introduced in 6.19
nstree NamespaceRef Race
CVE-2026-97971
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
KernelScan AI5.1MEDIUM
01Description
In the Linux kernel, the following vulnerability has been resolved: nstree: check listing permission before taking a namespace reference legitimize_ns() takes a reference on the candidate namespace before may_list_ns() has decided whether the caller may see it. The __free(ns_put) cleanup on the denied path can drop the last reference to a mount namespace while we still hold the rcu read lock, and put_mnt_ns() may sleep there. This is the same problem commit 2ec2aff3c8e2 ("ns: make sure reference are dropped outside of rcu lock") fixed for the put_user() path. Neither ns_requested() nor may_list_ns() needs a reference, both only look at the namespace type and at the caller's own namespaces, so do the checks first and take the reference last. Splat: Voluntary context switch within RCU read-side critical section! WARNING: kernel/rcu/tree_plugin.h:332 at rcu_note_context_switch+0x238/0x2a0, CPU#5: a/3442 CPU: 5 UID: 1000 PID: 3442 Comm: a Not tainted 7.0.0-30-generic #30-Ubuntu PREEMPT(lazy) RIP: 0010:rcu_note_context_switch+0x238/0x2a0 Call Trace: <TASK> __schedule+0xcf/0x650 schedule+0x27/0x90 schedule_preempt_disabled+0x15/0x30 __mutex_lock.constprop.0+0x550/0xaf0 __mutex_lock_slowpath+0x13/0x20 mutex_lock+0x3b/0x50 exp_funnel_lock+0xb2/0x260 synchronize_rcu_expedited+0xe7/0x220 namespace_unlock+0x26a/0x320 put_mnt_ns+0xd3/0x120 mntns_put+0xe/0x20 do_listns+0x13e/0x560 __do_sys_listns+0x126/0x2d0 __x64_sys_listns+0x20/0x30 x64_sys_call+0x2366/0x2390 do_syscall_64+0x105/0x5a0 entry_SYSCALL_64_after_hwframe+0x76/0x7e </TASK>
02KernelScan AI Analysis
Risk summary
An unprivileged local user can trigger a kernel deadlock by exploiting a race condition in the listns() syscall's namespace iteration logic. The bug causes a sleeping operation to execute within an RCU read-side critical section, which can hang the system on non-preemptible kernels. Systems running kernel 6.19 or later with the listns() syscall are affected.
Vulnerability analysis
The listns() syscall's namespace iteration takes a reference on a candidate namespace before checking whether the caller has permission to see it. When permission is denied, the reference is dropped, and if this happens to be the last reference to a mount namespace, the cleanup path calls a function that can sleep — all while still holding an RCU read lock, which prohibits sleeping. This can deadlock the kernel on non-preemptible configurations and trigger warnings or potential further issues on preemptible kernels. The fix reorders the operations so that permission checks happen first (they don't need a reference), and the reference is only taken after all checks pass. The listns() syscall is available to unprivileged local users, and the conditions to trigger the bug can be created using user namespaces, though winning the race requires timing the namespace teardown to coincide with the listns() iteration.
Lifecycle
03Fix Versions
| Branch | Introduced | Fixed in | Patch commit |
|---|---|---|---|
| 7.2 | 6.19 | 7.2.7 | 9e673bf5d88a |
| mainline | 6.19 | 7.3 | 56ea4e86832d |