PT-2026-90470 · Linux · Linux
CVE-2026-89754
·
Published
2026-09-11
·
Updated
2026-09-11
None
No severity ratings or metrics are available. When they are, we'll update the corresponding info on the page.
In the Linux kernel, the following vulnerability has been resolved:
mm/pagewalk: fix stale walk->action escaping walk pmd range()
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 3b89863c3fa4
("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
---truncated---
Found an issue in the description? Have something to add? Feel free to write us 👾
Related Identifiers
Affected Products
Linux