Cloudanix VulnDB

CVE-2026-89663

High · 8.8

CVSS

8.8

EPSS

0.5%

Published

Sep 11, 2026

CISA due date

—

Cloudanix analysis

Next patch cycle SSVC: Track

A bug in the Linux kernel's file-sharing server can let attackers crash the machine or take it over completely if they already have permission to connect.

Exploitation
Remote Authenticated
Attacker needs
Low Privilege
Complexity
Moderate
Impact
Full Compromise
Component
OS kernel
Class
Use After Free
Remediation
Upgrade
Effort
Medium
Patch risk
Low

What it actually does

Use-after-free in nfsd copy-notify stateid handling: concurrent revoke paths and reference holders can cause _free_cpntf_state_locked to drop the final reference without unlinking from the IDR and sc_cp_list, allowing a later reader to dereference a freed object at nfs4_put_cpntf_state.

Why it matters to the business

Remote attackers with NFS access can crash kernel NFS servers or potentially execute code, leading to denial of service or full host compromise on affected Red Hat systems until patched; high urgency for internet-facing or multi-tenant NFS deployments given the 43-day window since disclosure.

How an attack unfolds

An attacker with valid NFSv4 credentials triggers concurrent operations on copy-notify stateids (OFFLOAD_CANCEL, parent drain, or laundromat expiry) while a reader holds an elevated reference, causing the revoke path to free the object without unhashing; subsequent use by the reader produces a KASAN-detectable UAF that can be turned into arbitrary read/write or control-flow hijack.

How to fix it

Upgrade to the fixed Red Hat kernels: kernel (redhat el10) 6.12.0-211.64.1.el10_2 or kernel (redhat el9) 5.14.0-687.56.1.el9_8 (both via RHSA-2026:77689). Reboot after installation; no configuration changes required.

How to confirm the fix worked

Confirm the running kernel version matches or exceeds the listed fixed packages; run `uname -r` and `rpm -q kernel` and verify against the RHSA advisory. Re-scan with KASAN-enabled debug kernels or static analysis tools to ensure the revoke paths now always unlink before final reference drop.

Typical attack path

  1. Obtain valid NFSv4 mount credentials or session
  2. Issue NFS copy operations that allocate copy-notify stateids
  3. Trigger concurrent revoke paths (OFFLOAD_CANCEL, drain, or expiry) while holding references
  4. Force the UAF dereference in nfs4_put_cpntf_state to corrupt kernel memory or hijack execution

How to detect it

Search kernel logs for KASAN reports mentioning nfs4_put_cpntf_state or use-after-free in nfsd stateid paths; correlate with NFSv4 copy-related operations in auditd or system call traces around the time of any unexpected NFS server restarts or panics.

What your security team should do

  • Immediately schedule kernel updates for all Red Hat NFS servers using the exact fixed versions provided
  • Prioritize systems reachable from untrusted networks or serving multi-tenant workloads
  • Enable kernel lockdown and SELinux enforcing mode as defense-in-depth until patches are applied
  • Monitor Red Hat security feeds for any follow-on advisories or backports

The record

In the Linux kernel, the following vulnerability has been resolved: nfsd: revoke copy-notify stateids before dropping their reference Copy-notify stateids live in the s2s_cp_stateids IDR and on their parent stid's sc_cp_list, pinned by a single membership reference. _free_cpntf_state_locked() only unlinks an entry once its refcount reaches zero, so any revoke path that runs while a concurrent find_cpntf_state()/manage_cpntf_state() holder has elevated cs_count drops the reference without unlinking, leaving the entry discoverable with its membership reference already consumed. A second revoke or a laundromat tick then frees it while the reader still holds the pointer -- a KASAN-detectable use-after-free at the reader's nfs4_put_cpntf_state(). This affected all three revoke paths: - The parent-stid drain (nfs4_free_cpntf_statelist()) repeatedly called _free_cpntf_state_locked() on the first list entry; a holder that had bumped cs_count made it return early, so the next iteration re-decremented and burned the holder's reference. - OFFLOAD_CANCEL (manage_cpntf_state()) and laundromat expiry likewise used _free_cpntf_state_locked() and could drop 2->1 without unlinking. Add revoke_cpntf_state_locked(), which unhashes the entry from the IDR and sc_cp_list first (deferring the final free to any holder), and use it from all three revoke paths. The drain now walks with list_for_each_entry_safe() and revokes each entry unconditionally, so it terminates in one pass per entry regardless of cs_count. The unhash is gated on !list_empty(&cps->cp_list); the idr_remove() gate matters because idr_alloc_cyclic() may have recycled the so_id by then. Keep _free_cpntf_state_locked() for the reference-holder put path only, where a concurrent revoke may already have unlinked the entry (its list_del_init() then a no-op).

Affected packages

Ecosystem Package Introduced Fixed