KernelScan.io

HIGH

apparmor Policy Bypass

CVE-2026-23268

CVSS 7.8 / 10.0 NVD

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

KernelScan AI7.8HIGH

01

In the Linux kernel, the following vulnerability has been resolved: apparmor: fix unprivileged local user can do privileged policy management An unprivileged local user can load, replace, and remove profiles by opening the apparmorfs interfaces, via a confused deputy attack, by passing the opened fd to a privileged process, and getting the privileged process to write to the interface. This does require a privileged target that can be manipulated to do the write for the unprivileged process, but once such access is achieved full policy management is possible and all the possible implications that implies: removing confinement, DoS of system or target applications by denying all execution, by-passing the unprivileged user namespace restriction, to exploiting kernel bugs for a local privilege escalation. The policy management interface can not have its permissions simply changed from 0666 to 0600 because non-root processes need to be able to load policy to different policy namespaces. Instead ensure the task writing the interface has privileges that are a subset of the task that opened the interface. This is already done via policy for confined processes, but unconfined can delegate access to the opened fd, by-passing the usual policy check.

02

Engine v0.2.0

Risk summary

An unprivileged local user can manipulate AppArmor security policies by exploiting a confused deputy attack through file descriptor passing to privileged processes. This allows complete bypass of AppArmor confinement, denial of service through policy manipulation, and potential privilege escalation by removing security restrictions.

Affectedsecurity/apparmor/apparmorfs.c (AppArmor LSM)

Vulnerability analysis

The root cause is insufficient privilege validation in AppArmor's policy management interface. When an unprivileged user opens apparmorfs policy files (/sys/kernel/security/apparmor/policy/namespaces/*/load, replace, remove), they can pass the file descriptor to a privileged process and trick it into writing policy changes. The original code only checked privileges at write time, not comparing the writer's privileges against the opener's privileges. The fix adds is_subset_of_obj_privilege() to ensure the writing task's credentials are a subset of the opening task's credentials, preventing privilege escalation through confused deputy attacks. Attack surface is local-only, requiring low privileges (any local user) and the ability to manipulate a privileged process into writing to the passed file descriptor.

03

BranchFixed inPatch commit
5.105.10.253a407a078cd41
5.155.15.2034cafce4d6d0a
6.16.1.16933ee909702e0
6.126.12.770fc63dd91706
6.186.18.18b60b3f7a35c4
6.196.19.8b6a94eeca9c6
6.66.6.13017debf558602
mainline7.06601e13e8284