Skip to main content

Linux Kernel CVE-2026-89762

| EUVDEUVD-2026-76674 HIGH
2026-09-11 Linux GHSA-p69h-p269-mrvc
7.8
CVSS 3.1 · Vendor: Linux
Share

Severity by source

Vendor (Linux) PRIMARY
7.8 HIGH
AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
vuln.today AI
7.0 HIGH

AC:H reflects the required conjunction of AppArmor enforcing, active profile, and concurrent profile-management timing; PR:L for unprivileged local process; C/I/A:H for UAF with privilege escalation potential.

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

Primary rating from Vendor (Linux).

CVSS VectorVendor: Linux

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

Lifecycle Timeline

6
Metadata Corrected
Sep 13, 2026 - 10:40 vuln.today
tag: Information Disclosure removed
Analysis Generated
Sep 13, 2026 - 10:23 vuln.today
CVSS changed
Sep 13, 2026 - 07:22 NVD
7.8 (HIGH)
Patch available
Sep 11, 2026 - 21:18 EUVD
CVE Published
Sep 11, 2026 - 19:47 cve.org
HIGH 7.8
CVE Published
Sep 11, 2026 - 19:47 cve.org
UNKNOWN (no severity yet)

DescriptionCVE.org

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

apparmor: fix cred UAF caused by begin_current_label_crit_section()

AppArmor's begin_current_label_crit_section() is a scary function called from lots of LSM hooks (in particular VFS/socket-related ones) that checks if the label referenced by the current creds is marked FLAG_STALE, and if so, attempts to use aa_replace_current_label() to replace the creds with an updated version that uses a new label.

The first problem with this is that it would directly lead to UAF of struct cred if anything in the kernel takes a pointer to the current creds and accesses these past a security hook invocation that replaces creds, like so:

const struct cred *cred = current_cred();
alloc_file_pseudo(...);
uid_t uid = cred->euid;

I don't know if anything in the kernel actually does this, but I think it is very surprising that this pattern could lead to UAF.

The second problem is that things go wrong when aa_replace_current_label() runs with overridden credentials. aa_replace_current_label() bails out if current_cred() != current_real_cred() (mirroring the check in proc_pid_attr_write()), but this check can't actually reliably detect overridden credentials because the overridden creds can be the same as the objective creds.

So in approximately the following scenario, things go wrong:

  1. task begins with <creds A> (as both objective and subjective creds),

with refcount=2

  1. task grabs an extra reference on <creds A> for overriding
  2. task calls override_creds(<creds A>), which returns a pointer to the old

subjective creds (<creds A>)

  1. task enters AppArmor LSM hook
  2. AppArmor checks that objective/subjective creds are equal
  3. AppArmor replaces both cred pointers with <creds B> and drops 2 refs on

<creds A>

  1. task leaves AppArmor LSM hook
  2. task calls revert_creds(<creds A>)
  3. now task->cred is <creds A> while task->real_cred is <creds B>, but the

task_struct logically holds two references to <creds B>

  1. another task drops the extra reference on <creds A> that was used for

overriding, refcount drops to 0

  1. now task->real_cred points to freed creds

At this point, any access to current_cred() will be UAF.

I have a test case where I run aa-disable on a profile while a process using that profile is blocked on splice() from a FUSE passthrough file into a full pipe; after the profile update, the pipe becomes empty, splice() resumes, the credentials go out of sync, and a subsequent getuid() syscall results in a KASAN UAF splat.

To fix this, instead of directly replacing creds, do it via task_work that will run at the end of the current syscall. (The point in time at which the cred replacement happens should have no correctness impact; it is just a performance optimization to avoid unnecessarily touching the refcount of the new label.)

Note that AppArmor still performs direct cred replacements in the sb_pivotroot LSM hook after this change, and that direct cred replacements can still happen in VFS ->write() callbacks via proc_pid_attr_write().

There are two options for what to do with aa_dup_task_ctx(): Either explicitly reset new->label_replacement_pending after the entire aa_task_ctx has been copied, or switch to manually copying members over. I am switching to manually copying members over because that should make bugs more obvious.

AnalysisAI

AppArmor's begin_current_label_crit_section() in the Linux kernel contains a use-after-free of struct cred that can be triggered on systems with active AppArmor profiles when those profiles are updated or disabled mid-syscall. The flaw arises from synchronous credential replacement inside LSM hooks: the override_creds() guard in aa_replace_current_label() fails to detect when overridden and objective credentials are the same object, causing two reference drops that free the struct cred while task_struct still holds a pointer to it. …

Unlock full vulnerability intelligence

  • Risk assessment & exploitation conditions
  • Attack chain visualization
  • Remediation with exact patch versions
  • Threat intelligence from 22 sources
  • Personal watchlist & email alerts

Free forever · No credit card required

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata

Recon
technique details hidden
Delivery
technique details hidden
Exploit
technique details hidden
Install
technique details hidden
C2
technique details hidden
Execute
technique details hidden
Impact
technique details hidden

Vulnerability AssessmentAI

Exploitation Exploitation requires all of the following: AppArmor compiled into the kernel and in enforcing mode (default on Ubuntu, Debian, openSUSE; not present by default on RHEL/Fedora using SELinux); the target process must be running under an active, enforcing AppArmor profile; a privileged user (root or CAP_MAC_ADMIN) must simultaneously update, reload, or disable that profile using aa-disable or apparmor_parser -r, creating a FLAG_STALE label; and the target process must be mid-execution in a syscall path that invokes an AppArmor LSM hook inside an override_creds() context where the overriding credentials are identical to the objective credentials. … Additional conditions and limiting factors are described in the full assessment.
Risk Assessment The vendor-assigned CVSS 7.8 (AV:L/AC:L/PR:L) overstates attack complexity: successfully triggering the UAF requires AppArmor to be compiled in and enforcing, the target process to be confined under an active profile, a privileged administrator to concurrently reload or disable that profile (creating FLAG_STALE), and the process to be inside a specific syscall path involving override_creds() with identical credential objects - a narrow and timing-sensitive intersection of conditions that justifies AC:H over AC:L. … Full risk analysis with EPSS, KEV, and SSVC signal comparison available after sign-in.
Exploit Scenario Full exploit scenario with step-by-step reproduction available after sign-in.
Remediation Update the Linux kernel to a patched stable release: 6.12.109, 6.18.50, 7.2.4, or apply the 7.3-rc1 mainline fix. … Detailed patch versions, workarounds, and compensating controls in full report.

Recommended ActionAI

Within 24 hours, audit your Linux infrastructure to identify systems with AppArmor enabled (check /sys/module/apparmor or aa-status output) and assess which are business-critical. …

Sign in for detailed remediation steps and compensating controls.

Threat intelligence, references, and detailed analysis are available after sign-in.

Share

CVE-2026-89762 vulnerability details – vuln.today

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