Re: [PATCH 0/2] mm: fix UAF caused by race between ptdump and vmap pgtable freeing
From: Lorenzo Stoakes
Date: Sun Jul 12 2026 - 04:47:13 EST
On Sun, Jul 12, 2026 at 12:50:08PM +0530, Dev Jain wrote:
> Will Deacon had pushed back on a similar approach:
> https://lore.kernel.org/all/20250530123527.GA30463@willie-the-truck/
>
> Although now when I read back that thread, it feels more so like my
> incompetency to convince :) because:
No haha not so, I think more like this stuff is fiddly.
>
> 1. I don't think this pmd_free_pte_page() path is a hot path at all
Right, and we don't actually alter that path anyway
>
> 2. We are doing a try lock which is almost guaranteed to succeed,
> so it's not like we are losing out on block mappings
Also it's specifically only on when vmap tries to make a mapping huge, and
this path is being inconsistent with a convention that already existed - if
you manipulate kernel page table mappings that can interact with other page
table walkers, you have to take the init_mm mmap lock.
>
> 3. Any overhead from the try lock will get dominated by the pgtable
> page free/TLB flush
Yup.
>
> I guess you did not take the RCU approach because that would put code
> into the generic kernel pgtable freeing path.
Well a number of reasons:
* firstly yes it makes the code path always RCU only to suit a specific
debug user as you say :)
* Importantly - we risk genuine RCU stall issues, because the ptdump then
has to be RCU too over vast ranges.
To work around that you have to shard the ptdump walk, make an assumption
all callbacks are RCU-safe, and that the sharding suffices to avoid these
stalls.
It's a ton of complexity and assumptions to account for... vmalloc doing
the wrong thing.
* It is an established precedent that we mmap lock init_mm for kernel page
table walking as per mm/pagewalk.c. It'd require significant rework there
and would disallow any future walkers like this if we were to require
RCU.
* The mmap lock approach is simple, safe, and as you say is only actually
required in code paths that manipulate page tables and thus are already
not hotpaths.
* If there's future work to free vmalloc page tables upon vunmap()
(currently it does not), we have a stable, established basis for doing so
that again puts the weight of the work on the operation being performed
rather than anything else.
>
> I liked the RCU approach because I hate the fact that ptdump takes
> an mmap_write_lock when it is literally only reading the pgtables.
Well you have to do that for the userland side, because there could be a
concurrent downgraded mmap read lock during an munmap, and the same goes
for non-VMA kernel ranges too, so it would have to keep doing that
regardless.
> But your approach is simpler and fixes the problem at the particular spot
> and not hammers the fix into a generic path. So overall, ACK.
Thanks!
>
>
> > Lorenzo Stoakes (2):
> > mm/vmalloc: acquire init_mm read lock on huge vmap promotion
> > Revert "arm64: Enable vmalloc-huge with ptdump"
> >
> > arch/arm64/include/asm/ptdump.h | 2 --
> > arch/arm64/mm/mmu.c | 43 ++++-------------------------------------
> > arch/arm64/mm/ptdump.c | 11 ++---------
> > include/linux/mmap_lock.h | 1 +
> > mm/pagewalk.c | 22 +++++++++++----------
> > mm/vmalloc.c | 41 ++++++++++++++++++++++++++++++---------
> > 6 files changed, 51 insertions(+), 69 deletions(-)
> > ---
> > base-commit: a635d6748234582ea287c5ffeae28b9b23f91c7e
> > change-id: 20260710-series-vmap-race-fix-2a4cac988938
> >
> > Cheers,
>
Cheers, Lorenzo