* [CVE-2026-89754][MODERATE 7.0] mm/pagewalk: fix stale walk->action escaping walk_pmd_range()
@ 2026-09-11 23:47 21% AL-KERNEL
0 siblings, 0 replies; 1+ results
From: AL-KERNEL @ 2026-09-11 23:47 UTC (permalink / raw)
To: kernel-cve
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] <TASK>
[ 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] </TASK>
[ 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 [email protected] (and both
send reply to CVE record itself too and see "reply" button below for howto reply).
^ permalink raw reply [relevance 21%]
Results 1-1 of 1 | reverse | sort options + mbox downloads above
-- links below jump to the message on this page --
2026-09-11 23:47 21% [CVE-2026-89754][MODERATE 7.0] mm/pagewalk: fix stale walk->action escaping walk_pmd_range() AL-KERNEL
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox