Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessGain local access with View permission on module-typed key
-
DeliveryInvoke KEYCTL_DESCRIBE to save key->type->name
-
ExploitRace concurrent module unload (unregister_key_type)
-
ExecutionSecond kvasprintf pass reads freed module memory
-
ImpactKernel page fault/oops or freed-memory disclosure
Vulnerability Assessment
| Exploitation Conditions | Concrete prerequisites: (1) the kernel must provide the relevant key type from a LOADABLE module rather than built-in - the description explicitly cites AF_RXRPC=m - since a built-in (=y) type is never unregistered/freed and cannot trigger the fault; (2) a local attacker must hold at least View permission on a key of that module-provided type to call KEYCTL_DESCRIBE; and (3) a concurrent unregister_key_type() via the module's exit path (af_rxrpc_exit) must occur and win the race against the describing task inside the window between kvasprintf()'s two formatting passes. Limiting factors that reduce realistic risk: exploitation is local only (AV:L), the race window is narrow (AC:H), the triggering module unload is itself a privileged operation not controlled by an unprivileged attacker, and systems that compile the affected key-type modules as built-in are not exposed. |
| Impact | This is a genuine but constrained local kernel issue, not an internet-facing emergency. The CVSS 3.1 vector (AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H, base 7.0) is internally consistent with the description: AV:L reflects that the attacker must call keyctl locally, AC:H reflects the narrow race window between kvasprintf()'s two formatting passes and a concurrent module unload, and PR:L reflects that the describing task only needs View permission on the key. The real-world priority signals are modest and non-conflicting: vuln.today assigns 'this_week' (not act_now/emergency), there is no CISA KEV listing, no EPSS score is supplied, and no proof-of-concept or exploit reference is present - only the fix commits. So exploitation status is 'no public exploit identified at time of analysis.' One honest caveat on the vector itself: the vulnerable read occurs in the unprivileged KEYCTL_DESCRIBE path (PR:L is defensible), but reliably WINNING the race depends on a concurrent unregister_key_type()/module unload, which is itself a privileged action (typically CAP_SYS_MODULE) rather than something an unprivileged attacker controls - this makes dependable self-contained exploitation materially harder than PR:L alone suggests. The impact labeling also deserves scrutiny: this is a use-after-free READ of freed module storage, so the realistic outcomes are a kernel oops (availability/DoS, well evidenced by the supplied Oops/page-fault trace) and possible disclosure of freed kernel memory to userspace, rather than memory corruption with integrity impact. Overall: treat as a scheduled kernel-update item, consistent with the 'this_week' label, not a drop-everything issue. |
| Exploit ScenarioDerived | A local user holding View permission on a key whose type is supplied by a loadable module (the description cites a kernel built with AF_RXRPC=m) issues KEYCTL_DESCRIBE; the kasprintf() path saves key->type->name and completes its first formatting pass, then stalls on a GFP_KERNEL allocation. If a concurrent, privileged unload of that module (af_rxrpc_exit → unregister_key_type) retires the key and frees the module during that window, the second formatting pass reads the freed name from released module storage, faulting in string() and oopsing the kernel (or leaking stale freed memory into the userspace describe buffer). No proof-of-concept or exploit code is referenced in the available data, and the high attack complexity reflects this tight timing requirement. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Nov 02, 2026
Local use-after-free in the Linux kernel key-management subsystem: keyctl_describe_key() (KEYCTL_DESCRIBE) passes key->type->name into kasprintf() without holding key->sem, so the retained key reference pins the key but not the module that supplies its type. If a privileged module unload (the description cites af_rxrpc_exit() with AF_RXRPC built as a module, =m) retires the type and free_module() releases the name between the formatter's two allocation-separated passes, the second pass reads freed module storage and faults in string(). Affected are kernels whose key type is provided by a loadable module, where a local user holding at least View permission on such a key races a concurrent module unload; the assessed vector is CVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:N/A:H, reflecting local-only, narrow-window exploitation that can crash the kernel and read stale kernel memory, but not a controllable write. No public exploit code or PoC reference and no CISA KEV entry were reported, and exploitation requires a privileged module unload the unprivileged attacker does not control, so this is not an internet-facing emergency - though the published stable-tree fixes should be picked up this week.
RemediationAI
Upstream fix available (PR/commit); released patched version not independently confirmed. Apply the stable-tree commit matching your kernel branch from the references - 19c4de819e52b7f606468fbfe4fcef4e812e2777, a49e6c9a1a5b3457c946a8efb616ce13b4ca8194, 916667df7695366f23cfaf365b5840b228cc4b2e, dddd3a1ab7d12ee163477918ff6eb943361db4fe, 3c3cfd9e262afc9558c38f8cec57f09d10988546, 6b613747f7ea309ada5b8d05b55398c338f7a968, dea367df18e3a4faac393e3a4e818ee03af89b19 or 0461bc8f91116aae4a020e15f4e1c1fd535ab35e - or take the corresponding vendor kernel update, since the fix makes KEYCTL_DESCRIBE hold key->sem for reading across kasprintf() and fall back to the never-freed key_type_dead name when retirement wins the lock. Where patching must be deferred, the exposure is configuration-dependent: building the affected key-type providers such as AF_RXRPC into the kernel (=y) rather than as loadable modules removes the unregister/free path that triggers the fault, at the cost of a larger kernel image and no ability to reload or unload the protocol code at runtime. Restricting CAP_SYS_MODULE to the smallest possible set of administrators raises the bar for the concurrent unload the race requires, but does not fix the underlying use-after-free and leaves the window open for any privileged actor. Tightening which local users hold View permission on keys of module-backed types reduces the number of tasks that can reach KEYCTL_DESCRIBE, though it is only a partial reduction because the bug still exists for any permitted caller. System owners on configurations that compile the affected key types as built-in are not exposed, per the assessed prerequisites.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
The flaw sits in the kernel keyring infrastructure: a key object carries a reference to its key_type, and key_type->name is a string owned by whichever module registered the type via register_key_type(). keyctl_describe_key() builds the /proc-style description with kasprintf(), which is implemented on top of kvasprintf(); that helper performs two formatting passes over the saved argument list with a GFP_KERNEL allocation in between, so the pointer to key->type->name must remain valid across both passes. Holding a reference on the key keeps the key and its payload alive but does not pin the type's owning module, and the existing code did not take key->sem around the formatting call - the trigger is not a generic heap bug but specifically this missing lock, as the description states. When unregister_key_type() runs from the module's exit path, it removes the type from the registry and waits on key_gc_keytype(); the collector takes key->sem for writing, retypes the retained key to the core key_type_dead and completes retirement, after which free_module() can release the type and its name. The queued formatter then resumes its second pass and dereferences released module storage, producing the reported supervisor read page fault in string() via vsnprintf(). The upstream remediation holds key->sem for reading across kasprintf() and releases it immediately afterwards, including on the allocation-failure path and before copying to userspace; if retirement wins the lock first, formatting falls back to the core key_type_dead name, which is never freed. No CWE identifier was supplied with the record, but the root cause class is a race-condition use-after-free of module-owned memory.
Know when the next one hits your stack
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H
Local keyctl call (AV:L) needing only View permission (PR:L) but a narrow race against module unload (AC:H); read-only UAF leaks freed kernel memory (C:H) and oopses the kernel (A:H), with no write, so I:N.
Primary rating from Vendor (Linux).
CVSS VectorVendor: Linux
Lifecycle Timeline
2DescriptionCVE.org
In the Linux kernel, the following vulnerability has been resolved:
keys: Protect the type name while describing a key
keyctl_describe_key() must keep the key type's name alive until kasprintf() has consumed it. The retained key reference keeps the key and its description alive, but does not pin the module providing its type. The name is passed to kasprintf() without holding key->sem.
kvasprintf() uses the saved name pointer in two formatting passes, with a GFP_KERNEL allocation between them. With AF_RXRPC=m, a task that passes View permission before type retirement can overlap a privileged module unload in this order:
- KEYCTL_DESCRIBE looks up the key, saves key->type->name in the
kasprintf() arguments and completes the first formatting pass.
- While the formatter is delayed before its second pass,
af_rxrpc_exit() calls unregister_key_type(), which removes the type from the registry and waits for key_gc_keytype().
- The collector takes key->sem for writing, retypes the retained key
to key_type_dead and completes retirement. Unregistration and module exit return, allowing free_module() to release the type and name.
- The formatter resumes its second pass and reads the saved name from
released module storage, which can fault in string().
Hold key->sem for reading across kasprintf(). The collector then cannot retype the key or complete retirement until both formatting passes have finished. If retirement wins the lock first, formatting uses the core key_type_dead name instead. Release the semaphore immediately after kasprintf(), including on allocation failure, before copying to userspace.
Oops report as below:
BUG: unable to handle page fault for address: fffffbfff8054794 #PF: supervisor read access in kernel mode #PF: error_code(0x0000) - not-present page RIP: 0010:string+0x23f/0x470 Call Trace: vsnprintf+0x330/0x1110
Articles & Coverage 1
Executive ViewAI
A high-severity local use-after-free flaw in the Linux kernel's key-management subsystem (CVE-2026-99224) can allow an authenticated local user to crash affected systems or read stale kernel memory by racing a privileged module unload. This primarily impacts Linux servers and workstations where kernel key types are provided by loadable modules, such as AF_RXRPC, potentially causing availability disruptions. While exploitation requires local access and precise timing, leadership should prioritize mitigations for critical infrastructure.
No vendor-released patch identified at time of analysis. Interim mitigations: restrict local access to trusted users, blacklist the af_rxrpc module if not required, monitor for unusual kernel crashes or module unload events, and enforce strict least-privilege policies to limit unprivileged key operations.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.
EUVD-2026-115266
GHSA-hcgw-fq49-4f77
NVD
CVE.org
Exploit-DB