ZeroHour

CVE-2026-89547

mass

Unchecked percpu counter allocation in Linux kernel SUNRPC (nfsd/lockd) service setup

CVSS 3.1
8.1 high
EPSS
Published
()
Modified
AI analysis

The Linux kernel's SUNRPC layer fails to check the return value of percpu_counter_init() when __svc_create() sets up per-pool statistics counters for RPC server services such as nfsd, lockd, and the NFS callback service. If the per-CPU allocation fails (realistically only under severe memory pressure or fault injection), a half-initialized svc_serv is returned with a NULL backing pointer, and subsequent hot-path increments in svc_xprt_enqueue(), svc_handle_xprt(), and svc_pool_wake_idle_thread() silently corrupt memory at offset zero of the current CPU's per-CPU area rather than faulting; reads of /proc/fs/nfsd/pool_stats return garbage and lockdep/debug builds splat on the uninitialized lock. Reaching the broken state requires a local administrator to trigger an allocation failure during service startup, so a remote peer cannot induce it on its own, which sharply limits the practical security impact despite the nominal 8.1 CVSS score. Affected systems are any hosts running an unfixed kernel that use kernel RPC server functionality (notably NFS servers). No public proof of concept exists, the issue is not in the CISA KEV catalog, and no exploitation is known.

What to do: Apply kernel updates that include the fix once your distribution ships it; there is no urgent remote exposure since the bad state cannot be induced by a network peer. Monitor NFS servers for symptoms of the corruption, such as nonsense values in /proc/fs/nfsd/pool_stats or lockdep/CONFIG_DEBUG_SPINLOCK splats on uninitialized locks in the SUNRPC paths. Because triggering requires local root plus memory pressure, treat this as a stability-and-integrity fix for normal patch cadence rather than an emergency out-of-band upgrade.

Affected
Linux kernel (SUNRPC svc pool statistics in __svc_create__, used by nfsd, lockd, and the NFS callback service)
Estimated exposure
massPotentially millions of systems (any Linux host running an unfixed kernel with nfsd/lockd/NFS callback enabled) — Linux is deployed on the overwhelming majority of servers and the SUNRPC/NFS server code ships in standard distro kernels, so the vulnerable code path is present at massive scale, though the practical attack surface is confined to…

Order-of-magnitude estimate by the model from install counts, market share and public scan data it knows; verify before quoting.

Description

In the Linux kernel, the following vulnerability has been resolved: SUNRPC: Check svc pool percpu counter allocation __svc_create() initializes three per-pool percpu_counter stats and ignores every return value. On SMP, percpu_counter_init() fails when __alloc_percpu_gfp() cannot satisfy the allocation, leaving the failed counter with fbc->counters == NULL and its embedded raw_spinlock_t, list_head, and count never initialized. __svc_create() returns the half-constructed svc_serv to nfsd, lockd, or the NFS callback service anyway. Once that service is live, the hot-path increments in svc_xprt_enqueue(), svc_handle_xprt(), and svc_pool_wake_idle_thread() reach a counter whose backing pointer is NULL. The pointer is a per-cpu offset, so the access does not fault: it resolves to offset zero of the current CPU's per-cpu area and silently corrupts whatever variable lives there. A /proc/fs/nfsd/pool_stats read walks the same NULL per-cpu storage and returns garbage, and on CONFIG_DEBUG_SPINLOCK or lockdep it splats on the never-initialized lock. Creating the broken service requires a percpu allocation failure during RPC server startup, so it is reachable only by a local administrator under memory pressure or fault injection; a remote peer cannot induce the bad state on its own. Check each percpu_counter_init() return value in __svc_create() and fail when an allocation fails, unwinding the counters already set up in the current pool and in every pool initialized before it. A discrete percpu_counter_destroy() per counter at teardown frees each per-cpu allocation exactly once.

Vector
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H

In the news

No ingested article mentions this CVE yet.