From mboxrd@z Thu Jan 1 00:00:00 1970 From: AL-KERNEL To: kernel-cve@kernelcve.org Subject: [CVE-2026-89754][MODERATE 7.0] mm/pagewalk: fix stale walk->action escaping walk_pmd_range() Date: Fri, 11 Sep 2026 19:47:04 -0400 Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-AL-KERNEL-CVE: CVE-2026-89754 X-AL-KERNEL-Priority: MODERATE 7.0 X-AL-KERNEL-Severity: MODERATE 7.0 X-AL-KERNEL-Base-Severity: MODERATE X-AL-KERNEL-KPANIC: YES X-AL-KERNEL-ActionableScore: 6 X-AL-KERNEL-ActionableScore-Lower: 5 X-AL-KERNEL-Commit: 895cd4ecbb2e03d7583103c65ee5adaae126ed6d List-Id: CVE: CVE-2026-89754 Priority: MODERATE 7.0 AL-KERNEL base severity: MODERATE KPANIC flag: YES Patch: mm/pagewalk: fix stale walk->action escaping walk_pmd_range() Commit: 895cd4ecbb2e03d7583103c65ee5adaae126ed6d Upstream patch: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=895cd4ecbb2e03d7583103c65ee5adaae126ed6d Original CVE announcement: https://lore.kernel.org/linux-cve-announce/?q=CVE-2026-89754 Analysis date: Fri, 11 Sep 2026 19:47:04 -0400 ActionableScore: 6 ActionableScore lower bound: 5 Actionable bucket: Actionable Moderate / Strong Important candidate requiring manual review Manual review required: YES Summary: No one-sentence report phrase was found. ====================================================================== ABOUT THIS REPORT ====================================================================== The original Linux kernel CVE announcement for CVE-2026-89754 is available here: https://lore.kernel.org/linux-cve-announce/?q=CVE-2026-89754 The original announcement does not normally provide a security severity estimate, CVSS assessment, or enough information to determine whether the reported kernel bug represents a practically relevant security issue. This report was generated by AL-KERNEL, an AI-assisted Linux kernel vulnerability analysis system developed by Alexander Larkin. It combines an autonomous classifier with LLM-assisted technical analysis and a separate ActionableScore mechanism. The purpose of this report is to prioritize Linux kernel CVEs before manual review, identify cases that require prompt investigation, and support automatic closure of issues that are unlikely to have meaningful security impact. Published priority for this report: MODERATE 7.0 Manual review required: YES A detailed explanation of the methodology and priority rules is included at the end of this message. ====================================================================== AL-KERNEL CLASSIFICATION RESULT ====================================================================== CVE-2026-89754 MODERATE https://www.kernelcve.org/list/?q=CVE-2026-89754 CHECK WITH IMPACT FROM ORIG NN IMPORTANT Maybe valid. Check manually. Hints by AL-KERNEL: The best (paranoid) CVSS is 'AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H';*CWE-787;CWE-362;CWE-670;Other CVSS 'AV:L/AC:H/PR:L/UI:N/S:U/C:L/I:L/A:H';BEST CVSS score: '7';DESCR 'A stale walk action in the page table walker can cause walk_pmd_range or walk_pud_range to return with ACTION_AGAIN after a page table entry becomes empty during a retry. The parent walk can then repeat an already processed range and invoke callbacks more than once. In the mincore path this advances an internal byte cursor beyond its allocated object and produces a confirmed one byte slab out of bounds write. A local unprivileged process can reach the affected path through mincore while concurrent page table changes create the required race window. For the CVSS the PR:L value is used because local user code must invoke the syscall and arrange the memory activity needed to trigger the race. AC:H is used because successful triggering depends on winning a timing window during concurrent page table changes. The issue is not network reachable. Impact is at least a local denial of service through kernel memory corruption and a crash. In the paranoid case the slab out of bounds write may affect confidentiality and integrity or support local privilege escalation if the corrupted adjacent object and written byte can be controlled. YES REQUIRES MANUAL CHECK.';YES REQUIRES MANUAL CHECK; ,and ActionableScore result is Actionable Moderate / Strong Important candidate requiring manual review (with actual score 6) SKIP CVE-2026-89754 UNKNOWN SKIP The Fixes patch not applied yet, so unlikely that actual: url YES NO NO unknown MAYBE WRITE KASAN OOB RACE KERNEL_PANIC_PLUS_UAF HARDWARE LINUS KPANIC MEMORY DECREASED_TO_MODERATE7_BASED_ON_FALSEPOSCHECKOFKP - - checked ====================================================================== ACTIONABLESCORE ANALYSIS ====================================================================== ActionableScore=6 ActionableScoreLower=5 PrimitiveClass=CLASS_B RealUAF=NO HostAdminRequired=NO NamespaceScopedPrivilege=NO ImportantCandidate=YES ManualReview=REQUIRED AutoDowngradeAllowed=NO 1. ActionableScore * Raw conservative score: 5 * Conservative score: 5 * Raw paranoid score: 6 * Paranoid score: 6 * No floor or cap was applied. * Final recommended bucket: **Actionable Moderate / Strong Important candidate requiring manual review**:: 2. Signal breakdown Conservative signals: * +1 Constrained kernel overwrite. Duplicate page-walk callbacks advance the mincore cursor beyond its allocation and cause a confirmed one-byte slab out-of-bounds write. The destination and value are not shown to be arbitrarily controlled. * +1 Local unprivileged trigger. The trace demonstrates execution by UID 1000 through the ordinary mincore syscall. * +1 Local unprivileged high-control API. The attacker controls the queried virtual range and can influence concurrent page-table transitions needed for the stale ACTION_AGAIN state. * +1 Reliable kernel crash or strong DoS. KASAN detected an actual write into unrelated slab storage. A non-instrumented kernel can suffer memory corruption, an Oops, or a panic. * +1 Broad and common exposure. mincore and the generic MM page-table walker are standard kernel facilities with no special hardware or unusual optional subsystem requirement. Paranoid-only signal: * +1 Weak exploitation concern. The established primitive writes beyond an allocated kernel buffer into adjacent slab storage, and an attacker can repeatedly manipulate mappings and allocator activity. This creates plausible exploitation leverage, but controlled target selection, controlled payload, and privilege escalation are not demonstrated. Not awarded: * No Real UAF signal. No object is shown to be used after its lifetime ends. * No controlled-reclaim or arbitrary-write signal. Only a one-byte sequential OOB write is established. * No Strong LPE bonus. Corruption of a security-sensitive object or controlled adjacent allocation is not demonstrated. * No confidentiality or integrity consequence bonus. The patch establishes kernel corruption but not disclosure, protected-state modification, or privilege escalation. * No remote-reachability bonus. The path is local through mincore. * No race penalty. A race is involved, but a local fuzzer triggered it and the attacker can repeatedly drive memory activity. The evidence does not establish a narrow, one-shot, or externally uncontrollable window. * No additional Availability point. The same corruption or crash consequence is not counted twice. * No memory-layout-invariant bonus because that would duplicate the established OOB-write primitive. 3. Reachability analysis An ordinary local process can invoke mincore against its own mappings and arrange concurrent mapping changes that cause a PMD or PUD entry to become empty during an ACTION_AGAIN retry. The supplied trace confirms this path under UID 1000. No capability, namespace privilege, prior host-administrator setup, special boot option, or physical hardware is required by the demonstrated path. The vulnerability is not network-triggerable. Namespace-scoped privilege is not relevant because the syscall path is directly unprivileged. Although exact exploitation reliability is unresolved, repeated attempts are inexpensive and both the queried mappings and associated memory activity are under local-process control. Therefore the mere presence of a race does not justify a negative timing score. 4. Primitive and severity interpretation The exact primitive is a confirmed one-byte slab out-of-bounds write. A stale ACTION_AGAIN value escapes walk_pmd_range or walk_pud_range, causes a parent range to be walked again, and invokes a non-idempotent mincore callback more than once. The callback advances an internal cursor under the assumption that each entry is processed once, eventually writing beyond its allocated object. This is not a UAF, repeated release, refcount mutation, or cleanup-only stale dereference. It is direct kernel heap corruption through duplicate active callbacks. The demonstrated consequence is KASAN-detected slab corruption with realistic kernel DoS potential. The conservative interpretation treats the overwrite as constrained because only a one-byte write is shown and neither its destination object nor a useful payload is proven controllable. The paranoid interpretation recognizes unresolved exploitation leverage from repeated unprivileged triggering, attacker-influenced mapping layout, and corruption of adjacent slab storage. It does not assume arbitrary write or LPE. PrimitiveClass is CLASS_B because a real potentially exploitable corruption primitive exists, but the evidence does not establish the control required for CLASS_A. ImportantCandidate is YES because an unprivileged slab OOB write should receive Important-vs-Moderate exploitation review. AutoDowngradeAllowed is NO because automatically closing it as ordinary crash-only Moderate would discard a concrete kernel-corruption primitive with unresolved heap-placement leverage. 5. One-sentence report phrase A local unprivileged user can trigger duplicate mincore page-walk callbacks during concurrent page-table changes, causing a confirmed one-byte slab out-of-bounds write with kernel crash potential and unresolved privilege-escalation leverage. 6. Manual review recommendation MANUAL CHECK REQUIRED The confirmed unprivileged slab OOB write requires review of the written byte value, allocation sizing, heap placement control, adjacent cache objects, repeatability, and whether corruption can be converted into a stable read, write, or privilege-escalation primitive. 7. Call-site confidence Call-site confidence: high ====================================================================== UPSTREAM PATCH SUMMARY ====================================================================== Patch: mm/pagewalk: fix stale walk->action escaping walk_pmd_range() Commit: 895cd4ecbb2e03d7583103c65ee5adaae126ed6d Upstream URL: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=895cd4ecbb2e03d7583103c65ee5adaae126ed6d Commit description: If ->pmd_entry() sets walk->action = ACTION_AGAIN, the pmd_none() check is retried. The PMD entry may be cleared at the point of retry. In this case, if walk->ops->install_pte is not specified, the code continues to the next PMD entry in the range without resetting walk->action to ACTION_SUBTREE. This leaves walk->action erroneously set to ACTION_AGAIN, which is incorrect. This was incorrect but not problematic up until commit 3b89863 ("mm/pagewalk: fix race between concurrent split and refault") which updated walk_pud_range() to check for walk->action == ACTION_AGAIN upon walk_pmd_range()'s return, causing the PUD walk to be retried. In this case this results in duplicate walk callbacks being invoked, which is erroneous and will break any caller that is not idempotent with respect to this (and waste time for those which are). The result is an out-of-bounds write, triggered by a local fuzzer: [ 2.272695] ================================================================== [ 2.273471] BUG: KASAN: slab-out-of-bounds in __mincore_unmapped_range+0x14f/0x190 [ 2.274302] Write of size 1 at addr ffff888008d9b000 by task poc/106 [ 2.274966] [ 2.275154] CPU: 0 UID: 1000 PID: 106 Comm: poc Not tainted 7.2.0-rc6-00429-ga7c7074b58d2 #55 PREEMPT(lazy) [ 2.275159] Hardware name: QEMU Ubuntu 24.04 PC v2 (i440FX + PIIX, arch_caps fix, 1996), BIOS 1.16.3-debian-1.16.3-2 04/01/2014 [ 2.275164] Call Trace: [ 2.275170] [ 2.275172] dump_stack_lvl+0x53/0x70 [ 2.275200] print_report+0xd0/0x630 [ 2.275210] ? __pfx__raw_spin_lock_irqsave+0x10/0x10 [ 2.275219] ? irqentry_exit+0xd2/0x670 [ 2.275224] ? irqentry_exit+0xd2/0x670 [ 2.275226] ? __virt_addr_valid+0xef/0x1a0 [ 2.275239] ? __mincore_unmapped_range+0x14f/0x190 [ 2.275242] kasan_report+0xce/0x100 [ 2.275245] ? __mincore_unmapped_range+0x14f/0x190 [ 2.275248] __mincore_unmapped_range+0x14f/0x190 [ 2.275252] mincore_unmapped_range+0x45/0x70 [ 2.275254] walk_pgd_range+0xafc/0xfc0 [ 2.275261] ? __pfx_walk_pgd_range+0x10/0x10 [ 2.275264] ? __update_load_avg_se+0x3d1/0x670 [ 2.275275] __walk_page_range+0xc0/0x310 [ 2.275278] ? __pfx_find_vma+0x10/0x10 [ 2.275281] ? finish_task_switch.isra.0+0x16d/0x4f0 [ 2.275290] walk_page_range_mm_unsafe+0x26f/0x3a0 [ 2.275293] ? __pfx_mtree_load+0x10/0x10 [ 2.275298] ? __pfx_walk_page_range_mm_unsafe+0x10/0x10 [ 2.275302] ? __free_frozen_pages+0x54d/0x7e0 [ 2.275308] __do_sys_mincore+0x132/0x380 [ 2.275311] do_syscall_64+0xf9/0x540 [ 2.275316] entry_SYSCALL_64_after_hwframe+0x77/0x7f [ 2.275322] RIP: 0033:0x422ccd [ 2.275326] Code: b3 66 2e 0f 1f 84 00 00 00 00 00 66 90 f3 0f 1e fa 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 b8 ff ff ff f7 d8 64 89 01 48 [ 2.275329] RSP: 002b:00007fffffffec18 EFLAGS: 00000287 ORIG_RAX: 000000000000001b [ 2.275337] RAX: ffffffffffffffda RBX: 0000000000000066 RCX: 0000000000422ccd [ 2.275339] RDX: 00000000004d0940 RSI: 0000000001000000 RDI: 00007ffff4000000 [ 2.275340] RBP: 00000000004d0940 R08: 0000000000000100 R09: 0000000000000100 [ 2.275342] R10: 0000000000000100 R11: 0000000000000287 R12: 20c49ba5e353f7cf [ 2.275343] R13: 00000000004990d3 R14: 0000000000000000 R15: 0000000000000001 [ 2.275346] [ 2.275347] [ 2.296904] The buggy address belongs to the object at ffff888008d9b000 [ 2.296904] which belongs to the cache sigqueue of size 80 [ 2.298151] The buggy address is located 0 bytes inside of [ 2.298151] allocated 80-byte region [ffff888008d9b000, ffff888008d9b050) [ 2.299408] [ 2.299601] The buggy address belongs to the physical page: [ 2.300191] page: refcount:0 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x8d9b [ 2.301001] flags: 0x100000000000000(node=0|zone=1) [ 2.301535] page_type: f5(slab) [ 2.301884] raw: 0100000000000000 ffff888107e46780 dead000000000122 0000000000000000 [ 2.302687] raw: 0000000000000000 0000000800240024 00000000f5000000 0000000000000000 [ 2.303489] page dumped because: kasan: bad access detected [ 2.304092] [ 2.304276] Memory state around the buggy address: [ 2.304801] ffff888008d9af00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 2.305567] ffff888008d9af80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 2.306340] >ffff888008d9b000: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc [ 2.307115] ^ [Commit description truncated; see the upstream URL below] Changed files: mm/pagewalk.c Diff excerpt: Not included in this email. See the upstream URL for the full patch. Full patch: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=895cd4ecbb2e03d7583103c65ee5adaae126ed6d ====================================================================== DETAILED REPORT METHODOLOGY ====================================================================== The original Linux kernel CVE announcement for CVE-2026-89754 can be found here: https://lore.kernel.org/linux-cve-announce/?q=CVE-2026-89754 The original CVE announcement normally does not include a security-level estimate. In particular, it may not contain a CVSS assessment, an impact level, or enough information to determine whether the reported bug is a practically relevant security issue. One purpose of this parallel CVE list is to provide that missing technical and prioritization information. The original goal of the AL-KERNEL project was to prioritize Linux kernel CVE analysis automatically before manual review. The system can also help identify non-security issues that may be suitable for automatic closure. This report was generated by AL-KERNEL, an AI-assisted Linux kernel vulnerability analysis system developed by Alexander Larkin. The first analysis stage combines an autonomous classifier with additional LLM-based analysis. The autonomous classifier runs locally on a CPU and is based on a backpropagation neural network. Together, these mechanisms produce a technical vulnerability description, identify likely weakness types, estimate CVSS severity, and provide input for ActionableScore. Two CVSS estimates are retained because incomplete kernel vulnerability information often permits more than one defensible interpretation: Conservative CVSS vector: AV:L/AC:H/PR:L/UI:N/S:U/C:L/I:L/A:H The Best / paranoid CVSS vector: AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H The Best / paranoid CVSS score: 7 The conservative vector represents a lower-impact interpretation. The Best/paranoid vector intentionally represents a plausible upper-bound interpretation and should not automatically be treated as demonstrated real-world impact. CVSS may also need to be adjusted for a particular Linux deployment, because actual reachability, privileges, enabled kernel configuration, hardware, namespaces, exposed device nodes, and other environmental conditions can differ significantly between systems. A separate ActionableScore mechanism evaluates practical remediation urgency. Its analysis may include reachability, attack prerequisites, subsystem exposure, memory-corruption characteristics, denial-of-service reliability, and possible confidentiality, integrity, or privilege-escalation impact. Conservative ActionableScore: 5 Paranoid ActionableScore: 6 The final base severity is taken directly from the second tab-separated field of the AL-KERNEL classification result. ActionableScore does not replace or independently override that final AL-KERNEL decision, and if ActionableScore adjusted impact level of ALKERNEL, then you would see self-readable flags above like INCREASED_TO_HIGH_BASED_ON_ACTIONABLESCOREHIGHEREQTHAN7. For an AL-KERNEL result of MODERATE, this report uses the following additional presentation split: ActionableScore below 5 -> MODERATE REGULAR ActionableScore 5 or more -> MODERATE 7.0 The distinction between MODERATE REGULAR and MODERATE 7.0 makes it possible to identify Moderate issues that should receive manual analysis and fixes before lower-priority MODERATE REGULAR issues. In many cases, MODERATE REGULAR fixes may wait for a later rebase or routine update. There is one override in which MODERATE REGULAR becomes MODERATE 7.0 even when the ActionableScore is below 5. When the AL-KERNEL result contains the KPANIC flag, a MODERATE result is always presented as MODERATE 7.0. The KPANIC flag selected with few regexps without usage of AI at all, so it helps to detect cases when Kernel Crash happens and similar (to filter False-Negative results from the LLM usage). KPANIC indicates that a reliable kernel crash, kernel panic, or similarly serious kernel availability impact was identified by the classification workflow. AL-KERNEL base severity for this report: MODERATE KPANIC detected for this report: YES Published priority for this report (same as in Subject): MODERATE 7.0 These results are intended to support engineering triage. They are machine-generated estimates, and cases marked for manual review should be validated by a human security engineer before final disposition. For more info read docs linked from here: https://kernelcve.org/ (and you can submit you own patch there to generate such a report for non-existant CVE-id yet). Note that in many cases this AI tool selects higher severity, than real is (means you can expect Importants instead of Moderate 7.0 or Moderates 7.0 instead of regular Moderates). If you see such cases, please use reply email interface to add additional manual analyses info to this particular CVE. And please, please, let me know when you see Lows instead of Importants or Important instead of Low (because particular for such cases I need to tune this AI tool to make it better for this one and next similar). My contact email for such notifications is alexanjelausa@gmail.com (and both send reply to CVE record itself too and see "reply" button below for howto reply).