Skip to main content

Linux Kernel CVE-2026-31555

| EUVDEUVD-2026-25448 MEDIUM
2026-04-24 Linux GHSA-58x2-94x2-vr83
5.5
CVSS 3.1 · NVD
Share

Severity by source

NVD PRIMARY
5.5 MEDIUM
AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H
vuln.today AI
4.7 MEDIUM

Race condition requires precise concurrent timing across three threads (AC:H); any local user can invoke FUTEX_LOCK_PI without elevation (PR:L); impact is kernel availability only with no confidentiality or integrity exposure.

3.1 AV:L/AC:H/PR:L/UI:N/S:U/C:N/I:N/A:H
4.0 AV:L/AC:L/AT:P/PR:L/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N
SUSE
MEDIUM
qualitative
Red Hat
5.5 MEDIUM
qualitative

Primary rating from NVD.

CVSS VectorNVD

Attack Vector
Local
Attack Complexity
Low
Privileges Required
Low
User Interaction
None
Scope
Unchanged
Confidentiality
None
Integrity
None
Availability
High

Lifecycle Timeline

6
Analysis Generated
Jul 24, 2026 - 03:14 vuln.today
CVSS changed
Apr 27, 2026 - 20:22 NVD
5.5 (MEDIUM)
Patch released
Apr 27, 2026 - 20:14 nvd
Patch available
Patch available
Apr 24, 2026 - 16:16 EUVD
EUVD ID Assigned
Apr 24, 2026 - 15:00 euvd
EUVD-2026-25448
CVE Published
Apr 24, 2026 - 14:35 nvd
MEDIUM 5.5

DescriptionNVD

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

futex: Clear stale exiting pointer in futex_lock_pi() retry path

Fuzzying/stressing futexes triggered:

WARNING: kernel/futex/core.c:825 at wait_for_owner_exiting+0x7a/0x80, CPU#11: futex_lock_pi_s/524

When futex_lock_pi_atomic() sees the owner is exiting, it returns -EBUSY and stores a refcounted task pointer in 'exiting'.

After wait_for_owner_exiting() consumes that reference, the local pointer is never reset to nil. Upon a retry, if futex_lock_pi_atomic() returns a different error, the bogus pointer is passed to wait_for_owner_exiting().

CPU0 CPU1 CPU2 futex_lock_pi(uaddr) // acquires the PI futex exit() futex_cleanup_begin() futex_state = EXITING; futex_lock_pi(uaddr) futex_lock_pi_atomic() attach_to_pi_owner() // observes EXITING *exiting = owner; // takes ref return -EBUSY wait_for_owner_exiting(-EBUSY, owner) put_task_struct(); // drops ref // exiting still points to owner goto retry; futex_lock_pi_atomic() lock_pi_update_atomic() cmpxchg(uaddr) *uaddr ^= WAITERS // whatever // value changed return -EAGAIN; wait_for_owner_exiting(-EAGAIN, exiting) // stale WARN_ON_ONCE(exiting)

Fix this by resetting upon retry, essentially aligning it with requeue_pi.

AnalysisAI

Stale pointer dereference in the Linux kernel's futex Priority Inheritance lock path (futex_lock_pi(), kernel/futex/core.c) exposes systems running affected kernel versions to local denial of service by low-privileged users. The flaw manifests in a three-way race between a PI futex owner exiting, a concurrent FUTEX_LOCK_PI attempt, and a futex value modification - causing a freed task_struct pointer to be re-used on the retry path, violating the wait_for_owner_exiting() invariant and triggering WARN_ON_ONCE. No active exploitation is confirmed (EPSS 0.02% at 7th percentile, not in CISA KEV); vendor-released patches are available across all maintained stable LTS branches.

Technical ContextAI

The Linux futex (fast user-space mutex) subsystem implements Priority Inheritance semantics via futex_lock_pi() in kernel/futex/core.c. When a PI futex owner is observed to be in the EXITING state, futex_lock_pi_atomic() returns -EBUSY and writes a refcounted task_struct pointer into the caller's local 'exiting' variable via attach_to_pi_owner(). The reference is consumed and dropped by wait_for_owner_exiting() via put_task_struct(), but critically the pointer variable is never reset to NULL. If the outer retry loop re-enters futex_lock_pi_atomic() and that call returns -EAGAIN (because a concurrent cmpxchg modified the futex's user-space value, e.g., toggling the WAITERS bit), the stale non-NULL exiting pointer is passed back into wait_for_owner_exiting() with the wrong error code, violating the function's internal invariant that the pointer is NULL for any error other than -EBUSY, and triggering WARN_ON_ONCE(exiting). The root cause class is a stale/dangling pointer within a concurrent race window - analogous to CWE-672 (Operation on Resource after Expiration or Release) - though no CWE is formally assigned. CPE cpe:2.3:a:linux:linux:*:*:*:*:*:*:*:* identifies all affected kernel versions beginning with the commit that introduced the flawed retry path (3ef240eaff36b8119ac9e2ea17cbf41179c930ba) up to the respective fix commits per stable branch.

RemediationAI

Upgrade to a patched Linux kernel: 5.10.253 or later on the 5.10.x LTS branch, 5.15.203 or later on 5.15.x LTS, 6.1.168 or later on 6.1.x LTS, 6.6.131 or later on 6.6.x LTS, 6.12.80 or later on 6.12.x LTS, 6.18.21 or later on 6.18.x, 6.19.11 or later on 6.19.x, or kernel 7.0 and later. Ubuntu users should apply the update from USN-8567-1 (https://ubuntu.com/security/notices/USN-8567-1); Siemens product operators should consult SSA-019113 and SSA-082556. If an immediate kernel upgrade is not feasible, restricting unprivileged access to the futex(2) syscall via seccomp policy (specifically blocking FUTEX_LOCK_PI operations for untrusted workloads) prevents exploitation entirely, though this will break applications relying on PI futex semantics such as certain real-time, multimedia, or POSIX-compliant threading libraries - evaluate compatibility before deploying. Systems that already enforce tight seccomp profiles on untrusted processes (containers, sandboxed environments) have effective compensating controls in place.

Vendor StatusVendor

SUSE

Severity: Medium
Product Status
SUSE Linux Enterprise Desktop 15 SP7 Fixed
SUSE Linux Enterprise Desktop 15 SP7 Fixed
SUSE Linux Enterprise High Availability Extension 15 SP7 Fixed
SUSE Linux Enterprise High Availability Extension 15 SP7 Fixed
SUSE Linux Enterprise High Performance Computing 15 SP7 Fixed

Share

CVE-2026-31555 vulnerability details – vuln.today

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy